Có ngôn ngữ lập trình nào tuân theo cách tiếp cận phát triển tối giản không?


26

Tôi thấy rằng khi các ngôn ngữ được coi là giống như phần mềm thương mại, luôn luôn cần phải thêm các tính năng mới để biện minh cho các bản phát hành mới.

Có thể có hoặc có ngôn ngữ trong đó phiên bản 1.0 là phiên bản cuối cùng không? Tất nhiên sửa lỗi được miễn, nhưng bộ tính năng luôn giữ nguyên?

Bằng cách này, mọi tính năng trong ngôn ngữ khớp với nhau một cách độc đáo và dường như chúng không được củng cố sau khi thực tế với các tính năng lỗi thời vẫn còn tồn tại vì khả năng tương thích ngược.

Tôi giả sử một số ngôn ngữ học thuật là như thế này? Nhưng có ngôn ngữ thương mại thành công theo ý tưởng này? Thư viện đi kèm cũng miễn phí để có các tính năng mới, nhưng ngôn ngữ luôn không đổi.

Một ví dụ tôi có thể đưa ra là, một trong những ngôn ngữ yêu thích của tôi C #, mà tôi sử dụng khá thường xuyên, ngày càng có nhiều tính năng được thêm vào mỗi bản phát hành. Để tận dụng những lợi thế này, tôi phải bỏ các nhiệm vụ thực tế trong tay và dành thời gian đáng kể để học chúng thay vì có thể chọn ra các khái niệm tầm thường và kết hợp chúng với nhau để giải quyết các vấn đề phức tạp hơn một cách dễ dàng.

Vì vậy, tôi đoán rằng tôi đang tìm kiếm một cách tiếp cận tối giản, nơi mọi thứ đều nhất quán, có ý nghĩa và càng trực giao càng tốt.


7
Một lĩnh vực công việc của hầu hết các nhà phát triển là giải quyết vấn đề một cách hiệu quả. Hiệu quả đòi hỏi phải học những điều mới, liên tục. Các tính năng ngôn ngữ mới, khung mới, công cụ mới được phát triển để có hiệu quả hơn. Bằng cách học chúng, bạn thực sự tập trung vào công việc của mình.
Arseni Mourzenko

4
Vâng, không phải ai lập trình cũng nhất thiết phải là lập trình viên toàn thời gian. Nó chỉ là một công cụ cho nhiều ngành nghề khác.
Joan Venge

4
Sau đó, một lần nữa, không ai bắt bạn phải học bất cứ điều gì. Nếu C # 1.0 giải quyết các yêu cầu của bạn, đừng lãng phí thời gian để học thứ gì đó bạn không cần.
Arseni Mourzenko

11
Tôi nghĩ câu hỏi này là hợp pháp: tại sao chúng ta nên áp dụng các nguyên tắc KISS và YAGNI cho các đồ tạo tác phần mềm mà không áp dụng cho các ngôn ngữ lập trình? Khi một ngôn ngữ có đủ các tính năng cốt lõi, sự phát triển hơn nữa (IMHO) chủ yếu là do tiếp thị (cạnh tranh với các ngôn ngữ khác buộc các công ty phải nhồi nhét ngôn ngữ với các tính năng để giữ khách hàng của họ).
Giorgio

2
@MainMa: "Hiệu quả đòi hỏi phải học hỏi những điều mới, liên tục.": Một ngôn ngữ lập trình phức tạp, chứa quá nhiều tính năng có thể làm giảm hiệu quả thay vì tăng nó. Ví dụ, trong một nhóm, nó có thể dẫn đến các nhà phát triển khác nhau sử dụng các tập hợp ngôn ngữ khác nhau, làm cho các đánh giá mã, sửa lỗi và bảo trì kém hiệu quả hơn.
Giorgio

Câu trả lời:


32

Lisp, Smalltalk. Thật trùng hợp, đó cũng là những ngôn ngữ tốt nhất trong toàn bộ.

