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?


130

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.


6
Erlang và prolog sử dụng fullstops.
Dave Clarke

13
Tôi tự hỏi có bao nhiêu ngôn ngữ lập trình mà bạn biết. Có rất nhiều ngôn ngữ không sử dụng dấu chấm phẩy.
knivil

50
Tôi cá rằng câu trả lời sẽ trở thành một cái gì đó giống như "giá trị ASCII của dấu chấm phẩy đặc biệt bền khi được sử dụng làm ký tự cuối cùng trên thẻ đục lỗ 80 ký tự."
Ryan Thompson

22
Câu hỏi của bạn không đi đủ xa. Câu hỏi thực sự là, tại sao lại có bất kỳ biểu tượng nào? Một
Konrad Rudolph

5
Bởi vì nó nằm trên hàng nhà của bàn phím qwerty?
wim

Câu trả lời:


132

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ư

  • Công dụng của nó phản ánh việc sử dụng trong dấu câu tiếng Anh thông thường.
  • Các ký tự khác (ví dụ: toàn bộ dừng) có thể gây nhầm lẫn vì chúng đã có một cách sử dụng chung (một điểm dừng hoàn toàn cũng được sử dụng như một dấu thập phân).
  • Một ký tự dấu chấm câu có thể nhìn thấy cho phép bố trí mã định dạng miễn phí.
  • Việc sử dụng một ký tự phân cách tương tự trong các ngôn ngữ phái sinh hoặc sau này được xây dựng dựa trên sự quen thuộc có được của tất cả các lập trình viên đã sử dụng ngôn ngữ trước đó.

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.


19
Không hoàn toàn chính xác. Dấu chấm phẩy phân tách các câu thành các khối: mỗi khối nên là một câu làm việc nhưng chúng tôi sử dụng dấu chấm phẩy để biểu thị rằng có một liên kết mạnh mẽ giữa hai câu. Đó là một nửa giữa dấu phẩy và điểm dừng hoàn toàn để nó thực sự là điểm dừng nhưng nó liên kết một câu với câu tiếp theo. Câu trên sẽ là: "Cô ấy thấy ba người đàn ông; Jamie: người đến từ New Zealand, John: con trai của người bán sữa và George: một người đàn ông hốc hác." Việc bạn sử dụng dấu chấm phẩy có thể được thay thế bằng dấu phẩy. Hơi lạc đề nhưng ý chính về cơ bản là giống nhau; nó phá vỡ các tuyên bố.
alex.p

40
@ alex.p thực sự là một cách sử dụng dấu chấm phẩy được chấp nhận thay cho dấu phẩy khi nó sẽ gây ra một câu khó hiểu, điều này làm cho điều này đúng.
Ryathal

13
Thông tin quan trọng về dấu chấm phẩy: theoatmeal.com/comics/semicolon
Ed James

7
@ alex.p: Có vẻ như bạn đang nói rằng việc sử dụng của Ian là sai nhưng bạn có thể chỉ đơn giản nói lời giải thích của anh ấy về cách chúng tôi sử dụng dấu chấm phẩy không đầy đủ. Nếu bạn nói rằng anh ấy sai, thì bạn đã chết sai. Việc anh ta sử dụng dấu chấm phẩy là hoàn toàn thông thường và tôi đoán phổ biến hơn nhiều so với ví dụ bạn đưa ra. Nếu bạn chỉ đơn giản nói rằng anh ta không đưa ra một lời giải thích thấu đáo, thì tôi không chắc tại sao điều đó thực sự đáng để đề cập đến.
iconoclast

17
@Ian "đây phải là một giả định, lúc đó tôi không có ở đó" Bạn đã bỏ lỡ một cơ hội hoàn hảo để (sử dụng chính xác) một dấu chấm phẩy ở đó :)
Travis Christian

70

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.


8
C chỉ tuân theo quy ước sử dụng dấu chấm phẩy như được sử dụng bởi người tiền nhiệm 'B'
Crollster

8
B chỉ tuân theo quy ước sử dụng dấu chấm phẩy như được sử dụng bởi người tiền nhiệm 'PL / I' :)
Skomski

15
@Skomski - Cái nào theo cái gì? Tôi đang đợi con rùa cuối cùng đi vào;)
Oded

