Liệu cú pháp có thực sự quan trọng trong một ngôn ngữ lập trình? [đóng cửa]


41

Một trong những giáo sư của tôi nói rằng "cú pháp là giao diện người dùng của ngôn ngữ lập trình", các ngôn ngữ như Ruby có khả năng đọc rất tốt và nó đang phát triển, nhưng chúng tôi thấy rất nhiều lập trình viên làm việc với C \ C ++, vì vậy các lập trình viên thực sự coi đó là cú pháp Có nên chấp nhận?

Tôi rất muốn biết ý kiến ​​của bạn về điều đó.

Tuyên bố miễn trừ trách nhiệm: Tôi không cố bắt đầu một cuộc tranh cãi. Tôi nghĩ rằng đây là một chủ đề thảo luận tốt.

Cập nhật: Điều này hóa ra là một chủ đề tốt. Tôi rất vui vì tất cả các bạn đang tham gia vào nó.


16
Hmm, điều này dường như cho rằng cú pháp C / C ++ là xấu? Chắc chắn một số yếu tố của các mẫu C ++ là xấu, nhưng theo như ngôn ngữ (về mặt lịch sử), C / C ++ vẫn rất, rất dễ đọc.
Macneil

2
tôi cũng biết nhiều lập trình viên sẽ không đồng ý với điều đó, chủ yếu là từ cộng đồng ruby, nó dễ đọc hơn nhiều so với những gì tôi có thể nói :)
Saif al Harthi

9
Đó có phải là một khóa học lý thuyết? Hãy nhớ rằng: các giáo sư thường là một số lập trình viên tồi tệ nhất. Họ không biết nó giống như thế nào ngoài tự nhiên.
Công việc

2
Khả năng đọc là trong mắt của kẻ si tình :).
MAK

8
Cú pháp tốt không thể làm cho một ngôn ngữ khốn khổ tốt hơn. Nhưng cú pháp khốn khổ có thể làm cho một ngôn ngữ tốt trở nên tồi tệ hơn;)
Dario

Câu trả lời:


65

Có nó làm. Nếu bạn nghi ngờ, hãy dùng APL , hoặc J , hoặc Brainfuck , hoặc thậm chí là Lisp hoặc Forth đơn giản và đơn giản, và cố gắng hiểu bất kỳ chương trình không hoàn toàn tầm thường nào trên đó. Sau đó so sánh với ví dụ Python.

