Ngôn ngữ lập trình trực giao nhất là gì? [đóng cửa]


46

Tôi thấy mình nhiều lần khó chịu khi phải dạy cho sinh viên năm nhất về các quy tắc ngôn ngữ đặc biệt (như phân rã mảng-con trỏ) hoàn toàn không liên quan gì đến việc lập trình. Vì vậy, tôi tự hỏi:

Ngôn ngữ lập trình có số lượng quy tắc ngôn ngữ đặc biệt nhỏ nhất là gì, trong đó mọi thứ đều thuộc hạng nhất và có thể được soạn thảo mà không bị hạn chế kỹ thuật gây phiền nhiễu? Một ngôn ngữ như vậy sẽ không phải là ngôn ngữ giảng dạy hoàn hảo?

Người điều hành Lưu ý

Chúng tôi đang tìm kiếm câu trả lời dài cung cấp một số giải thích và bối cảnh. Đừng chỉ liệt kê một ngôn ngữ: vui lòng giải thích lý do tại sao bạn nghĩ ngôn ngữ đó trả lời câu hỏi. Câu trả lời không giải thích bất cứ điều gì sẽ bị xóa. Xem chủ quan tốt, chủ quan xấu để biết thêm thông tin.


1
Hãy thử sử dụng Unlambda - gần với số khối xây dựng ngôn ngữ nhỏ nhất có thể. Một câu trả lời nghiêm túc hơn một chút: Lược đồ (R5RS cụ thể).
SK-logic

@ SK-logic, Unlambda không trực giao vì I=SKK. Cuối cùng trong các ngôn ngữ trực giao là các ngôn ngữ đơn hướng dẫn như Jot và RSSB.
Peter Taylor

11
@Peter - Tôi không nghĩ anh ấy có nghĩa là tối thiểu. Một ngôn ngữ tối thiểu chỉ kết thúc với tất cả các định nghĩa bổ sung trong thư viện, vì vậy các sinh viên phải học chúng theo một trong hai cách. Cách tôi đọc câu hỏi này là "ngôn ngữ nào tuân theo nguyên tắc ít bất ngờ nhất?".
Steve314

1
@Peter Taylor: bạn có thể cung cấp một ví dụ về việc Timtowtdi xung đột với tính trực giao?
keppla

1
Tôi nghĩ rằng tính trực giao của người Viking là một lựa chọn từ ngữ kém ở đây. Như Peter và Steve đã thiết lập, những gì bạn thực sự muốn nói là nguyên tắc ít gây ngạc nhiên nhất, hoặc một số chất lượng liên quan chặt chẽ.
Konrad Rudolph

Câu trả lời:


53

Khi nói đến 'rất ít quy tắc', tôi sẽ tranh luận, Lisp hoặc Smalltalk sẽ thắng. Cú pháp trần có thể được viết trên một tab bia.

Nhưng theo kinh nghiệm của tôi, sự đơn giản của Lisp và Smalltalk không có nghĩa là chúng đơn giản dễ hiểu và dễ dạy. Mặc dù không phải là cách 'thuần túy', nhưng theo kinh nghiệm của tôi, phong cách cần làm trong danh sách các ngôn ngữ mệnh lệnh là dễ nắm bắt nhất đối với người mới.

Do đó, tôi sẽ đề xuất Python, Ruby hoặc một cái gì đó trừu tượng tương tự : Bạn tìm thấy (gần như) mọi khái niệm cơ bản trong chúng (OK, không có con trỏ), nhưng bạn không cần phải hiểu nó ngay từ đầu để làm cho một cái gì đó hoạt động.


33
cú pháp đo công việc ấn tượng trong các đơn vị của một tab bia.
psr

3
Và đừng quên Perl. Nhiều Perl ngoài kia hơn hầu hết mọi người nghĩ, và cộng đồng người dùng là rất lớn .
Randal Schwartz

20
Perl có thể rất mạnh mẽ, nhưng một anh chàng nhận thấy đó là con đường dễ nhất để lập trình phải có đường hầm tương đương với các đền thờ của Indiana Jones làm hành lang chính từ phòng ngủ đến vòi hoa sen của anh ta ...
Kheldar

9
Cú pháp của Perl có thể vừa với một tab bia, miễn là bạn uống đủ bia.
Dave Sherohman

