Điều gì cho phép một số ngôn ngữ để làm điều này và những ngôn ngữ khác không? Tại sao không giữ một hệ thống thống nhất thêm dấu chấm phẩy vào cuối?
Robert đã đưa ra một câu trả lời hay về Swift, tôi sẽ cố gắng thêm một chút về phân tích cú pháp nói chung và lý do nên sử dụng hay không sử dụng dấu chấm phẩy.
Khi bạn biên dịch chương trình, có một số bước trước khi tệp nguồn của bạn được chuyển thành mã thực thi, một trong những bước đầu tiên là đọc và phân tích cú pháp . Trong quá trình phân tích cú pháp, mã của bạn được chuyển đổi từ một chuỗi các ký tự thành một biểu diễn có cấu trúc theo ngữ pháp của ngôn ngữ. Đối với điều này, điều cần thiết là các yếu tố cấu thành mã của bạn (biến, hằng, khai báo, v.v.) bằng cách nào đó được xác định và tách biệt. Khi bạn khai báo như:
int someNumber = 0;
Đó chỉ là một chuỗi các ký tự mà bằng cách nào đó cần phải được chuyển sang khái niệm "tạo ra một" thứ "được gọi là someNumber
loại int
và gán 0
cho nó" .
Điều này đòi hỏi xác định chính xác nơi tuyên bố bắt đầu và kết thúc. Hãy tưởng tượng nếu bạn có điều này:
int someNumber = 0;
int otherNumber = 1;
Bạn sẽ cần phải biết rằng đó là hai tuyên bố khác nhau. Các ;
ngôn ngữ giống như C được sử dụng cho điều đó, vì vậy trình phân tích cú pháp đọc các ký tự cho đến khi tìm thấy một ký tự và cố gắng hiểu những gì vừa đọc dưới dạng một câu lệnh. Điều này cho phép, như Robert nói, có một số câu trong cùng một dòng, như:
int someNumber = 0; int otherNumber = 1;
Mà có tác dụng chính xác như viết chúng thành hai dòng.
Trong các ngôn ngữ khác, như Python , bạn sẽ đặt mỗi câu lệnh vào một dòng khác nhau.
x = 3
if x < 10:
print 'x smaller than 10'
else:
print 'x is bigger than 10 or equal'
Vì vậy, không cần phải thêm một ;
, vì chính ngôn ngữ ngăn bạn thêm các câu trong cùng một dòng!
Tuy nhiên, các ngôn ngữ khác, như LISP hoặc Scheme , có cách phân nhóm các câu lệnh rất khác nhau (ok, chúng không thực sự là câu lệnh, nhưng bây giờ hãy bỏ qua điều đó). Vì vậy, bạn chỉ có dấu ngoặc đơn cho tất cả mọi thứ:
(define (do-stuff x)
(begin
(display (format "value: ~a" x))
x))
Một lần nữa, bạn không cần ;
chỉ vì bạn sử dụng cùng một biểu tượng ( )
, (
) cho những điều mà các ngôn ngữ khác là {
, }
, :
vv Một người chỉ biết cú pháp Lisp có thể hỏi bạn: Tại sao bạn cần ;
ở phần cuối của báo cáo của bạn ?
Chỉ cần thêm một ví dụ lạ: OCaml không chỉ có dấu chấm phẩy ở cuối câu ... nó có hai!
let rec fact x =
if x <= 1 then 1 else x * fact (x - 1);;
Tại sao? Tôi không biết. :)
Các ngôn ngữ khác nhau được thiết kế với các mục đích khác nhau và triết lý khác nhau. Nếu tất cả các ngôn ngữ chia sẻ cùng một cú pháp và quy ước, có lẽ chúng chỉ cho phép bạn thực hiện những điều tương tự theo cùng một cách.