26
-1; Nào các bạn, có phải tất cả chúng ta đã quên ALGOL có ảnh hưởng lớn? Nó có dấu chấm phẩy như dấu phân cách câu lệnh trước mọi thứ khác mà bạn đang đề cập. (Tôi không biết liệu nó có lấy ý tưởng từ một nơi nào khác không)
hugomg

13
@Oded - Tôi nghĩ bạn sẽ thấy Rùa hết cỡ . * 8 ')
Đánh dấu gian hàng

54

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 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.


2
Cần lưu ý rằng việc sử dụng dấu chấm phẩy hoặc dòng mới sẽ xuất hiện lại gần đây. Javascript, Lua, Go và Haskell đều có dấu chấm phẩy ngầm ở dòng mới nếu nó có giá trị cú pháp ở đó. Và tất nhiên một số ngôn ngữ giữ lại dòng mới là dấu phân cách. Shell và Python đến với tâm trí ở đây.
Jan Hudec

2
+1 cho " ít suy nghĩ kỹ càng hơn PASCAL và Ada"
Aditya

2
Algol 58 , tiền thân của Algol 60, đã sử dụng dấu chấm phẩy. Lưu ý rằng tại thời điểm đó, sự khác biệt thường được thực hiện giữa hình thức xuất bản của ngôn ngữ và hình thức nhập thực tế, bởi vì các thiết bị đầu vào khá hạn chế: chỉ viết hoa, v.v. Sự phân đôi đó không thực sự đúng với FORTRAN, nhưng đúng với số lượng ngôn ngữ khác.
Dan Halbert

5
@kevincline: Bạn có cho rằng Boeing 777 được sử dụng phổ biến không? Mỗi dòng phần mềm điện tử hàng không bay trên máy bay được viết bằng Ada.
John R. Strohm

2
@kevincline Skype: được viết bằng Delphi (Pascal.) Microsoft đã cố gắng thay đổi điều này sau khi họ có được nó, nhưng họ không thể chuyển nó thành công, vì vậy bây giờ họ đang mua giấy phép Delphi. Bao giờ xem TV ở Mỹ? Trạm có thể chạy trên phần mềm bởi WideOrbit, được viết bằng Delphi; Họ là công ty dẫn đầu thị trường bởi lợi nhuận rất lớn. Bạn đã từng đến một công viên giải trí chưa? Có một cơ hội tốt hệ thống bán vé được viết bằng Delphi. Pascal ở khắp mọi nơi; chỉ là nó cung cấp một lợi thế cạnh tranh mạnh mẽ đến mức nhiều người cố gắng giữ im lặng về nó để các đối thủ của họ không phát hiện ra.
Mason Wheeler

14

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.


Điểm rất tốt (+1), mặc dù tôi không thể hoàn toàn đồng ý với phần "chủ yếu là tùy ý". Tôi nghĩ rằng có rất nhiều thứ chắc chắn trực quan hơn và những thứ khác ít trực quan hơn. Trong Windows sử dụng dấu X để đóng các cửa sổ, có một số biểu tượng có sẵn (có lẽ chỉ được kết nối mơ hồ) mà nó rút ra. Và chắc chắn trong việc sử dụng màu sắc của OS X có một biểu tượng mạnh mẽ mà nó thu hút. (Tôi đang phớt lờ hiện tại rằng M $ Windows có thể đã đánh cắp X từ X Windows, vì tôi không nhớ những gì đã sử dụng.)
iconoclast

3
@Brandon: Tôi chắc chắn không có ý định nói rằng tất cả các phần của thiết kế GUI là tùy ý - có lẽ tôi nên nói "một số" thay vì "nhất". Nó sẽ không phải là X xác định bất kỳ hình dạng cụ thể nào cho biểu tượng "đóng cửa sổ" - sẽ tùy thuộc vào một trình quản lý cửa sổ riêng lẻ.
Jerry Coffin

Theo hồi ức tốt nhất của tôi, Dartmouth BASIC ban đầu chỉ sử dụng trở lại vận chuyển để chấm dứt các câu lệnh (nghĩa là một câu lệnh trên mỗi dòng). Tôi nghĩ nhiều câu lệnh trên một dòng, được phân tách bằng dấu hai chấm, là một phần mở rộng của Microsoft.
John R. Strohm