Sau đó so sánh cùng một Python (hoặc Ruby, hoặc thậm chí C #) với những thứ như Cobol hoặc VB6.

Tôi không cố nói rằng cú pháp lông là xấu và cú pháp giống ngôn ngữ tự nhiên là tốt trong mọi trường hợp. Nhưng cú pháp obvoiusly không tạo ra sự khác biệt lớn. Nói chung, tất cả mọi thứ bạn có thể viết bằng ngôn ngữ lập trình đẹp nhất bạn cũng có thể viết dưới dạng chương trình máy Turing - nhưng bạn thường không muốn, phải không?


26
Lisp chắc chắn là dễ hiểu.
cbrandolino

65
+1 để đưa Lisp vào danh sách các ngôn ngữ không thể đọc được.
asmeker

65
-1 để bao gồm Lisp trong danh sách các ngôn ngữ không thể đọc được.
Paul Nathan

27
Lập trình nói chung là không thể đọc được cho người không quen. Như là ký hiệu âm nhạc và sơ đồ kiến ​​trúc. (= XY) cũng dễ đọc như X == Y, với người biết cách đọc.
Paul Nathan

6
Tôi yêu APL, và trừ khi mã được viết có chủ ý để làm xáo trộn (rất dễ làm), nó khá dễ đọc. Sức mạnh của cú pháp là bạn có thể lập trình các thuật toán trong 2 hoặc 3 dòng mã APL sẽ yêu cầu hàng chục hoặc hàng trăm dòng C, Fortran hoặc COBOL. Tính đồng nhất và sức mạnh của một ngôn ngữ như APL rất quan trọng đối với cuộc thảo luận này bởi vì cố gắng đọc qua hàng trăm dòng mã của ngôn ngữ khác có thể gây khó chịu như giải mã các yếu tố tối nghĩa của APL.
oosterwal

11

Trong thực tế tôi nghĩ rằng nó có vấn đề. Khả năng đọc đã được thảo luận ở trên. Một vấn đề khác có thể là có bao nhiêu tổ hợp phím được neded để thể hiện một ý tưởng / đại số? Tuy nhiên, một vấn đề khác là việc các lỗi đánh máy đơn giản trở nên dễ dàng như thế nào đối với mắt người, và chúng có thể gây ra bao nhiêu trò nghịch ngợm.

Tôi cũng thấy nó hữu ích trong một số bối cảnh để phân tích và / hoặc để tạo các đoạn mã thông qua một chương trình máy tính khác. Khó khăn trong việc phân tích ngôn ngữ và / hoặc tạo mã chính xác sau đó ảnh hưởng trực tiếp đến việc cần bao nhiêu nỗ lực để tạo / duy trì các công cụ đó.


Quan sát tuyệt vời về lỗi chính tả rất dễ phân biệt.

7
Nhưng trong lý thuyết không có sự khác biệt giữa lý thuyết và thực hành.
Công việc

10

Tôi tin rằng giáo sư của bạn đang đề cập đến đường Syntactic .

Đường cú pháp là một thuật ngữ khoa học máy tính dùng để chỉ cú pháp trong một ngôn ngữ lập trình được thiết kế để làm cho mọi thứ dễ đọc hoặc diễn đạt hơn, trong khi các cách khác để diễn đạt chúng tồn tại .

Vì vậy, điều mà giáo sư của bạn ngụ ý, là bất kỳ mã / cú pháp nào được viết bằng một ngôn ngữ lập trình, đều có thể được diễn đạt bằng các ngôn ngữ khác giống nhau - hoặc thậm chí cùng một ngôn ngữ.

Robert Martin, lấy từ định lý Lập trình có cấu trúc , đã tóm tắt những gì lập trình viên về cơ bản với các ngôn ngữ lập trình tại bài phát biểu của mình tại RailsConf 2010: Robert Martin (video trên YouTube, xem sau 14 phút, mặc dù tôi khuyên bạn nên làm toàn bộ):

  • Trình tự (bài tập)
  • Lựa chọn (nếu báo cáo)
  • Lặp lại (vòng lặp)

Đó là tất cả các lập trình viên làm, từ ngôn ngữ lập trình này sang ngôn ngữ lập trình khác, chỉ trong một cú pháp hoặc giao diện người dùng (UI) khác nhau. Đây là những gì tôi đoán giáo sư của bạn đã nhận được, nếu anh ấy / cô ấy đang nói một cách trừu tượng về ngôn ngữ lập trình.

Vì vậy, về bản chất , cú pháp không thành vấn đề . Nhưng nếu bạn muốn cụ thể, thì rõ ràng một số ngôn ngữ và cú pháp phù hợp hơn cho các tác vụ nhất định so với các tác vụ khác, nhờ đó bạn có thể lập luận rằng cú pháp có vấn đề.


Bạn có thể gọi C chỉ là một cú pháp cú pháp cho nhà lắp ráp?
Goran Jovic

1
Tôi sẽ. Nhưng tôi yêu cầu cú pháp vấn đề. ;)
Lennart Regebro

2
"... Robert Martin đã tóm tắt những gì các lập trình viên về cơ bản làm ..." Robert Martin? Robert Martin ?? Bạn thực sự có thể muốn xem xét bài báo này: C. Böhm, G. Jacopini, "Sơ đồ dòng chảy, Máy Turing và Ngôn ngữ chỉ với hai Quy tắc hình thành", Comm. của ACM, 9 (5): 366-371,1966. thường được ghi là nguồn của 'Định lý chương trình có cấu trúc'. vi.wikipedia.org/wiki/Sturationured_program_theorem
leed25d