4
@Randal, câu hỏi yêu cầu một ngôn ngữ trực giao . Triết lý của Perl là không trực giao - "có nhiều hơn một cách để làm điều đó".
Peter Taylor

41

Tôi muốn nói LISP, hoặc Scheme hoặc một ngôn ngữ từ gia đình đó sẽ là trực giao nhất. Với let, lambda, define, if, cons, list, và ( )bạn có thể dạy khá nhiều bất cứ điều gì bạn muốn trong một khóa học giới thiệu. Cũng không cần chỉ thị tiền xử lý hoặc những int main()thứ tương tự mà sinh viên chỉ đưa vào nhưng không thấy lý do.

Trong các khóa học CS giới thiệu của tôi, chúng tôi đã làm rất nhiều điều tuyệt vời với Scheme: triển khai máy Turing, triển khai máy tính TC-201, viết ngữ pháp không ngữ cảnh, sử dụng đệ quy, viết hợp nhất và chèn sắp xếp, triển khai các trình bổ sung và hàng tấn những thứ khác.

Tôi đã thực hiện Java trong AP comp sci trước khi học đại học, nhưng Scheme rất tuyệt vì tôi có thể cắt giảm sự lộn xộn và tập trung vào các khái niệm thực tế trong chương trình của mình. Đó là một lớp học tuyệt vời và tôi rất khuyên bạn nên thử nó cho việc giảng dạy của bạn.


5
Đồng ý. Vợt (trước đây là PLT Scheme) là một biến thể Scheme thân thiện hơn một chút mà trường chúng tôi sử dụng rất thành công trong các lớp học giới thiệu.
NickAldwin

3
Haskell thì sao? Tôi không biết nhiều về Haskell, nhưng tôi hy vọng nó sẽ là ngôn ngữ trực giao.
Giorgio

4
@Giorgio: Cú pháp của Haskell khá phức tạp, mặc dù tôi đoán chỉ có một tập hợp con. Việc bạn phải tương tác với các đơn vị IO ngay từ đầu để có được bất kỳ chương trình thú vị nào là một điều khó chịu khi đưa ra mục tiêu OP.
Matthieu M.

4
Đối với "trực giao", tôi bỏ phiếu cho Đề án, đặc biệt là việc triển khai Vợt . Môi trường của vợt được thiết kế để làm cho con đường của người học dễ dàng hơn so với những thứ như Common Lisp thô. Ngôn ngữ là sạch sẽ, với một vài quy tắc, thực sự. Từ lâu, MIT đã quyết định sử dụng Scheme để dạy sinh viên năm nhất, sử dụng cuốn sách SICP . Những sinh viên sống sót dường như hoạt động khá tốt trên thị trường. Tuy nhiên, phương pháp này sẽ không trực tiếp dạy sinh viên cách viết mã cấp thương mại bằng các ngôn ngữ được sử dụng phổ biến nhất.
John Tobler

2
Đúng! Thực tế là Scheme hoàn toàn khác với hầu hết các ngôn ngữ "thực" cho phép bạn tập trung vào lập trình chứ không phải API. Scheme học tập giống như " wax on, wax off " của tiền mã hóa; có vẻ như lãng phí thời gian cho đến khi bạn nhận ra bạn có hiểu biết sâu sắc hơn về máy tính so với trước đây.
benzado

17

Pascal được thiết kế đặc biệt để dạy lập trình. Thật dễ để học (đó là một trong những ngôn ngữ lập trình đầu tiên tôi học được).


3
Tôi cũng đã học lập trình bằng Pascal và tôi thấy đó là một ngôn ngữ rất sạch sẽ. Tính năng không trực giao duy nhất tôi có thể nghĩ đến là cú pháp của các thủ tục writeln () và readln (), có số lượng đối số thay đổi và cho phép chỉ định định dạng.
Giorgio

Tôi thấy đó là một ngôn ngữ rất bực bội. Nhưng tôi có thể đang chiếu, vì tôi có một người hướng dẫn rất, rất tệ.
greyfade

14

Logo: nó vẫn còn sống và đá !

; draws a triangle
FORWARD 100
RIGHT 120
FORWARD 100
RIGHT 120
FORWARD 100
RIGHT 120

