2010-02-22 26 views
17

Nhiều ngôn ngữ lập trình cho phép dấu phẩy theo ngữ pháp của chúng sau mục cuối cùng trong danh sách. Giả sử điều này được thực hiện để đơn giản hóa việc tạo mã tự động, điều này là dễ hiểu.Lịch sử dấu phẩy sau trong ngữ pháp ngôn ngữ lập trình

Như một ví dụ, sau đây là một khởi mảng hoàn toàn hợp pháp trong Java (JLS 10.6 Array Initializers):

int[] a = { 1, 2, 3, }; 

tôi tò mò nếu có ai biết ngôn ngữ nào là người đầu tiên cho phép trailing dấu phẩy như thế này. Rõ ràng C đã có nó as far back as 1985.

Ngoài ra, nếu có ai biết ngữ pháp khác "đặc thù" của ngôn ngữ lập trình hiện đại, tôi cũng rất muốn nghe về những ngôn ngữ đó. Tôi đọc rằng Perl và Python ví dụ thậm chí còn tự do hơn trong việc cho phép dấu phẩy ở các phần khác của ngữ pháp của chúng.

+0

Nếu tôi nhớ lại, khi tôi học C từ K & R ban đầu (pre-ANSI) vào năm 1983, dấu phẩy sau được cho phép. Điều này đã được cố ý để cho phép tạo mã tự động dễ dàng hơn (bằng các công cụ như YACC). – Ralph

+0

Nó cũng giúp khi (như trong định nghĩa 'enum') mỗi mục nằm trên một dòng riêng của nó: thêm một giá trị mới vào cuối đơn giản là một dòng bổ sung (không yêu cầu thay đổi dòng mới áp chót), có khả năng tránh sự phụ thuộc trên/bởi bất kỳ thay đổi nào đối với đường mới áp chót. – jhfrontz

Trả lời

4

Tôi không phải là một chuyên gia về các dấu phẩy, nhưng tôi biết rằng tiêu chuẩn Pascal đã rất persnickity về dấu chấm phẩy là tuyên bố tách, không Terminators. Điều đó có nghĩa là bạn phải rất cẩn thận về nơi bạn đặt nó nếu bạn không muốn bị mắng bởi trình biên dịch.

Sau đó các ngôn ngữ Pascal-esque (C, Modula-2, Ada, v.v.) có các tiêu chuẩn được viết để chấp nhận dấu chấm phẩy phụ lẻ mà không hành xử như bạn vừa mới làm trong hỗn hợp bánh.

+1

Nói về dấu chấm phẩy, tôi muốn được quan tâm để xem biểu đồ về tần suất sử dụng dấu chấm phẩy trong lịch sử nhân loại. Theo Wikipedia, việc sử dụng chung đầu tiên là vào năm 1591. Tôi nghi ngờ rằng có một bước nhảy trong việc sử dụng nó với mọi ngôn ngữ lập trình kiểu khung xoăn mới được phát minh. Có lẽ cũng có một sự cố khi mọi người tìm ra rằng bạn có thể sử dụng nó để nháy mắt với mọi người ';)' – polygenelubricants

+6

Nghiêm túc; Tôi không nghĩ rằng nó đã thay đổi tần số tôi sử dụng chúng; –

+0

Thật thú vị khi lưu ý rằng trong BASIC, dấu hai chấm được sử dụng thường xuyên hơn dấu chấm phẩy, và trên Commodore Vic-20 và các dẫn xuất (C64, C128, vv) hàng giữa kết thúc bằng J, K, L, dấu hai chấm (thay vì J, K, L, dấu chấm phẩy). – supercat

4

Tôi vừa phát hiện ra rằng trình biên dịch G77 Fortran có cờ -fugly-commaUgly Null Arguments, mặc dù nó hơi khác một chút (và như tên ngụ ý, thay vì xấu xí).

Tùy chọn -fugly-comma cho phép sử dụng dấu phẩy dấu duy nhất để có nghĩa là “vượt qua thêm một trailing đối số null” trong danh sách các đối số thực tế để một thủ tục bên ngoài, và sử dụng một danh sách trống của đối số cho một thủ tục như vậy để có nghĩa là "vượt qua một đối số null duy nhất".

Ví dụ: CALL FOO(,) có nghĩa là "vượt qua hai đối số null", thay vì "vượt qua một đối số null". Ngoài ra, CALL BAR() có nghĩa là "vượt qua một đối số null".

Tôi không chắc chắn phiên bản ngôn ngữ này xuất hiện lần đầu tiên.

+0