@ lee25d Tôi không có ý tin rằng chú Bob là người khởi tạo sự trừu tượng, nhưng là nguồn mà tôi nghe thấy gần đây (và được liên kết với). Nhưng cảm ơn bạn đã liên kết, tôi sẽ cập nhật câu trả lời của tôi để phản ánh liên kết của bạn.
bọt biển

Đoạn Wikipedia được liên kết ở trên không hoàn toàn hiểu lịch sử của "Định lý lập trình có cấu trúc". Ý tưởng có trước Bohm & Jacopini. Đóng góp của Bohm & Jacopini đã cho thấy rằng đó là một định lý, không chỉ là một phỏng đoán, tức là họ đã cung cấp một bằng chứng chính thức nghiêm ngặt.
John R. Strohm

7

Có và không.

Có một vài khía cạnh khác nhau về cú pháp.

  • khả năng đọc
  • biểu cảm
  • phân tích cú pháp

Khả năng đọc đã được đề cập.

Biểu cảm là một trường hợp thú vị. Tôi sẽ sử dụng chức năng truyền qua làm ví dụ, bởi vì đó là một điểm đau của ngữ nghĩa / cú pháp.

Hãy lấy C ++ làm ví dụ. Tôi có thể tạo một chức năng đặt hàng đầu tiên sau thời trang này:

class funcClass
{
  int operator()(int);
}
funcClass fun;

void run_func(funcClass fun)
{
   fun();
}

Thành ngữ đặc biệt này thường được sử dụng trong Các yếu tố lập trình của Stepanov .

Mặt khác, tôi có thể bắt chước nó trong Common Lisp với một cái gì đó như thế này :

(defun myfunc() )

(defun run_func(fun)
  (fun))

Hoặc, trong Perl -

   sub myfunc
   {
   }

   sub run_func
   {
      my $func = shift;
      $func->();          #syntax may be a little off.
   }

Hoặc, bằng Python -

def myfunc():
    pass

def run_func(f):
    f()

Tất cả đều có - về cơ bản - cùng một nội dung ngữ nghĩa, mặc dù ví dụ C ++ mang một số siêu dữ liệu loại. Ngôn ngữ nào thể hiện ý tưởng vượt qua chức năng bậc cao là tốt nhất? Lisp thông thường hầu như không tạo ra một biến thể cú pháp. C ++ yêu cầu một lớp được tạo chỉ để 'thực hiện' chức năng. Perl khá đơn giản về việc tạo ra một số mức độ khác biệt. Python cũng vậy.

Cách tiếp cận nào phù hợp nhất với miền vấn đề? Cách tiếp cận nào tốt nhất có thể diễn tả những suy nghĩ trong đầu bạn với "sự không phù hợp trở kháng" ít nhất?

Khả năng phân tích là - trong tâm trí của tôi - một vấn đề lớn. Cụ thể, tôi đề cập đến khả năng phân tích và cắt ngôn ngữ của IDE mà không mắc lỗi. Định dạng lại là hữu ích. Các ngôn ngữ được phân tách bằng mã thông báo có xu hướng phân tích tốt - ruby ​​/ c / pascal, v.v.

Hãy xem xét mặc dù - các hệ thống chính của tất cả các loại đã được tạo ra với mọi ngôn ngữ nghiêm túc để giải quyết các vấn đề trong thế giới thực. Mặc dù cú pháp là một rào cản để diễn đạt một số thứ, nhưng nó là một rào cản có thể giải quyết được. Turing tương đương và tất cả những thứ đó.


5

Cú pháp chắc chắn có vấn đề, mặc dù bạn có xu hướng chú ý đến nó nhiều hơn khi nó không trực quan và khuyến khích các lỗi. Ví dụ, trò đùa "lỗi cuối cùng của thế giới" khét tiếng:

if (AlertCode = RED)
   {LaunchNukes();}

2
+1: Thật thú vị, tôi chưa bao giờ thấy (hoặc thừa nhận) trò đùa "lỗi cuối cùng của thế giới" khét tiếng này. Nhưng tôi có thể thấy làm thế nào, tùy thuộc vào cú pháp của một ngôn ngữ (hoặc thậm chí là ngữ nghĩa), kết quả của mã giả đó có thể là bất cứ điều gì. Với góc độ ngữ nghĩa là tốt, điều này thực sự có thể được đưa vào trường hợp truyền thông văn hóa cổ điển.
Stephen Swensen

Đây là lý do tại sao bạn nên sử dụng các điều kiện của Yoda, tức là if(RED = AlertCode)không bao giờ nên biên dịch vì RED là hằng số (hoặc nên là!)
Malfist

4
@Malfist: Và do đó chúng tôi thấy rằng cú pháp xấu dẫn đến cú pháp thậm chí còn tệ hơn để bù đắp. Các điều kiện của Yoda rất xấu và khó đọc vì chúng không phải là cách mọi người nghĩ về khái niệm liên quan. Quan điểm của tôi giống như "đây là (một trong nhiều lý do) tại sao bạn nên tránh gia đình C bất cứ khi nào có thể."
Mason Wheeler

1
Vâng, may mắn thay, mã đó có hai lỗi. Chắc chắn, nó sẽ luôn luôn nhập vào điều kiện, nhưng trong đó, nó chỉ là một tham chiếu đến LaunchNukesthủ tục, và không bao giờ gọi nó. Ngăn ngừa khủng hoảng!
khoan hồng

3
Phụ thuộc vào những gì RED. Nếu là 0, thì LaunchNukes()sẽ không bao giờ được gọi.
dan04

5

Cú pháp có vấn đề và tôi có thể cung cấp cho bạn hai ví dụ hỗ trợ: Dylan, đó là một Lisp với cú pháp thông thường hơn và Liskell, đó là Haskell với cú pháp giống Lisp. Trong mỗi trường hợp, một biến thể của ngôn ngữ đã được đề xuất có chính xác cùng một ngữ nghĩa, nhưng cú pháp hoàn toàn khác nhau.

Trong trường hợp của Dylan, người ta đã nghĩ rằng việc bỏ các biểu thức s có lợi cho một cái gì đó thông thường hơn sẽ giúp thu hút một loạt các lập trình viên. Hóa ra cú pháp không phải là điều duy nhất ngăn các lập trình viên sử dụng Lisp.

Trong trường hợp của Liskell, người ta đã nghĩ rằng sử dụng biểu thức s sẽ cho phép sử dụng macro dễ dàng hơn. Hóa ra các macro thực sự không cần thiết trong Haskell, vì vậy thử nghiệm đó cũng không hoạt động.

Đây là điều: nếu cú ​​pháp không quan trọng với bất kỳ ai, thì cả hai thử nghiệm đều không được thử.


1
Dylan quá ít, quá muộn so với các ngôn ngữ khác. Những gì nó có trong lợi của nó không thể bù đắp cho điều đó. Chúng ta không thể cho rằng đó là một lỗi cú pháp hơn là thất bại trong việc đặt tên.
Macneil

@Macneil: Bạn nói đúng về điều quá ít, quá muộn. Bỏ cú pháp Lisp chỉ là cái đinh cuối cùng trong quan tài. Tôi không nghĩ đó là lý do chính cho sự thất bại của Dylan, nhưng tôi không chắc làm thế nào để diễn đạt lại câu trả lời để phản ánh đúng nhất điều đó.
Larry Coleman