Nó có vẻ giống như một món đồ chơi hơn là ngôn ngữ lập trình, nhưng nó sẽ không phải là bước đầu tiên tồi tệ đối với nhiều người. Cú pháp rất đơn giản, nhưng rùa cung cấp một hình thức phản hồi cụ thể hơn so với hầu hết các ngôn ngữ / môi trường. Cố gắng tạo ra một hình dạng cụ thể là một cách tuyệt vời để tìm hiểu quá trình suy nghĩ trước để giải quyết vấn đề.

Tuy nhiên, nếu bạn có ác cảm với rùa, tôi thực sự nghĩ rằng Scheme là con đường để đi.


1
Dù bạn có tin hay không, Logo là một Lisp, giống như Scheme. Hầu hết người dùng không nhận được đủ xa ngoài đồ họa rùa & vòng lặp đơn giản để tìm hiểu điều này.
Sean McS Something 28/2/13

@SeanMcS Something Điều đó thật thú vị, tập trung vào các hiệu ứng phụ (di chuyển rùa) thay vì đánh giá các biểu thức.
benzado

10

Tôi sẽ đề xuất cả SML và Haskell. Tính trực giao đã là một điểm thiết kế chính cho cả hai. Cụ thể, cốt lõi của SML (nghĩa là phần ngôn ngữ không liên quan đến tính mô đun) gần như là một phép tính lambda được gõ. Kết quả là, hầu hết các tính năng ngôn ngữ được điều khiển bởi các loại và các loại lần lượt điều khiển các hình thức giới thiệu và loại bỏ cho các giá trị. Điều này là khá nhiều lý tưởng.

Có một vài loại mụn cóc không theo lý thuyết ở cả hai ngôn ngữ (eqtypes trong SML, seq ở Haskell) nhưng chúng vẫn đánh bại mọi thứ khác về các tương tác kỳ lạ của các tính năng ngôn ngữ không liên quan.


7

Dù lựa chọn thế nào, tôi cũng mong muốn được dạy một ngôn ngữ thực sự của người Viking . Dạy ngôn ngữ đồ chơi có hiệu quả với một số người, nhưng đối với những người khác, điều đó rất, rất bực bội do sự mất kết nối với thế giới thực. Một số người cần sự phù hợp trong thế giới thực như một động lực học tập, và đó không phải là nơi để chúng ta đánh giá chiến lược học tập này (thực tế, đó là một quan niệm sai lầm phổ biến).

Điều này không đủ tiêu chuẩn cho các ngôn ngữ như Logo, mà cả các ngôn ngữ dành riêng cho tên miền như Xử lý . Mặc dù cái sau cực kỳ hữu ích cho một số thứ nhất định (ví dụ: sản xuất đồ họa thông tin), việc sử dụng quá hạn chế cho hầu hết các mục đích sử dụng (và do đó hầu hết người dùng). Điều này cũng loại trừ Gofer , một tập hợp con Haskell vô dụng. Nó cũng loại trừ Pascal vì mặc dù cái sau đã được sử dụng trong các dự án thực tế, nhưng nó không còn phù hợp nữa và đơn giản là thiếu các tính năng thiết yếu (ví dụ: chuỗi tích hợp).

Về các ngôn ngữ thực tế, tôi đồng ý với những ngôn ngữ đã được đề cập: phương ngữ Lisp hoặc Scheme hiện đại, Haskell, Python hoặc Ruby. Cá nhân, tôi có thể sử dụng Python nhưng tất cả các lựa chọn đó đều có những ưu điểm và nhược điểm.


2
Thật sai lầm khi cho rằng việc dạy một ngôn ngữ "thực" là cách để cung cấp sự phù hợp trong thế giới thực. Công việc của giáo viên là chỉ ra cách ngôn ngữ "đồ chơi" liên quan đến các kỹ năng trong thế giới thực. Học cách tung hứng bằng cách bắt đầu bằng dao không có nghĩa là bạn đang học các kỹ năng tung hứng có liên quan hơn.
benzado