EEEwwwwww. Bẩn thỉu. –

+10

Đó là tùy chọn-type-f: ugly-dấu phẩy, hoặc chỉ là "fugly dấu phẩy". Tôi thực sự muốn tin rằng đó là thứ hai. –

2

[Không ai biết] ngữ pháp khác "đặc thù" của ngôn ngữ lập trình hiện đại?

Một trong những mục yêu thích của tôi, Modula-3, được thiết kế vào năm 1990 với sự chúc phúc của Niklaus Wirth là ngôn ngữ mới nhất trong "gia đình Pascal". Có ai khác nhớ những người này chiến đấu khủng khiếp về nơi dấu chấm phẩy phải là dấu phân tách hoặc terminator? Trong Modula-3, lựa chọn là của bạn! Các EBNF cho một chuỗi các câu lệnh là

stmt ::= BEGIN [stmt {; stmt} [;]] END 

Tương tự như vậy, khi viết giải pháp thay thế trong một tuyên bố CASE, Modula-3 cho phép bạn sử dụng các thanh dọc   | là một trong hai thiết bị tách hoặc một tiền tố.Vì vậy, bạn có thể viết

CASE c OF 
| 'a', 'e', 'i', 'o', 'u' => RETURN Char.Vowel 
| 'y' => RETURN Char.Semivowel 
ELSE RETURN Char.Consonant 
END 

hoặc bạn có thể rời khỏi thanh đầu tiên, có lẽ vì bạn muốn viết OF ở vị trí đó.

Tôi nghĩ những gì tôi thích nhiều như bản thân thiết kế là nhận thức của các nhà thiết kế rằng có một cuộc chiến tôn giáo đang diễn ra và sự kiên trì của họ trong việc tìm cách hỗ trợ cả hai bên. Hãy để người lập trình chọn!


P.S. Mục tiêu Caml cho phép sử dụng cho phép của | trong trường hợp các biểu thức trong khi các phương ngữ tiêu chuẩn trước đó và chặt chẽ tiêu chuẩn ML không. Kết quả là, biểu thức trường hợp thường xấu hơn trong mã ML Chuẩn.


EDIT: Sau khi nhìn thấy câu trả lời TED của tôi đã kiểm tra ngữ pháp Modula-2 và anh ấy là đúng, Modula-2 cũng hỗ trợ dấu chấm phẩy như terminator, nhưng thông qua các thiết bị của tuyên bố trống rỗng, mà làm những thứ như thế

x := x + 1;;;;;; RETURN x 

hợp pháp. Tôi cho rằng đó không phải là một điều xấu. Modula-2 không cho phép sử dụng linh hoạt bộ phân tách chữ hoa |, tuy nhiên; dường như có nguồn gốc từ Modula-3.

+0

Đúng vậy. Đó cũng là cách C xung quanh vấn đề, tôi tin. Giải pháp của Ada gần gũi hơn với Modula-3, do đó, điều đa dấu chấm phẩy trông xấu xí sẽ không hợp pháp. Nếu bạn muốn có một "câu lệnh trống" vì một số lý do lạ trong Ada, bạn phải nói 'null; ' –

+0

Sử dụng dấu chấm phẩy như một câu lệnh trống không hợp pháp trong Modula-2 cổ điển của Wirth, nó được thêm vào trong ISO Modula-2 sau nhiều cuộc tranh luận, không phải ai cũng hài lòng với nó.Modula-2 R10 có cách tiếp cận của Wirth nhưng thêm một thủ tục giả được gọi là TODO, có ký tự là đối số được in dưới dạng cảnh báo thời gian biên dịch trong chế độ DEBUG hoặc lỗi trong chế độ xây dựng sản xuất. – trijezdci

2

Something đã luôn galled tôi về C là mặc dù nó cho phép thêm một dấu phẩy trong một intializer danh sách, nó không cho phép một dấu phẩy dấu thêm vào một danh sách Enumerator (để xác định các literals của một kiểu liệt kê). Sự mâu thuẫn nhỏ bé này đã cắn tôi vào mông nhiều lần hơn tôi quan tâm. Và không có lý do!

+1

Tôi nghĩ bạn đang lạc hậu về điều đó. Tôi cho rằng lý do là sự hiện diện của một mục phụ ở cuối một định nghĩa enum sẽ không ảnh hưởng gì (trừ khi tên của nó va chạm với một mã định danh khác) trong khi thêm một mục bổ sung ở cuối bộ khởi tạo có thể ảnh hưởng đến kích thước của mảng được phân bổ. – supercat

Các vấn đề liên quan