Thật thú vị, tôi không biết họ có cú pháp Lisp trong phiên bản trước đó ... Đó có phải là khi nó được đặt tên là Ralph? Newton Message Pad ban đầu sẽ có Dylan ở cốt lõi của nó. 15 năm sau, chúng tôi có iOS với Objective-C là cốt lõi, ngôn ngữ kém hơn của hai người, IMHO.
Macneil

Tôi không nhớ chi tiết chính xác về thời điểm Dylan bị mất biểu thức. Tôi đã ẩn giấu comp.lang.lisp trong một thời gian dài và nhớ chủ đề sắp diễn ra trong một trong những bản flamewar định kỳ của họ trên ngoặc đơn.
Larry Coleman

Dylan có trước Java và tôi không cho rằng có nhiều cách sử dụng C ++ trước đó.
Tom Hawtin - tackline

3

Câu trả lời có thể là phân tách "vấn đề" thành yếu tố máy tínhyếu tố con người . Có rất nhiều yếu tố con người trong cú pháp:

  • Dễ đọc
  • Cô đọng
  • Bảo trì
  • sư phạm
  • Phòng ngừa lỗi
  • Sự phù hợp cho mục đích - đó là ngôn ngữ REPL, ngôn ngữ kịch bản hay ngôn ngữ hệ thống lớn?

Đối với máy tính có liên quan, vấn đề duy nhất của cú pháp là có hay không có sự mơ hồ cần được giải quyết, và mất bao nhiêu thời gian để mã hóa / phân tích mã khi biên dịch / phiên dịch - và chỉ trong trường hợp đó sau này trong đó chi phí phân tích cú pháp là một vấn đề quan trọng.

Đó có thể là lý do tại sao bạn sẽ luôn nhận được câu trả lời "có và không" cho câu hỏi này - bởi vì có hai khía cạnh của nó.


1

Nếu không có cú pháp, chúng ta sẽ không có một "khuôn mẫu" chung để giao tiếp, ở cấp độ con người, mục đích của một khối mã. Cú pháp cung cấp một khung chung để từ đó trình biên dịch có thể được tiêu chuẩn hóa; phương pháp có thể được chia sẻ; bảo trì có thể được đơn giản hóa.


Tại sao câu trả lời của tôi bị bỏ phiếu?
I Ab.

1

Tôi nghĩ điều thực sự quan trọng là quyền truy cập API và tính khả dụng của chức năng cấp thấp (như kiểm soát bộ nhớ và khóa) khi cần. Hầu hết các ngôn ngữ khác đi kèm với các tính năng này bao gồm. Vấn đề là, khi bạn cần chức năng bổ sung, bạn thường phải sử dụng một ngôn ngữ như C để thực hiện nó. Và nó cồng kềnh giao tiếp C với ngôn ngữ bạn đang sử dụng.

Đối với mọi thứ trừ phát triển web (và toán học) tôi đã thấy rằng C / C ++ vẫn là ngôn ngữ của một hệ điều hành và một ứng dụng. Đó là những gì được hỗ trợ hầu hết thời gian để phát triển ứng dụng đa nền tảng, tạo mẫu, đa nền tảng thực sự. Và cú pháp của C là được. Chỉ cần rất đơn giản và tương đối dài dòng. Cú pháp tuyệt vời không thực sự quan trọng đến thế. Tính khả dụng của API và API Tất cả chúng ta cần phải giao tiếp với mã của người khác (phần lớn thời gian được viết bằng C hoặc các dẫn xuất của nó).


Tôi không có cảm xúc với C, nhưng đám đông ML / Haskell có lẽ sẽ có điều gì đó để nói về việc xâu chuỗi.
Rei Miyasaka

+1 cho "Truy cập API": Tôi nghĩ rằng điều này thậm chí có thể quan trọng hơn các tính năng ngôn ngữ.
Giorgio

1

