Có một lý do mà một dấu chấm phẩy được chọn làm dấu kết thúc dòng thay vì một biểu tượng khác?
Tôi muốn biết lịch sử đằng sau quyết định này và hy vọng câu trả lời sẽ dẫn đến những hiểu biết có thể ảnh hưởng đến các quyết định trong tương lai.
Có một lý do mà một dấu chấm phẩy được chọn làm dấu kết thúc dòng thay vì một biểu tượng khác?
Tôi muốn biết lịch sử đằng sau quyết định này và hy vọng câu trả lời sẽ dẫn đến những hiểu biết có thể ảnh hưởng đến các quyết định trong tương lai.
Câu trả lời:
Trong tiếng Anh, dấu chấm phẩy được sử dụng để phân tách các mục trong danh sách các câu, ví dụ
Cô thấy ba người đàn ông: Jamie, đến từ New Zealand; John, con trai của người bán sữa; và George, một loại đàn ông gầy gò.
Khi lập trình, bạn đang tách một số câu lệnh và sử dụng dừng hoàn toàn có thể dễ bị nhầm lẫn cho dấu thập phân. Sử dụng dấu chấm phẩy cung cấp một phương pháp phân tích dễ dàng để phân tách các câu lệnh chương trình riêng lẻ trong khi vẫn gần với dấu câu tiếng Anh thông thường.
Chỉnh sửa để thêm
Trong những ngày đầu khi bộ nhớ đắt tiền, xử lý chậm và các ngôn ngữ lập trình đầu tiên được phát minh, cần phải chia chương trình thành các câu lệnh riêng để xử lý. Một số ngôn ngữ yêu cầu rằng mỗi câu lệnh được đặt trên một dòng để trả về vận chuyển có thể đóng vai trò là dấu phân cách câu lệnh. Các ngôn ngữ khác cho phép định dạng văn bản miễn phí hơn đối với bố cục văn bản và do đó yêu cầu một ký tự phân cách cụ thể. Ký tự này được chọn là dấu chấm phẩy, rất có thể là do sự giống nhau của nó trong ngôn ngữ tiếng Anh (đây phải là một giả định; lúc đó tôi không ở đó) và vì nó không tạo ra xung đột với các dấu câu khác nhãn hiệu và ký hiệu được yêu cầu cho mục đích toán học hoặc cú pháp khác.
Chỉnh sửa lại
Sự cần thiết cho một số ký tự terminator quay trở lại các yêu cầu để phân tích văn bản ngôn ngữ. Các trình biên dịch ban đầu được viết bằng ngôn ngữ lắp ráp hoặc, trong một số trường hợp, trực tiếp bằng các hướng dẫn máy nhị phân thủ công. Có một ký tự đặc biệt xác định phần cuối của câu lệnh và phân định đoạn văn bản đang được xử lý làm cho việc xử lý dễ dàng hơn nhiều. Như tôi đã nói ở trên, các ngôn ngữ khác đã sử dụng dấu ngoặc hoặc dấu ngoặc. Các ngôn ngữ Algol, Pascal, Ada, BCPL, B, C, PL / M và các ngôn ngữ khác xảy ra để sử dụng dấu chấm phẩy. Về việc ai là người đầu tiên sử dụng nhân vật đặc biệt này, tôi không quay lại đủ xa trong lịch sử để nhớ. Sự lựa chọn và áp dụng của nó làm cho ý nghĩa hoàn hảo như
Như một nhận xét cuối cùng, tôi nghĩ rằng đã có nhiều thời gian dành cho những câu trả lời và nhận xét này hơn là dành cho việc quyết định sử dụng dấu chấm phẩy để kết thúc một tuyên bố khi thiết kế ngôn ngữ đầu tiên sử dụng nó theo cách này.
Nhiều ngôn ngữ sử dụng cú pháp được mô hình hóa sau C (được mô hình hóa sau B - cảm ơn @Crollster). Như có thể thấy trong các bình luận, có một chuỗi dài các ngôn ngữ như vậy ... B được lấy cảm hứng từ PL / I, trước đó là ALGOL trong việc sử dụng ;
như một dấu phân cách.
Vì trong C, dấu kết thúc câu lệnh là ;
, các ngôn ngữ này tuân theo.
Về lý do tại sao nó được chọn làm dấu kết thúc câu lệnh trong C - có thể do sử dụng tiếng Anh "để biểu thị các câu lệnh phụ thuộc lẫn nhau" .
C cũng được phát minh trên PDP-11 tại thời điểm có bộ nhớ hạn chế cho các bộ ký tự, vì vậy các nhà phát minh ngôn ngữ phải làm việc trong những hạn chế này.
FORTRAN đã sử dụng trở lại vận chuyển để phân định các tuyên bố. Thời gian sử dụng COBOL. LISP đã không sử dụng bất cứ điều gì, dựa vào dấu ngoặc đơn cho mọi thứ. ALGOL là ngôn ngữ đầu tiên sử dụng dấu chấm phẩy để phân tách các câu lệnh. PASCAL theo sau sự dẫn dắt của ALGOL, sử dụng dấu chấm phẩy để phân tách các câu lệnh.
PL / Tôi đã sử dụng dấu chấm phẩy để chấm dứt các báo cáo. Có một sự khác biệt, và nó dễ dàng được nhìn thấy trong PASCAL. Ada đã theo PL / I dẫn đầu về một mặt hàng này, thay vì ALGOL.
Dấu chấm phẩy như dấu phân tách câu lệnh hoặc dấu kết thúc nhanh chóng được cộng đồng khoa học máy tính chấp nhận như một ký hiệu hữu ích, và theo như tôi biết, mọi ngôn ngữ có cấu trúc khối tiếp theo đều dẫn theo ALGOL và sử dụng dấu chấm phẩy để phân tách hoặc chấm dứt các câu lệnh.
Tôi đã được thông báo từ nhiều năm trước rằng BCPL đã sử dụng cả dấu chấm phẩy VÀ trả lại vận chuyển làm dấu phân tách / dấu chấm dứt câu lệnh, nhưng tôi không bao giờ sử dụng ngôn ngữ này và không thể xác minh điều này. Tại một số điểm, việc sử dụng trả lại vận chuyển để tách biệt hoặc chấm dứt tuyên bố đã bị loại bỏ khỏi hậu duệ BCPL. BCPL begat B, B begat C, C begat C ++, Java, D và một loạt các thứ ít được suy nghĩ kỹ hơn so với PASCAL và Ada.
Tại sao không phải là bất kỳ biểu tượng khác?
Một vài ngôn ngữ đã sử dụng các ký hiệu khác - các phiên bản cũ của BASIC đã sử dụng dấu hai chấm thay thế, ví dụ.
Bỏ qua một vài ngoại lệ, tuy nhiên, tôi nghĩ có hai lý do chính. Đầu tiên là bạn chỉ đơn giản là tìm kiếm một cái gì đó rõ ràng. Trong một trình phân tích cú pháp thông thường, nếu bạn gặp phải một lỗi đủ nghiêm trọng mà bạn không thể tiếp tục phân tích cú pháp câu lệnh hiện tại, bạn thường cố gắng đưa trình phân tích cú pháp trở lại đồng bộ hóa bằng cách bỏ qua trình kết thúc câu lệnh và khởi động lại trình phân tích cú pháp từ bắt đầu của tuyên bố tiếp theo. Vì thế, bạn muốn một cái gì đó thường không xảy ra ở bất kỳ nơi nào khác trong mã và dấu chấm phẩy tình cờ là một biểu tượng với rất ít ý nghĩa khác được đính kèm, vì vậy thật dễ dàng để dành nó cho mục đích này.
Lý do thứ hai có phần giống nhau, nhưng nhắm nhiều hơn vào những người đọc / sử dụng mã. Một lần nữa, nó trở lại với thực tế là biểu tượng thực tế bạn sử dụng không quan trọng lắm. Có một lợi thế đáng kể về khả năng đọc để đạt được từ việc sử dụng biểu tượng mà người đọc của bạn đã quen với việc xem cho một mục đích cụ thể, khi và nếu có thể. Điều đó không có nghĩa là C là một cú pháp hoàn hảo và mọi thứ khác nên tuân theo nó một cách mù quáng, nhưng điều đó có nghĩa là đủ người quen thuộc với kiểu cú pháp đó mà một ngôn ngữ tương tự mơ hồ thu được rất nhiều (và mất rất ít) bằng cách làm theo gần như cùng một cú pháp nơi nó có thể.
Tôi lưu ý rằng điều này giống như thiết kế hầu hết các chương trình khác. Nếu tôi viết một chương trình sử dụng một số loại cửa sổ, tôi sẽ cố gắng chỉ sử dụng các tính năng gốc của (các) nền tảng đích. Nhiều quyết định thể hiện phần lớn sẽ tùy ý và có thể được thực hiện khác đi mà không mất bất kỳ chức năng lớn nào - nhưng đồng thời, việc thay đổi chúng mà không đạt được đáng kể về chức năng chỉ khiến người dùng bối rối mà không hoàn thành bất kỳ điều gì hữu ích. Các nguyên tắc cơ bản tương tự áp dụng cho "những gì nên chấm dứt (hoặc tách biệt) các câu trong một ngôn ngữ?" như "thanh cuộn trông như thế nào" hoặc "điều khiển cây nên hoạt động như thế nào?" Trong tất cả các trường hợp này, quyết định chủ yếu là tùy ý và tính đồng nhất mang lại lợi ích đáng kể trong chính nó.
Tôi nói thêm rằng điều tương tự cũng xảy ra ở nhiều ngôn ngữ, theo cách mà hầu hết chúng ta đã quá quen thuộc trước khi lập trình mà ít người nghĩ về nó. Tại sao mọi người sử dụng "+" để biểu thị phép cộng hoặc "-" để biểu thị phép trừ? Bởi vì hình dạng của biểu tượng không quan trọng lắm, nhưng mọi người đồng ý áp dụng cùng một ý nghĩa cho mỗi biểu tượng rất quan trọng.
Dấu chấm phẩy ban đầu được đề xuất trong Algol 60 như một dấu phân tách câu lệnh , không phải là dấu kết thúc.
Trước Algol 60, ngôn ngữ lập trình cấp cao duy nhất tồn tại là Fortran, yêu cầu mỗi câu lệnh phải nằm trên một dòng riêng biệt. Các câu lệnh trải dài trên nhiều dòng, như các vòng lặp do, được coi là một số lẻ và chúng được coi là "khối lệnh".
Các nhà thiết kế của Algol 60 nhận ra rằng các câu lệnh cần một cấu trúc phân cấp (if-then-other, do-loop, case statement, v.v.) và chúng có thể được lồng vào nhau. Vì vậy, ý tưởng của mỗi tuyên bố ngồi trên một dòng riêng biệt không còn ý nghĩa gì nữa. Thành phần tuần tự của các câu lệnh có dạng S1; S2; ...; Sn trong tùy chọn kèm theo bắt đầu - cuối ngoặc được gọi là báo cáo hợp chất , và phù hợp với cấu trúc phân cấp các báo cáo dự kiến của Algol 60. Vì vậy, ở đây, các dấu chấm phẩy rõ ràng là một tuyên bố tách , không phải là một terminator.
Điều này đã dẫn đến các vấn đề trong thực tế. Algol 60 cũng có một "tuyên bố trống rỗng" được biểu thị bằng cách không viết gì. Vì vậy, người ta có thể viết " bắt đầu S1; kết thúc " trong đó dấu chấm phẩy xuất hiện như thể nó đang kết thúc S1. Nhưng trình biên dịch Algol 60 thực sự coi nó như một dấu phân cách giữa S1 và một câu lệnh trống vô hình theo sau nó. Những sự tinh tế này là một chút cho các lập trình viên thực tế. Đã được sử dụng cho các ngôn ngữ định hướng dòng như Hội và Fortran, họ thực sự nghĩ về dấu chấm phẩy như một dấu chấm hết cho các câu lệnh. Khi các chương trình được viết ra, thông thường dấu chấm phẩy được đặt ở cuối các câu lệnh, như vậy:
a [i]: = 0; i: = i + 1
và dấu chấm phẩy thực sự trông giống như một dấu chấm hết cho câu lệnh đầu tiên. Nếu các lập trình viên coi dấu chấm phẩy là dấu kết thúc, thì câu lệnh như thế này sẽ gây ra lỗi cú pháp:
nếu tôi> 0 thì a [i]: = 0; khác a [i]: = 1;
bởi vì dấu chấm phẩy chấm dứt "nếu" và, do đó, "cái khác" trở nên lơ lửng. Các lập trình viên đã hoàn toàn bối rối.
Vì vậy, PL / I, vốn là người kế thừa của IBM cho Fortran định hướng dòng, đã quyết định biến dấu chấm phẩy thành dấu chấm dứt câu lệnh thay vì dấu phân cách. Các lập trình viên hài lòng với lựa chọn đó. Phần lớn các ngôn ngữ lập trình theo sau phù hợp. (Pascal chống lại xu hướng, nhưng người kế nhiệm Ada đã từ bỏ nó.)
[Ghi chú thêm: Bài viết Wikipedia về so sánh ngôn ngữ lập trình có một bảng hay tóm tắt cách xử lý dấu chấm phẩy trong các ngôn ngữ lập trình khác nhau.]
Đây là công việc đoán khá thuần túy, nhưng nhìn vào bàn phím QWERTY tiêu chuẩn bị giới hạn ở các giá trị ASCII, các ký tự tự nhiên để kết thúc / phân tách sẽ là.!?,:; và vận chuyển trở lại. trong số đó!?: nên bị loại ngay lập tức vì lấy nhiều khóa và chấm dứt câu lệnh sẽ là một điều rất phổ biến. Các khoảng thời gian sẽ bị loại vì chúng dễ bị nhầm lẫn với các dấu thập phân khiến chúng trở nên phức tạp không cần thiết để trở thành một đầu cuối trong không gian hạn chế của các máy tính ban đầu. lợi nhuận vận chuyển sẽ bị loại sau khi các dòng mã có tiềm năng dài hơn những gì có thể được hiển thị trên một dòng trên màn hình, do đó sẽ khó đọc chương trình hơn khi các dòng phải được cuộn theo chiều ngang, hoặc yêu cầu các ký tự bổ sung để tạo phần tiếp theo trên dòng tiếp theo, điều này lại làm tăng thêm độ phức tạp. lá này, và; như các tùy chọn, trong số đó, được sử dụng thường xuyên hơn bằng văn bản so với; Vì vậy, dấu chấm phẩy được chọn vì nó dễ gõ hơn, ít gây nhầm lẫn hơn vì nó thêm ý nghĩa cho một ký tự có ý nghĩa hạn chế và ít phức tạp hơn vì các trường hợp đặc biệt không thực sự tồn tại với việc sử dụng nó.
Dấu chấm phẩy được chọn vì đó là nhân vật tốt nhất dựa trên sự lười biếng và đơn giản.
Nó phần lớn là một sự lựa chọn tùy ý. Một số ngôn ngữ đã đưa ra lựa chọn khác. COBOL chấm dứt các câu lệnh với .
ký tự. FORTRAN, BASIC và Python thường chấm dứt các câu lệnh với dòng mới (với cú pháp đặc biệt cho các câu lệnh nhiều dòng). Và Lisp đánh dấu các tuyên bố của nó với dấu ngoặc đơn.
Lý do chính ;
rất phổ biến như là một dấu tách / dấu kết thúc câu lệnh là vì hầu hết các ngôn ngữ phổ biến ngày nay đều dựa trên ALGOL , sử dụng quy ước đó.
thay vì một biểu tượng khác?
Bạn có thể chọn biểu tượng nào khác?
Các ký tự ASCII # $ @ [] ^ _ `{|} ~ không luôn xuất hiện trong các bảng mã ký tự đầu như ISO 646 .
Các ký tự ()*+-/<=>
thường được sử dụng như các toán tử toán học và sẽ tạo ra sự mơ hồ phân tích cú pháp nếu được sử dụng như các dấu kết thúc câu lệnh.
product = a * b * // If '*' were a statement terminator,
c * d * // Are there two factors, or four?
Các vấn đề tương tự sẽ áp dụng cho '
và "
, thường được sử dụng như các dấu phân cách chuỗi; ,
, thường được sử dụng để phân tách các đối số hàm và .
thường được sử dụng làm dấu thập phân (hoặc là dấu phân cách trong các cấu trúc như some_struct.some_field
).
Mà bỏ đi !%&:;?
.
Lựa chọn !
hoặc ?
có thể sẽ không gây ra những khó khăn kỹ thuật, nhưng ý nghĩa tiếng Anh của chúng sẽ mang lại tâm trạng sai cho chương trình.
print(x)? # Yes, you should.
# It's an IMPERATIVE language; stop questioning my commands.
print(x)! # OK! You don't have to shout!
Đây &
sẽ là một lựa chọn hợp lý hơn như một dấu phân cách câu lệnh (không phải dấu kết thúc), bởi vì
do_thing_a() &
do_thing_b()
có thể được đọc như một lệnh để làm điều A và sau đó làm điều B. Nhưng hầu hết các ngôn ngữ với &
toán tử sử dụng nó như một logic hoặc bitwise VÀ thay vào đó.
Các %
dấu hiệu có thể gây ra sự nhầm lẫn trong những câu như interest_rate = 2.99%
(mà sẽ đặt biến để 2.99
thay cho dự kiến 0.0299
). Tất nhiên, ý nghĩa toán học nổi tiếng của %
việc không ngăn C sử dụng nó làm toán tử còn lại.
Vì vậy mà lá :
và ;
.
:
là một lựa chọn hợp lý và thực sự được sử dụng làm dấu tách câu lệnh nội dòng trong hầu hết các phương ngữ của BASIC.
Nhưng ;
có ngữ pháp tiếng Anh về phía nó; nó có thể được sử dụng để tách các mệnh đề trong một câu.
Thay vì cố gắng trả lời câu hỏi tiêu đề của bạn, tôi nghĩ tốt hơn là tập trung vào câu hỏi ngầm của bạn:
Tôi muốn biết lịch sử đằng sau quyết định này và hy vọng câu trả lời sẽ dẫn đến những hiểu biết có thể ảnh hưởng đến các quyết định trong tương lai trong việc thiết kế và thực hiện các ngôn ngữ lập trình.
Nếu bạn muốn tìm hiểu về thiết kế ngôn ngữ lập trình và lịch sử triển khai và hiểu rõ hơn về quy trình, thì quá trình của Lịch sử Hội nghị Ngôn ngữ lập trình là một nơi rất tốt để bắt đầu. (Tôi nghĩ rằng bạn sẽ cần một thành viên ACM để có thể truy cập các thủ tục tố tụng.)
Tại sao các câu trong nhiều ngôn ngữ lập trình bị chấm dứt bởi dấu chấm phẩy? Có một lý do mà một dấu chấm phẩy được chọn làm dấu kết thúc dòng thay vì một biểu tượng khác?
Lấy câu hỏi tiêu đề của bạn làm câu hỏi mẫu mà bạn có thể muốn trả lời bằng cách đọc các thủ tục HOPL, tôi muốn đưa ra điểm sau: những người thiết kế ngôn ngữ lập trình mới thường làm như vậy bởi vì họ coi những ngôn ngữ mà họ biết là hỏng / thiếu bằng cách nào đó. Ngôn ngữ mới của họ, một mặt, được thiết kế để khắc phục sự thiếu hụt này. Mặt khác, các nhà thiết kế ngôn ngữ cũng sẽ sao chép các yếu tố thiết kế từ các ngôn ngữ khác mà họ cho là tốt hoặc đơn giản là họ không thay đổi những yếu tố mà họ không gặp phải vấn đề.
Đặc biệt là phần cuối cùng rất quan trọng: thay vì cố gắng tìm ra ngôn ngữ lập trình nào là ngôn ngữ đầu tiên sử dụng dấu chấm phẩy làm dấu chấm dứt và tại sao nhiều ngôn ngữ lập trình khác sao chép, bạn có thể sẽ tìm hiểu thêm bằng cách xem các ngôn ngữ không sao chép nó Ví dụ, trong khi Smalltalk lấy rất nhiều cảm hứng từ Simula, thì nó đã khôngsao chép cú pháp của nó và đặc biệt là việc sử dụng dấu chấm phẩy của nó như là dấu kết thúc câu lệnh. Nó đã thay đổi các đầu mối (dấu phân cách thực sự) thành một điểm dừng hoàn toàn và sử dụng dấu chấm phẩy cho một thứ khác. Ngược lại, ngôn ngữ đầu tiên từng sử dụng dấu chấm phẩy làm dấu chấm dứt câu lệnh có thể có lý do để thay đổi ngôn ngữ này từ ngôn ngữ được sử dụng trong các ngôn ngữ đi trước nó. Cũng có thể đó là ngôn ngữ đầu tiên giới thiệu toàn bộ khái niệm về một dấu kết thúc câu lệnh (hoặc làm như vậy độc lập với các ngôn ngữ khác) và dấu chấm phẩy được sử dụng vì một số lý do mà giờ đã mất theo thời gian. . điểm, Tôi nghĩ bạn sẽ học được nhiều hơn bằng cách xem tại sao các nhà thiết kế ngôn ngữ thay đổi mọi thứ thay vì tại sao họ sao chép / giữ chúng. Khi mọi người thay đổi những thứ họ thường muốn hoặc phải giải thích về sự thay đổi, trong khi họ không làm như vậy khi sao chép hoặc giữ mọi thứ giống nhau bởi vì tại sao chúng ta sẽ thay đổi nó? đó chỉ là cách nó được thực hiện!
Đó là về tầm nhìn.
Dấu phân cách tuyên bố ban đầu là '.' như trong COBOL và dòng mới, vận chuyển trở lại trong FORTRAN.
CR đã chứng minh hạn chế ở chỗ nó gây khó khăn cho việc đưa ra một tuyên bố qua nhiều dòng.
Dừng hoàn toàn gây ra một vấn đề thú vị hơn. Khi bạn đọc văn bản tiếng Anh, não của bạn xử lý các điểm dừng hoàn toàn ở cấp độ cao, bạn có ý thức rằng một câu đã kết thúc và bạn có thể tạm dừng để thở nhưng bạn không thực sự chú ý đến. Điều đó báo hiệu nó. Ngoài ra trong nhiều phông chữ '.' là ký tự nhỏ nhất có thể đôi khi được hiển thị dưới dạng một pixel. Thiếu hoặc thêm thời gian trở thành nguyên nhân phổ biến nhất gây ra lỗi trong các chương trình COBOL.
Vì vậy, học hỏi từ những sai lầm ban đầu ALGOL chọn một bộ kết thúc cụ thể cho phép một câu lệnh truyền qua nhiều dòng và chọn một câu có thể nhìn thấy và dễ dàng nhận thấy bởi các độc giả của con người. Dấu chấm phẩy vừa lớn vừa đủ khác thường trong tiếng Anh thông thường không được xử lý trong tiềm thức.
Theo sự hiểu biết của tôi, nó đã được chọn bởi vì cần có một bộ kết thúc câu lệnh rõ ràng khác với dòng trả về / dòng mới. Quay trở lại thời của màn hình 80 cột, thực sự có một dòng mã bao quanh nhiều dòng là đủ phổ biến để sử dụng \ r hoặc \ n cho bộ kết thúc câu lệnh sẽ không hoạt động.
Dấu chấm phẩy chỉ thuận tiện vì chúng không được sử dụng trong các câu lệnh logic / toán học. Như vậy, chúng không xung đột với nội dung thực tế của các tuyên bố ở bất kỳ mức độ đáng kể nào.
Cá nhân, tôi nghĩ rằng việc tiếp tục sử dụng dấu chấm phẩy, cùng với các yêu cầu về kiểu dáng để giữ các dòng dưới 80 ký tự, thực sự là ngu ngốc và lỗi thời. Các ngôn ngữ như python đã chứng minh rộng rãi rằng bạn có thể viết dễ hiểu, mã ngắn gọn dễ dàng hơn mà không cần chúng. Ngoài ra, nếu bạn gặp vấn đề với các dòng dài hơn 80 ký tự, bạn cần một màn hình lớn hơn.
Đây là hai câu hỏi: Tại sao ALGOL có dấu chấm phẩy và tại sao các ngôn ngữ khác lại theo đuổi nó.
Câu hỏi đầu tiên đã được trả lời theo nhiều cách ở đây.
Là ngôn ngữ thứ hai, ALGOL được sử dụng rất rộng rãi như một ngôn ngữ mã giả để viết thuật toán. Vì vậy, dấu chấm phẩy sớm trở nên tự nhiên đối với người dùng các ngôn ngữ khác nhau. Và tự nhiên chúng được dùng cho các ngôn ngữ trẻ hơn.
Tôi có thể sai, nhưng tôi nghĩ rằng điều này có liên quan đến thực tế là trong nhiều bộ lắp ráp, một dấu chấm phẩy đã được sử dụng để bắt đầu một nhận xét, thường được đặt sau một hướng dẫn. Tất cả mọi thứ sau một ;
bình luận, và không còn là một phần của hướng dẫn.
Sau đó, cần phải chấm dứt các hướng dẫn khi bạn nhập chúng vào một trình thông dịch. Các hướng dẫn ngắn (ví dụ: biểu thức toán học) có thể được chấm dứt bằng cách nhấn phím Enter, thông báo cho trình thông dịch rằng biểu thức đã sẵn sàng để tính toán và nó tạo ra kết quả. Nhưng đôi khi người ta muốn nhập nhiều dòng mã cho hướng dẫn, vì vậy một cách để đạt được điều đó là sử dụng một số ký tự đặc biệt làm dấu kết thúc của lệnh thay vì chỉ phụ thuộc vào phím Enter. Bằng cách này, người dùng có thể nhập nhiều dòng mã cùng một lúc, vì Enter chưa gửi nó cho trình thông dịch. Chỉ khi trình thông dịch tìm thấy ký tự kết thúc trong một dòng được nhập bằng Enter, cuối cùng nó sẽ thực thi nó và tính kết quả của nó.
Bây giờ kết hợp hai thứ này lại với nhau và dấu chấm phẩy dường như là một lựa chọn rõ ràng cho ký tự kết thúc: nó cho biết phần hướng dẫn kết thúc và phần bình luận bắt đầu, vì vậy khi trình thông dịch gặp nó trong một dòng, nó biết rằng nó có thể tuôn ra tất cả các dòng của biểu thức được đệm cho đến nay và thực hiện nó, bởi vì lệnh đã kết thúc, bây giờ chúng tôi đang ở trong một nhận xét (tốt, ít nhất là đến cuối dòng này, bởi vì dòng tiếp theo sẽ bắt đầu trong mã chế độ một lần nữa, bắt đầu một biểu thức / hướng dẫn mới).
Tất nhiên, điều này giả định rằng đó thực sự là dấu chấm phẩy đã được sử dụng cho ý kiến của người đưa ra ý tưởng này về việc sử dụng lại nó như là dấu chấm hết hướng dẫn. Có bất kỳ nhân vật nào khác, chúng tôi có thể đã kết thúc với một bộ kết thúc lệnh khác.
Inb4: Không, đây không phải là tài khoản lịch sử. Tôi không có bằng chứng nào cho thấy đây là cách dấu chấm phẩy thực sự đi vào cuộc sống. Đó chỉ là cách tôi tưởng tượng nó có thể đã xảy ra.
Hầu hết các ngôn ngữ đã sử dụng dấu chấm phẩy vì nó đã được sử dụng rộng rãi cho mục đích đó và việc thay đổi không có ý nghĩa.
Và xem xét các ngôn ngữ đầu tiên để đưa ra lựa chọn đó, bạn sẽ phải xem xét các lựa chọn thay thế là gì. Khi thiết kế ngôn ngữ, bạn muốn có sẵn các ký tự cần thiết và các bộ ký tự tại thời điểm này được mã hóa trên 6 bit, thường với một số mẫu được bảo lưu, thường với một số ký tự không được xác định chắc chắn (vì sự xuất hiện sau này, hãy nghĩ về Các biến thể quốc gia của ISO-646 - biến thể của Hoa Kỳ được biết đến dưới tên ASCII - sử dụng lại các mã cho các ký tự "phổ biến" như [
, #
hoặc $
, và thấy hiệu ứng trong bối cảnh chỉ có một nửa số vị trí mã có sẵn và các chữ cái và chữ số dự trữ hơn một nửa số đó).
Có lẽ không có nhân vật nào khác có thể được sử dụng làm dấu phân tách câu lệnh bằng trực giác ( .
có lẽ đã là đối thủ nghiêm trọng duy nhất cho tiêu chí đó) và không đưa ra những khó khăn về lexing hoặc phân tích cú pháp tại thời điểm mà lý thuyết phân tích và lexing vẫn đang được xây dựng ( .
hiện tại ra khỏi câu hỏi do sử dụng của nó trong số thực).
Một lý do khác tại sao sử dụng dấu chấm phẩy là vì đó là một trong những ký tự mà chúng tôi không yêu cầu hoặc sử dụng thường xuyên hơn.
Giả sử chúng ta sử dụng nó thường xuyên hơn như một tên biến hoặc một số thứ và nếu dấu chấm phẩy sẽ được sử dụng như một từ khóa hoặc như một toán tử, thì đó sẽ là một xung đột biểu tượng cho trình biên dịch, do đó điều quan trọng là sử dụng một ký hiệu không phải là thường được sử dụng trong mã hóa.
Tôi tin rằng các ngôn ngữ lập trình kiểu C đã làm cho nó trở nên phổ biến và sau đó các tác giả của các ngôn ngữ lập trình mới không muốn phát minh lại bánh xe và họ vẫn tiếp tục sử dụng nó cho đến bây giờ.