3
@benzado Bạn hiểu nhầm quan điểm của tôi. Nếu bạn học một ngôn ngữ đồ chơi, bạn phải chuyển các kỹ năng của mình để khiến chúng phù hợp với các vấn đề trong thế giới thực. Toàn bộ quan điểm của tôi là việc chuyển tiền này là một sự bổ sung bổ sung, chủ động ngăn cản một số người học tập . Những người khác nhau học theo những cách cực kỳ khác nhau, và một số người thực sự cần sự trực tiếp này. Học cách tung hứng với dao không phải là điều tương tự. Sự tương tự thực sự sẽ là với việc học lập trình bằng cách viết một hệ thống dẫn đường tên lửa trực tiếp như dự án đầu tiên, và tôi không bao giờ đề xuất điều đó.
Konrad Rudolph

3
Tôi nhận được quan điểm của bạn. Chúng tôi chỉ không đồng ý. Tôi nghĩ việc chuyển trường rất quan trọng, nó đòi hỏi học sinh phải hiểu sâu hơn một người có chiến lược đoán thành công (ví dụ, một người "giải quyết" các vấn đề từ ngữ bằng cách chọn ra các số và cắm chúng vào các công thức ở đầu chương ). Nói cách khác, nếu họ không thể chuyển những gì họ đã học, họ sẽ không bao giờ học được nó ngay từ đầu. Để giữ cho sinh viên có động lực, bạn chỉ cần chọn đúng vấn đề, điều này rất quan trọng bất kể ngôn ngữ, "thực" hay "đồ chơi".
benzado

@benzado Chuyển quan trọng, không có đối số ở đó. Nhưng đó là toàn bộ 'kỷ luật cần được dạy và một số học sinh không sở hữu nó. Bên cạnh đó, phần hiểu biết sâu sắc hơn của người Viking cũng đúng, nhưng cũng bên cạnh vấn đề: đây đã là một trạng thái tiên tiến cần phải đạt được . Một khi các sinh viên đã học được nó, thì họ có thể chuyển nó. Nhưng trước tiên họ cần học, và để làm được điều đó, một số sinh viên cần sự liên quan. Chuyển đến sau.
Konrad Rudolph

Trong toán edu (nơi tôi có một lượng kinh nghiệm nhỏ), "Học mà không hiểu" là một vấn đề lớn: tập trung vào cách làm mà không cần tại sao . Yêu cầu của tôi là nếu bạn dạy các khái niệm về lập trình, một ngôn ngữ đồ chơi sẽ hoạt động tốt và nếu bạn thành công , việc chuyển sang ngôn ngữ "thực" sẽ không khó. (Nếu việc chuyển trường khó khăn, bạn đã dạy các quy trình, không phải các khái niệm.) Một môi trường đồ chơi không ngăn cản mọi người học tập, nhưng nó đòi hỏi phải lập kế hoạch bài học tốt để thu hút. (Tôi thích chủ đề này nhưng tôi nghĩ rằng chúng tôi đã chuyển qua lãnh thổ thảo luận và người điều hành sẽ không hài lòng.)
benzado

6

Tcl có 12 quy tắc chi phối toàn bộ ngôn ngữ.

[1] Commands. 
[2] Evaluation. 
[3] Words. 
[4] Double quotes. 
[5] Argument expansion. 
[6] Braces. 
[7] Command substitution. 
[8] Variable substitution.
[9] Backslash substitution.
[10] Comments. 
[11] Order of substitution. 
[12] Substitution and word boundaries.

Có rất ít trường hợp đặc biệt hoặc các từ hoặc ký tự dành riêng.


4

Ngôn ngữ lập trình có số lượng quy tắc ngôn ngữ đặc biệt nhỏ nhất là gì, trong đó mọi thứ đều thuộc hạng nhất và có thể được soạn thảo mà không bị hạn chế kỹ thuật gây phiền nhiễu? Một ngôn ngữ như vậy sẽ không phải là ngôn ngữ giảng dạy hoàn hảo?

Để mở rộng nhận xét của tôi, trong Jot, mọi thứ đều là hạng nhất (vì đó là phép tính lambda) và có thể được soạn. Chỉ có một hướng dẫn. Đó là một ngôn ngữ giảng dạy hoàn toàn khủng khiếp.

Nói chung, tarpits Turing có rất ít quy tắc đặc biệt và yêu cầu bạn phải hiểu rất rõ các nguyên tắc cơ bản của tính toán trước khi bạn có thể làm bất cứ điều gì. Ngôn ngữ giảng dạy hoàn hảo cho phép sinh viên thử nghiệm mà không cần nhổ hết tóc, vì vậy sự trừu tượng ở cấp độ cao hơn thực sự là một điều tốt.