Cú pháp chắc chắn có vấn đề. Nó cực kỳ có giá trị nếu cú ​​pháp ngôn ngữ đủ linh hoạt để cho phép bạn tạo một Ngôn ngữ cụ thể theo miền thuận tiện và dễ đọc cho ứng dụng của bạn. Nếu bạn nghi ngờ điều này, chỉ cần tưởng tượng làm các vấn đề đại số trong tiếng Latin prosaic, như nó đã được thực hiện trước thế kỷ 18, hoặc tưởng tượng làm phép tính mà không có ký hiệu Leibniz quen thuộc. Chắc chắn, một văn bản tính toán không thể đọc được đối với người mới, nhưng với thực tế, chúng ta có thể sử dụng phép tính và ký hiệu Leibniz để giải quyết nhanh chóng một lớp các vấn đề đòi hỏi các trang toán học bằng phương pháp cổ điển. Lập trình chỉ là một chút khác của toán học. Một ký hiệu thuận tiện, gần với miền vấn đề, có thể tạo ra sự khác biệt lớn về năng suất.


DSL không phải là tất cả về cú pháp đường. Ngữ nghĩa là một phần có giá trị hơn nhiều. Bạn có thể thiết kế các eDSL không thêm bất cứ thứ gì vào cú pháp hiện có.
SK-logic

@SK: chắc chắn, nhưng ngữ nghĩa nằm dưới sự kiểm soát hoàn toàn của lập trình viên. Cú pháp bị ràng buộc bởi ngôn ngữ cơ sở. Chúng tôi có thể xây dựng DSL thuận tiện trong Groovy và các ngôn ngữ khác, nhưng không nhiều bằng Java.
kevin cline

1

Đây là một chương trình tính toán khoa 6:

S(K(S(S(SI(KK))(K(S(S(KS)(S(KK)(S(KS)(S(K(SI))K))))(KK)(KI)(S(S(KS)(S(KK)
(S(KS)(S(K(SI))K))))(KK)KK))))))(S(K(S(S(K(SI))(SII)(S(K(SI))(SII))
(S(K(S(S(KS)(S(KK)(S(SI(KK))(K(S(S(KS)(S(KK)(S(KS)(S(K(SI))K))))(KK)KK)))))))
(S(K(S(S(KS)(S(K(SI(KK)))(SI(K(KI)))))))(S(K(S(K(S(S(K(SI))(SII)(S(K(SI))
(SII))(S(K(S(S(KS)(SI(KK)))))(S(S(KS)(S(K(S(KS)))(S(K(S(KK)))(S(S(KS)K)
(K(SI(K(KI))))))))(K(K(S(S(KS)(S(KK)(S(KS)(S(K(SI))K))))(KK)(KI)))))))))))
(S(S(KS)K)(K(SI(K(KI)))))))))))(S(S(KS)K)(K(SI(K(KI))))))(S(S(KS)(S(KK)(S(KS)
(S(K(SI))K))))(KK)(KI)(S(S(KS)(S(KK)(S(KS)(S(K(SI))K))))(KK)(KI)(S(S(KS)(S(KK)
(S(KS)(S(K(SI))K))))(KK)(KI)(S(S(KS)(S(KK)(S(KS)(S(K(SI))K))))(KK)(KI)(S(S(KS)
(S(KK)(S(KS)(S(K(SI))K))))(KK)(KI)(S(S(KS)(S(KK)(S(KS)(S(K(SI))K))))(KK)(KI)
(S(S(KS)(S(KK)(S(KS)(S(K(SI))K))))(KK)KK)))))))

Cú pháp là tối thiểu:

expression: expression term | term
term: ‘(‘ expression ‘)‘ | combinator
combinator: 'S' | 'K' | 'I' 

Dường như có một niềm tin phổ biến rằng cú pháp là điều gây khó khăn cho một ngôn ngữ. Như thường thấy với niềm tin thường được tổ chức, chính xác điều ngược lại là đúng.