Cả Lisp và Smalltalk đều là những ngôn ngữ được xây dựng xung quanh phép ẩn dụ thống nhất mạnh mẽ. Ẩn dụ của Lisp là "mọi thứ đều là danh sách; danh sách này đại diện cho cả dữ liệu và mã (dưới dạng hàm)". Ẩn dụ của Smalltalk là "mọi thứ đều là một đối tượng, cách duy nhất để gọi một hành vi là truyền thông điệp đến một đối tượng". Những ẩn dụ này cho phép các ngôn ngữ ổn định, tối thiểu và mạnh mẽ. Phần còn lại là trong thư viện.

Những thứ được gọi là "cấu trúc điều khiển" trong tất cả các ngôn ngữ không tối thiểu (tôi muốn viết "cồng kềnh"), là một phần của thư viện ở đây (ví dụ: condhàm in lisp; ifTrue:/ ifFalse:họ các thông báo trong Smalltalk đều thực hiện một điều kiện, nơi các ngôn ngữ khác có iftừ khóa).

Có thể thấy rằng Lisp / Smalltalk là hiện thân gần như tối thiểu của mô hình của họ và không có gì nữa (Lisp: lập trình chức năng; Smalltalk: lập trình hướng đối tượng).


4
Các triển khai Lisp tốt có thể cạnh tranh với C, các triển khai Smalltalk tốt có thể cạnh tranh với C ++. Heck, HotSopt JVM của Oracle, máy ảo nhanh nhất trên hành tinh, một máy ảo Smalltalk, nó thậm chí không sử dụng thông tin kiểu tĩnh để tối ưu hóa.
Jörg W Mittag


9
Câu trả lời này là quá nhỏ để có thể xây dựng. Thiếu chi tiết hoặc bằng chứng hỗ trợ.
Jimmy Hoffa

2
-1 Lisp? LISP ? Nghiêm túc? Sau các cuộc chiến LISP của những năm 1970, việc lặp đi lặp lại cố gắng thống nhất LISP và cuối cùng là Lisp chung? Không, ngay cả LISP cũng không làm cho nó "hoàn thành" ở mức 1.0.
Ross Patterson

1
Tôi nghĩ rằng bạn đã chỉ ra một ý tưởng rất quan trọng: một ngôn ngữ nên được xây dựng xung quanh một (hoặc một vài) phép ẩn dụ mạnh mẽ, thống nhất, tức là một ngôn ngữ lập trình sẽ cung cấp cho bạn cách sắp xếp suy nghĩ của bạn. Tôi nghĩ rằng sự phức tạp của một số ngôn ngữ một phần là do thiếu một phép ẩn dụ như vậy: những ngôn ngữ này tiếp tục phát triển bằng cách kết hợp các tính năng mới vì chúng không có quan điểm thống nhất cơ bản.
Giorgio

6

TeX , hệ thống sắp chữ, đã rất ổn định kể từ phiên bản 3.

Kể từ phiên bản 3, TeX đã sử dụng một hệ thống đánh số phiên bản bình dị, trong đó các bản cập nhật đã được chỉ định bằng cách thêm một chữ số phụ ở cuối thập phân, để số phiên bản tiếp cận một cách bất thường. Đây là một phản ánh của thực tế là TeX hiện đang rất ổn định và chỉ có các cập nhật nhỏ được dự đoán. Phiên bản hiện tại của TeX là 3.1415926; nó được cập nhật lần cuối vào tháng 3 năm 2008. Thiết kế đã bị đóng băng sau phiên bản 3.0 và không có tính năng mới hoặc thay đổi cơ bản nào được thêm vào, vì vậy tất cả các phiên bản mới hơn sẽ chỉ có sửa lỗi. Mặc dù chính Donald Knuth đã đề xuất một vài lĩnh vực mà TeX có thể được cải thiện, ông nói rằng ông tin chắc rằng việc có một hệ thống không thay đổi sẽ tạo ra cùng một sản lượng hiện tại và trong tương lai quan trọng hơn là giới thiệu các tính năng mới. Vì lý do này, ông đã tuyên bố rằng "

Tôi sẽ không tuyên bố rằng nó đáp ứng "Vì vậy, tôi đoán rằng tôi đang tìm kiếm một cách tiếp cận tối giản, nơi mọi thứ đều nhất quán, có ý nghĩa và càng trực giao càng tốt." tuyên bố, nhưng nó đáp ứng hầu hết các tiêu chí khác của bạn.