7

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.]


6

Đâ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.


bạn có một điểm tốt ở đây; Tôi sẽ chỉ viết lại từ "được chọn" (rất khó để chứng minh) thành một từ như "... Dấu chấm phẩy đã chiến thắng vì đó là nhân vật tốt nhất dựa trên sự lười biếng và đơn giản"
gnat

2
Khó khăn. Dấu chấm phẩy như dấu chấm dứt / dấu tách câu lệnh bắt đầu tại ALGOL (1958), trước đó là ASCII (công việc bắt đầu năm 1960, bản phát hành đầu tiên năm 1963, bản phát hành chính năm 1967, bản cập nhật cuối năm 1986).
John R. Strohm

@ JohnR.Strohm đó là tin tức với tôi, nhưng tất cả điều này là khá nhiều lịch sử cổ xưa đối với tôi
Ryathal

6
Đây là một lý thuyết tuyệt vời, nhưng thực tế là các phím bấm cần có phím shift để đến dấu chấm phẩy cho đến khi đầu vào bàn phím hiện đại xuất hiện vào những năm 70. (Có một số hình ảnh tốt ở gần cuối bài viết wiki: en.wikipedia.org/wiki/Keypunch ) Rất có thể nó chỉ dựa trên các quy tắc ngôn ngữ tiếng Anh tự nhiên, một mốt đặc biệt phổ biến cùng một lúc. (Tôi sẽ bao gồm tất cả các ngôn ngữ cuối thập niên 50: ALGOL, FORTRAN, COBOL và SQL, ngoại trừ LISP.) Dấu chấm phẩy của ALGOL chỉ là một trong nhiều quy ước bằng tiếng Anh được sử dụng, mà BASIC sau này được mở rộng thêm.
SilverbackNet

@SilverbackNet, đó là lý do tại sao "công việc đoán thuần túy" có lẽ không nên là cơ sở của câu trả lời ở đây.
dùng1717828

6

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 '", 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 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 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.99thay 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á :;.

: 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.


3

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!


2

Đó 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.


1

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.


3
Quay trở lại thời kỳ tăm tối, không có "màn hình 80 cột". Có thẻ đục lỗ 80 cột và có máy in với số lượng cột khác nhau. (Khoảng 130 hoặc hơn là phổ biến.) FORTRAN chấm dứt các tuyên bố ở cuối thẻ, nhưng được phép cho các thẻ tiếp tục tiếp tục tuyên bố. Thẻ tiếp tục được đánh dấu bởi một nhân vật được bấm trong cột 6 của thẻ. (Bất kỳ ký tự nào cũng hoạt động. Tùy thuộc vào quy ước địa phương, bạn thường sẽ thấy dấu + hoặc một chữ số, chữ số đếm cho nhiều thẻ tiếp tục.)
John R. Strohm

1
Một ngôn ngữ như Python sẽ không thể sử dụng được cho các máy tính tồn tại trong những ngày đầu của C. Sử dụng ký tự chấm dứt câu lệnh làm cho việc phân tích cú pháp đơn giản hơn và điều rất quan trọng là giảm tải bộ nhớ và CPU của trình biên dịch cách đây hàng thập kỷ. Đặc biệt là trên các máy tính mà bạn đã trả tiền cho thời gian CPU thứ hai.
Gigatron

@Gigatron - Tôi đã đề cập chỉ đến việc sử dụng vận chuyển trở lại kết thúc một tuyên bố, không để bất kỳ trong những khía cạnh cấp cao trăn.
Tên giả

1
@Gigatron, bạn có thể muốn xem LISP, và đặc biệt là lịch sử ban đầu của nó trên IBM 704. Bạn có thể ngạc nhiên về những gì Người cổ đại có thể làm, thậm chí làm việc với dao đá và gấu.
John R. Strohm

1
@Gigatron: FORTRAN chạy trên cùng một máy tính và nó sử dụng các dòng mới để phân tách các câu lệnh (với cú pháp đặc biệt cho các câu lệnh nhiều dòng).
dan04

0

Đâ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.


0

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.


-1

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).


-1

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ờ.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.