Lưu ý rằng cú pháp LISP chỉ có thể đọc được (nếu có) vì nó có cú pháp nhiều hơn so với cú pháp ở trên. Vì vậy, nếu người hâm mộ LISP nói với bạn rằng "cú pháp không thành vấn đề", hãy yêu cầu họ làm hệ quả và thử tính toán SKI. Rốt cuộc họ sẽ phải thừa nhận rằng một cú pháp bit không quá tệ.


Tôi không thể hiểu phiếu bầu xuống. Đây là một câu trả lời thực sự sâu sắc. +1
cặn bã

0

Tôi không nghĩ nó quan trọng ngoài sở thích cá nhân. Tất cả mọi thứ (hiệu suất, khả năng, v.v.) đều bằng nhau sau đó tôi có thể thấy lý do tại sao người ta sẽ đặt trọng số lớn hơn vào cú pháp ngôn ngữ nhưng chọn chuyển qua hiệu suất của các ngôn ngữ như c / c ++ hoặc bất kỳ ngôn ngữ nào khác phù hợp hơn cho công việc chỉ vì cú pháp có vẻ như là một ý tưởng tồi xung quanh.


6
Làm thế nào về "thời gian để thị trường", "chi phí để hưởng lợi", vv?
Công việc

0

Vâng, vấn đề cú pháp, mặc dù thực sự chỉ cho khả năng đọc. So sánh:

for i in range(10):
   print(i)

(Vâng đó là Python) với

FOR(i<-RNG-<10){PRN<-i}

(Vâng, đó là ngôn ngữ tôi vừa tạo) Cả hai sẽ thực hiện chính xác cùng một cách, theo cùng một cách, nhưng cú pháp thì khác và Python dễ đọc hơn. Vì vậy, có, cú pháp chắc chắn có vấn đề. Ngay cả vấn đề "đường tổng hợp".

 @property
 def year(self):
     return self._date.year

Dễ đọc hơn

 def year(self):
     return self._date.year
 year = property(year)

0

Chắc chắn.

Nếu bạn muốn bắt đầu một ngọn lửa lớn, hãy hỏi mọi người, nơi họ đặt bracet mở đầu bằng các ngôn ngữ giống như C. Ý tôi là

void foo() {
  // blah
}

VS

void foo()
{
  // blah
}

hoặc thậm chí VS

void foo() 
{ // blah
}

Và đây chỉ là cùng một ngôn ngữ! Ngoài ra, hãy hỏi họ về không gian, nơi họ đặt chúng (tên hàm và bracet, toán tử, v.v.).

1000 câu trả lời được đảm bảo!


Tôi không muốn tạo ra một ngọn lửa và cho đến nay tôi đã có những phản hồi tốt và tôi cảm ơn tất cả họ đã tham gia và tăng cường kiến ​​thức của tôi và tôi cá rằng những người khác thấy điều này hữu ích
Saif al Harthi

0

Cú pháp không thành vấn đề. Tuy nhiên trong thời đại ngày nay tôi nói nó gần như hoàn toàn vì khả năng đọc và không thực sự về số lượng tổ hợp phím cần thiết. Tại sao?

  • Trừ khi bạn thực sự viết một cái gì đó đơn giản, nếu số lượng phím bạn nhấn là yếu tố hạn chế trong việc viết chương trình thì bạn thực sự, thực sự tào lao khi gõ hoặc suy nghĩ nhiều, quá nhanh.
  • Tất cả các IDE tốt ngày nay có một số lượng lớn các phím tắt có nghĩa là bạn không cần phải thực sự loại bỏ tất cả các ký tự bạn đang sử dụng hầu hết thời gian.

Điều đó nói rằng, nếu nó quá dài dòng thì nó có thể đi đến điểm ảnh hưởng đến khả năng đọc. Tôi muốn thấy một cái gì đó như:

foreach (Chuỗi trong chuỗiList)

Đến:

cho mỗi Chuỗi trong danh sách được tham chiếu bởi biến danh sách chuỗi

...bất kỳ ngày nào!


0