Cảm ơn bạn đã giới thiệu cho tôi thuật ngữ 'turing tarpit', tôi luôn cần một thuật ngữ cho loại đơn giản này.
keppla

Tôi đồng ý rằng sinh viên sẽ có thể thử nghiệm, nhưng đòi hỏi sự hiểu biết trước khi bạn có thể "làm bất cứ điều gì" có vẻ như toàn bộ quan điểm giảng dạy.
benzado

@benzado, tôi đồng ý rằng quan điểm của việc giảng dạy là truyền đạt sự hiểu biết. Nhưng với hầu hết mọi người, bạn phải bắt đầu với các khái niệm cơ bản, hãy để họ làm tròn đầu, và sau đó dạy họ các khái niệm trung gian. Vì vậy, bạn muốn có một ngôn ngữ mà một người hiểu một chút có thể viết các chương trình làm một chút. Có một lý do mà hầu hết các khóa học lập trình không bắt đầu bằng cách dạy máy Turing hoặc máy đăng ký Minsky.
Peter Taylor

1
Đúng vậy, tôi nghĩ chúng ta khác nhau về ý nghĩa của "làm một chút". Nếu bạn muốn (ví dụ) xoa dịu đội ngũ "chỉ cho tôi cách tạo trò chơi video", bạn có thể làm một số việc, nhưng họ sẽ đạt được một điểm vì họ không thể tiến bộ và thất vọng, và sau đó bạn phải quay trở lại "những phần nhàm chán" để họ có thể hiểu được để tiến về phía trước. Tại thời điểm này, họ đã thất vọng theo cách xấu và có thể bỏ cuộc; mặt khác, thực hiện "các phần nhàm chán" trước tiên và xây dựng lên có nghĩa là tiến bộ liên tục. Nhưng rõ ràng bạn không bắt đầu với một dải băng bán vô hạn.
benzado

2

Các tính năng quan trọng nhất trong một langage bạn tìm hiểu là:

  • nguyên tắc ít bất ngờ nhất (PASCAL)

  • khả năng đọc (Ada)

Theo tôi, cái thứ hai hơn cái thứ nhất, vì đọc mã thậm chí còn quan trọng hơn viết nó.

Bây giờ, một lần nữa, tôi viết C #, Java, Objective-C và Javascript để kiếm sống, tất cả đều có những điều kỳ quặc: D

Tuy nhiên, nếu tôi phải chọn một langage để bắt đầu, tôi sẽ chọn C #. Nó tương đối dễ đọc, có một vài bất ngờ nghiêm trọng (chúng thường được ẩn trong các công cụ / khung công tác MS ...) và một số lượng lớn mã để đọc và tài liệu, cả hai đều cần thiết để học tốt.


Nếu nó chỉ dành cho khả năng đọc, và không phải để gõ tĩnh và an toàn cho ada, Python và Visual basic (vâng, tôi biết, không phải cách trẻ em hay ho) có một cú pháp miễn phí lộn xộn tương tự, imho.
keppla

Có, tôi đồng ý với bạn, nhưng "nếu nó biên dịch trong Ada, nó sẽ chạy". Mặc dù vậy, không ngăn được lỗi logic, vì Ariane V có thể nói: D
Kheldar

Tôi đã suy nghĩ liệu gõ tĩnh có hữu ích cho người mới bắt đầu hay không. Nó cung cấp nhiều hỗ trợ hơn (như bánh xe huấn luyện) nhưng điều này có thể được xem là cả điều tốt và điều xấu. Nó đẩy một số trách nhiệm từ sinh viên để loại hệ thống.
Aivar

@Kainedar, không có ngôn ngữ lập trình nào có thể ngăn chặn việc quản lý như người chịu trách nhiệm cho thất bại Ariane V. Bạn nên làm bài tập về nhà này.
John R. Strohm

@ JohnR.Strohm đó chính xác là quan điểm của tôi: đôi khi đó không phải là ngôn ngữ, đó là dòng chảy kỹ thuật (ví dụ: quản lý) là thiếu sót. Theo ý kiến ​​của tôi, bạn có thể đã bình luận ít tích cực hơn.
Kheldar
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.