6

C và Fortran là những ngôn ngữ nảy ra trong đầu. Họ rất ổn định và cú pháp của họ dễ dàng được chứa trong tâm trí của một người. Khác với việc tự viết mã xấu, có rất ít bất ngờ khi sử dụng các ngôn ngữ này. Nhưng tôi sẽ không giữ chúng như những ngôn ngữ tuyệt vời để phát triển ứng dụng nhanh chóng.

Tôi thích sự tiến bộ nhanh chóng của các ngôn ngữ với các tính năng mà một khi tôi dành một chút thời gian cho chúng, làm cho công việc của tôi dễ dàng hơn đáng kể và mã ít phức tạp hơn trong khi duy trì tính biểu cảm.


1
Tôi đồng ý với thiết kế tối giản của C. Ngay cả khi ngôn ngữ được cập nhật trong những năm qua, mô hình thiết kế và lập trình cơ bản của ngôn ngữ vẫn có thể nhận ra (các ngôn ngữ khác trải qua một cuộc cách mạng cứ sau 5 đến 10 năm). Tất nhiên, C không phải là ngôn ngữ có mục đích chung như trước đây, bởi vì nó đã được thay thế bằng các ngôn ngữ khác trong các miền ứng dụng cụ thể (ứng dụng máy tính để bàn, ứng dụng web, v.v.).
Giorgio

@Giorgio: Không phải tất cả. Những cái tối thiểu (như những cái tôi đã đề cập) không. Không có thay đổi trong cú pháp Smalltalk kể từ khi ra đời ngoại trừ một cú pháp, được đưa vào bởi Squeak: các mảng được tính toán theo kiểu xoăn. Thư viện cũng rất ổn định ở cốt lõi ( BehaviorCollectionphân cấp). Dường như với tôi rằng C kém ổn định hơn rất nhiều với tất cả những C89, C99 và không có gì.
herby

1
@herby: Có lẽ bạn đúng khi các ngôn ngữ khác như Smalltalk ổn định hơn C. Tuy nhiên, mô hình lập trình cơ bản của C vẫn giống như trước đây, 20 năm trước. Các ngôn ngữ khác đã trải qua những thay đổi sâu sắc. Vì vậy, một lần nữa, tôi không cho rằng C là ngôn ngữ ổn định nhất xung quanh, tuy nhiên, IMO nó ổn định hơn nhiều ngôn ngữ chính khác.
Giorgio

6

Những người khác đã nói Lisp vì vậy tôi phải đưa Forth lên . Nó rất dễ thực hiện và các quy tắc của ngôn ngữ là đơn giản để làm theo.

Nó là một ngôn ngữ dựa trên ngăn xếp với một từ điển "từ". Bạn có thể dễ dàng mở rộng ngôn ngữ bằng cách sử dụng một số tính năng kế thừa.

Một ví dụ RẤT ngắn về đồ họa rùa:

\ 8.8 fixed point sine table lookup
-2 var n F9F2 , E9DD , CEBD , AA95 , 7F67 , 4E34 , 1A c,
: s abs 3C mod dup 1D > if 3C swap - then dup E > if
  -1 1E rot - else 1 swap then n + c@ 1+ * ;

0 var x 0 var y 0 var a
0 var q 0 var w 
: c 9380 C80 0 fill ; \ clear screen
: k >r 50 + 8 << r> ! ;
: m dup q @ * x +! w @ * y +! ; \ move n-pixels (without drawing)
: g y k x k ; \ go to x,y coord
: h dup a ! dup s w ! 2D + s q ! ; \ heading
: f >r q @ x @ y @ w @ r 0 do >r r + >r over + \ forward n-pixels
  dup 8 >> r 8 >> plot r> r> loop o y ! x ! o r> o ;
: e key 0 vmode cls ; \ end
: b 1 vmode 1 pen c 0 0 g 0 h ; \ begin
: t a @ + h ; \ turn n-degrees

Sau đó chạy nó với : squiral -50 50 g 20 0 do 100 f 21 t loop ;cung cấp cho bạn:

xoắn ốc

Tín dụng cho blog của nhân viên Microsoft này .


1
Làm thế nào điều này được nâng cấp một lần nữa? Forth có thể là một ứng cử viên tốt, nhưng ví dụ đưa ra không tốt hơn nhiều so với nhiễu đường thực thi; một ví dụ điển hình về lý do tại sao nỗi ám ảnh về sự căng thẳng của PLT lại phản tác dụng với những gì các chuyên gia thực sự cần.
Telastyn

4
@Telastyn Đó không phải là câu hỏi của anh ấy.
Austin Henley

4

Mặc dù Lisp đã được đề cập, ngôn ngữ tối giản nhất mà tôi biết là lược đồ . Tôi đã có một thời gian khó khăn để hiểu nó trong các khóa học đại học nơi tôi phải. Nhưng nó đã thay đổi cách nghĩ của tôi về lập trình, và nó rất tối thiểu. Tối thiểu như toàn bộ cú pháp của nó là Dấu ngoặc đơn ()và dấu cách.

Sự thay đổi duy nhất trong ngôn ngữ là quyết định chuyển đổi các nguyên thủy như +, define(và một số thứ khác) sang tích hợp sẵn. Có nghĩa là chúng có sẵn khi khởi chạy, nhưng có thể được xác định lại trong thời gian chạy.


2

Tcl, được thiết kế để tối giản ngay từ đầu

Từ đó về trang http://www.tcl.tk/about/features.html , một trong những tính năng là nó rất dễ học và nơi các lập trình viên thông thường hoặc thậm chí không lập trình viên có thể sử dụng nó.


3
Điều này nghe có vẻ chính xác với tôi, nhưng câu trả lời một dòng không có thông tin hỗ trợ hoặc chi tiết có chất lượng quá thấp sẽ không hữu ích cho bất kỳ ai. Vui lòng thêm một số chi tiết tốt (và không chỉ là một liên kết không có tóm tắt về nó) và bạn sẽ nhận được một phiếu bầu từ tôi
Jimmy Hoffa

ok, sẽ làm mặc dù câu hỏi đã bị đóng không biết giá trị của nó là bao nhiêu
Egryan

1
Với may mắn, nó sẽ được mở lại từ phiếu bầu. Đó là một câu hỏi hay. Tôi có thể đăng lên Meta để thử và mở lại nếu cộng đồng không mở lại sớm.
Jimmy Hoffa

Tôi đồng ý và tôi dự định thêm nhiều hơn vào bài đăng sau khi tôi nghỉ làm, tôi không gặp may mắn nhanh chóng với việc tìm các liên kết có liên quan
Egryan

Tìm kiếm trên google cho "Nghiên cứu điển hình về ngôn ngữ TCL", "Tcl: Ngôn ngữ lệnh có thể nhúng" và tcl.tk/about/history.html - họ đưa ra một số điểm chính. Tuy nhiên, tôi không chắc họ đã sao lưu mong muốn của OP - có vẻ như TCL đã được mở rộng từ bản gốc 1.0 (xem wiki.tcl.tk/1721 )

2

Có một số ngôn ngữ vẫn không thay đổi kể từ khi ra đời bên ngoài ngôn ngữ bí truyền mà không phải là ngôn ngữ mong muốn (tôi rất ghét thử viết một cái gì đó có ý nghĩa trong Befunge (mặc dù nó cũng đã được sửa đổi từ bản gốc 1.0 giải phóng)).

Các ngôn ngữ có khả năng lấp đầy mong muốn không phải học bất cứ điều gì mới là các ngôn ngữ chuyên về 'keo' giữa các chương trình khác. Các ngôn ngữ như jcl , bash, và tương tự. Ngôn ngữ kịch bản đơn giản cũng có thể rơi vào điều này - awk là một trong những nhà lãnh đạo.

Một khi rời khỏi cõi này, sự phát triển xảy ra. Hoặc ngôn ngữ hoặc khung. Trong một số trường hợp, thật khó để viết mã cho ngôn ngữ mà không nhận được một số khung đang quay vòng nhanh chóng.