Cú pháp quan trọng đối với những người đang học nó, rào cản gia nhập ngôn ngữ càng phổ biến ban đầu càng thấp. Nhưng nếu ngôn ngữ khó hoặc không thể thể hiện bản thân của bạn một cách phong phú và cô đọng, nó sẽ bắt đầu khô héo về mức độ phổ biến.

Rất ngắn gọn và mờ đục (Perl) cũng tệ như quá dài dòng và dài dòng (AppleScript).

Cần phải có sự cân bằng, rào cản thấp hơn để nhập cảnh, năng suất cao và bảo trì dễ dàng.


-2

Một điều khác cần xem xét là các ngôn ngữ lập trình với cú pháp đẹp hơn sẽ dễ phân tích cú pháp hơn, do đó làm cho trình biên dịch dễ viết hơn, nhanh hơn và ít bị lỗi hơn.


3
Umm ... 10000 SLOC parse.ytrong Ruby không đồng ý. Có một lý do tại sao mỗi một trong số 7 triển khai Ruby sẵn sàng sản xuất hiện tại hoặc sớm sử dụng cùng một trình phân tích cú pháp và mọi triển khai Ruby từng cố gắng phát triển trình phân tích cú pháp riêng của chúng đều thất bại.
Jörg W Mittag

Và sau đó là ngôn ngữ ADA khét tiếng. Cùng với thông số ngôn ngữ, có 100 chương trình phải chạy chính xác để xác nhận trình biên dịch. Có một số điều thực sự tinh tế về cú pháp. Để làm cho một câu chuyện dài ngắn, MỌI trình biên dịch ADA sớm được xây dựng đã làm hỏng một vài chương trình này. Và đó không phải là vấn đề đơn giản để sửa lỗi, nhưng họ cần phải bắt đầu lại từ đầu. Mặc dù nó có sự hỗ trợ lớn của chính phủ (tất cả các hợp đồng của Bộ Quốc phòng bắt buộc ADA), nó đã chết một cái chết khốn khổ.
Omega Centauri

-2

Nói một cách đơn giản: cú pháp như vậy không thành vấn đề. Các ngữ nghĩa bạn có thể thể hiện thông qua nó quan trọng.


5
Là một trích đoạn, hãy viết một trình phân tích cú pháp phức tạp bằng C và sau đó là trình điều khiển thiết bị trong Haskell. Cú pháp có giúp bạn không? Sau đó, làm theo cách khác, bảo tồn nghiêm ngặt ngữ nghĩa của cả hai chương trình. </ Trớ trêu>
9000

1
@ 9000: Tôi đã thấy một vài trình điều khiển thiết bị trong Haskell. Tôi không thể thấy bất cứ điều gì đặc biệt sai với họ. Quan tâm đến công phu?
Jörg W Mittag

2
@ 9000, được đưa ra khó khăn như thế nào để có trình điều khiển thiết bị ngay trong C tôi không chắc bạn đã chọn một ví dụ hay.

1
@ 9000: Đó chính xác là quan điểm của tôi. Bản chất cụ thể của cấu trúc cú pháp không thành vấn đề, đó là những gì bạn thể hiện với nó. Một ngôn ngữ lập trình với cú pháp chính xác của Haskell , nhưng sử dụng một chiến lược đánh giá khác sẽ khiến rất nhiều Haskell hoạt động khủng khiếp hoặc thậm chí bị mắc kẹt trong các vòng lặp vô hạn. Khi nói đến các cấu trúc cú pháp (hoặc rộng hơn: các tính năng ngôn ngữ), đó không phải là cú pháp cụ thể của chúng, mà là ngữ nghĩa của chúng, tức là những gì bạn có thể diễn đạt với chúng.
back2dos

@ 9000, sẽ không có vấn đề gì khi viết trình phân tích cú pháp trong Haskell với cú pháp giống C (hoặc trình điều khiển, sử dụng C với cú pháp giống Haskell).
SK-logic
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.