Nhiều ngôn ngữ có một số mức độ tương thích ngược. Người ta vẫn có thể viết Java 1.4 ngày hôm nay, mặc dù điều đó có thể không được khuyến nghị - các khung công tác mà mọi người viết cho nó đang thay đổi nhanh hơn ngôn ngữ. Người ta vẫn có thể tìm thấy trình biên dịch f77 và f90 ngoài kia cho một thông số ngôn ngữ đã không thay đổi sau 20 hoặc 40 năm. C, Objective C, C ++ vẫn có thể được mã hóa theo các thông số kỹ thuật cũ hơn của ngôn ngữ - người ta không cần phải cập nhật mã của một người vì một thông số mới đã được phát hành hoặc một khung công tác mới được đưa ra.

Một số ngôn ngữ có một lịch sử không thay đổi khá dài vì bản thân ngôn ngữ này đủ mạnh để làm bất cứ điều gì mà người ta muốn. Lisp là ứng cử viên chính trong lĩnh vực này. Forth cũng rơi vào cõi "nó không thay đổi nhiều".

Đi đến các ngôn ngữ kịch bản truyền thống hơn, hãy nhìn vào TCL, Perl và Python. Tránh những thứ hiện đang ở trong thế giới 'mốt' đang trải qua sự bùng nổ về sự nổi tiếng vì lý do này hay lý do khác (ruby và javascript, tôi đang nhìn bạn). TCL đã thay đổi qua nhiều năm , mặc dù một trong những mục tiêu của nó là cố gắng duy trì tính nhất quán của thiết kế. Cả Perl và Python hiện đại đều có một số tính nhất quán của thiết kế, mặc dù các tính năng mới được thừa nhận có thể cảm thấy được củng cố (mặc dù người ta không cần sử dụng chúng).


2

Tôi nghĩ Python là một ứng cử viên hợp lý cho một ngôn ngữ với chủ nghĩa tối giản là một trong những mục tiêu thiết kế của nó. Nó dựa trên một số lượng tương đối nhỏ các khái niệm cốt lõi và phiên bản 3 đã cố gắng, trong số những thứ khác, đơn giản hóa ngôn ngữ một chút bằng cách loại bỏ một số tính năng.

.


Ngày trả lời tháng 12 năm 2012 cung cấp cho bạn một lượt miễn phí, bởi vì kể từ đó chúng ta có sự quái dị được gọi là Python 3, đối thủ của C ++ khi muốn thêm một đống rác, trong khi thực sự loại bỏ sự đơn giản. Bây giờ nó là một trong những ngôn ngữ bị nhiễm addon ngoại lai nhất trong điện toán.
Thomas Browne

-1

Tôi nghĩ phương pháp thiết kế "tối giản" sẽ được Tcl minh họa. Ví dụ: bạn có thể sử dụng lệnh {Catch} với các giá trị {return -code n} để thực hiện bất kỳ cấu trúc điều khiển nào mà trí tưởng tượng của bạn có thể hình dung, Perl phải đợi một thập kỷ để (chính thức) có được {switch} - (không phải là Perl bao giờ cần nó). Ngoài ra, bạn sẽ thấy rằng Dodekalogue http://wiki.tcl.tk/10259 bao gồm hoàn toàn ngữ pháp của Tcl - phần còn lại, bất kỳ mô hình lập trình nào bạn muốn làm việc, đều có thể được thể hiện bằng ngữ pháp này.


điều này chỉ lặp đi lặp lại điểm được thực hiện và giải thích trong một câu trả lời được đăng cách đây hai năm
gnat

Nhắc đến bài viết gốc tôi đoán tôi chỉ có thể nói orthogonality = history (họ ngôn ngữ C) và sự đồng hóa ngôn ngữ chéo gần đây; Tôi đã thấy trên các hệ điều hành lang một cách tiếp cận giữa tất cả các ngôn ngữ đối với các khung web MVC, coroutines, & c. Ngoài xu hướng đó, tôi có thể lưu ý đến việc bổ sung đáng chú ý các lần đóng cửa cho C11 và Java lambda sắp tới (cả hai đều phát triển nhân bản trong các langs "kịch bản lệnh" của hệ điều hành).
dùng132043
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.