Bạn muốn các nhà thiết kế ngôn ngữ chú ý đến điều gì? [đóng cửa]


38

Mục đích của câu hỏi này không phải là để tập hợp một danh sách các tính năng ngôn ngữ lập trình mà bạn không thể sống thiếu, hoặc điều ước là ngôn ngữ chính bạn chọn. Mục đích của câu hỏi này là mang đến những góc sáng của thiết kế mòn mỏi mà hầu hết các nhà thiết kế ngôn ngữ có thể không nghĩ tới. Vì vậy, thay vì suy nghĩ về tính năng ngôn ngữ X, hãy suy nghĩ một cách triết lý hơn một chút.

Một trong những thành kiến ​​của tôi, và có lẽ nó có thể gây tranh cãi, đó là khía cạnh mềm hơn của kỹ thuật - các hệ thống và những gì cho - quan trọng hơn nhiều lần so với mặt cụ thể hơn. Ví dụ, Ruby được thiết kế với mục tiêu đã nêu là cải thiện hạnh phúc của nhà phát triển. Mặc dù ý kiến ​​của bạn có thể được trộn lẫn về việc nó có được đưa ra hay không, thực tế đó là một mục tiêu có nghĩa là một số lựa chọn trong thiết kế ngôn ngữ bị ảnh hưởng bởi triết lý đó.

Xin đừng đăng:

  • Cú pháp ngọn lửa chiến tranh. Hãy đối mặt với điều đó, chúng tôi có sở thích của mình và cú pháp rất quan trọng vì nó liên quan đến thiết kế ngôn ngữ. Tôi chỉ muốn tránh những trận chiến hoành tráng về bản chất của emacs so với VI (mà một số lượng lớn người ngày nay không biết gì về nó).
  • "Bất kỳ ngôn ngữ nào không có tính năng X đều không xứng đáng tồn tại". Có ít nhất một lý do để tất cả các ngôn ngữ lập trình tồn tại - tốt hay xấu.

Hãy làm bài:

  • Những ý tưởng triết học mà các nhà thiết kế ngôn ngữ dường như bỏ lỡ.
  • Các khái niệm kỹ thuật dường như được thực hiện kém thường xuyên hơn không. Vui lòng cung cấp một ví dụ về nỗi đau mà nó gây ra và nếu bạn có bất kỳ ý tưởng nào về cách bạn muốn nó hoạt động.
  • Những điều bạn muốn là trong thư viện chung của nền tảng nhưng hiếm khi. Một mã thông báo giống nhau, những thứ thường có trong một thư viện chung mà bạn muốn không có.
  • Các tính năng khái niệm như được hỗ trợ trong kiểm tra / xác nhận / hợp đồng / hỗ trợ xử lý lỗi mà bạn muốn tất cả các ngôn ngữ lập trình sẽ thực hiện đúng - và xác định đúng.

Tôi hy vọng rằng đây sẽ là một chủ đề thú vị và kích thích.

Chỉnh sửa: Làm rõ những gì tôi muốn nói bởi Syntax Flame Wars. Tôi không cố gắng tránh tất cả các cuộc thảo luận về cú pháp, đặc biệt vì cú pháp là một phần cơ bản của thiết kế ngôn ngữ chương trình.


Nói rằng cú pháp chỉ là một chi tiết thực hiện là hoàn toàn sai. Thiết kế cú pháp là một phần cơ bản quan trọng của việc thiết kế một ngôn ngữ. Và rất nhiều các điểm mà bạn làm muốn xem posted thực sự có thể liên quan đến cú pháp. Lòng thương hại. Có vẻ như một câu hỏi thú vị.
Konrad Rudolph

Điều tôi muốn tránh là cuộc chiến ngọn lửa. Nếu bạn có thể thảo luận về cú pháp mà không bắt đầu một cuộc chiến rực lửa, hãy tìm nó.
Berin Loritsch

Câu trả lời:


49

Hỗ trợ Unicode theo mặc định

Ngày và tuổi này, các chương trình đang được phát triển để sử dụng trên phạm vi quốc tế hoặc theo giả định rằng chúng có thể được sử dụng trên phạm vi quốc tế. Họ phải cung cấp hỗ trợ cho các bộ ký tự của họ hoặc khiến các chương trình được viết bằng ngôn ngữ đó trở nên vô dụng.


2
+1 Trên thực tế, chính ngôn ngữ sẽ cho phép bạn sử dụng bất kỳ ký tự nào cho số nhận dạng của mình. Chúng tôi không phải tất cả tiếng Anh.
Berin Loritsch

13
@Berin: Thật ra, mặc dù tôi là người Pháp nhưng tôi rất thích các chương trình tiếng Anh. Vấn đề là do giao tiếp, nếu bạn viết chương trình với các định danh Hungary, Tây Ban Nha hoặc Bồ Đào Nha, đừng hy vọng tôi có thể nhảy vào ... trong bối cảnh quốc tế hóa, điều cực kỳ quan trọng là các nhà phát triển có thể giao tiếp với nhau và điều đó hàm ý sử dụng một ngôn ngữ chung cho các định danh, nhận xét và tài liệu. Tiếng Anh là ngôn ngữ chung của các nhà phát triển.
Matthieu M.

11
Tôi muốn thêm rằng hỗ trợ unicode nên tự nhiên khi sử dụng ngôn ngữ. Nếu có thể, không nên mất thêm bất kỳ nỗ lực nào để "thêm nó vào", nó nên "chỉ hoạt động" (khi hợp lý).
RHSeeger

4
Liên quan, ngôn ngữ nên phân biệt cơ bản giữa dữ liệu văn bản (chuỗi ký tự) và dữ liệu nhị phân (chuỗi byte). C # có quyền này với stringbyte[]. Cũng như Python 3.x với strbytes. C (++) charbị sai lầm khủng khiếp này.
dan04

1
@RHSeeger - quả thật !!! Ngay cả trong Python bạn phải gõ u'My Unicode Štring'. Tôi ước bạn có thể quên loại chuỗi bạn đang xử lý và viết mã friggin.
orokusaki

25

Tôi có một đôi:

  • Generics / mẫu. Ví dụ, Java generic rất mạnh, nhưng không nhất thiết phải linh hoạt. Ngoài ra, vì họ sử dụng kiểu xóa, tôi đã thấy các vấn đề triển khai chúng một cách trừu tượng, đặc biệt là trong các giao diện. Và trình biên dịch không nên cảnh báo khi sử dụng chung không cụ thể (Thích Hashmapthay vì Hashmap<String, int>). Tôi nghĩ rằng họ có thể được cải thiện đáng kể. Tạo khuôn tốt là rất hữu ích, nhưng thường bị bỏ quên.

  • Hỗ trợ ngày tốt trong thư viện tiêu chuẩn. Tôi có nghĩa là có thể thêm và trừ ngày, giờ và phút, và không phải đối phó với số mili giây kể từ ngày 1 tháng 1 năm 1970.


2
"hỗ trợ ngày tốt" là một yêu cầu khá dốc! Điều đó có nghĩa là gì? Tôi nghĩ rằng ngày và giờ là một trong những điều mà bạn không thể hiểu được. hoặc bạn làm cho nó đơn giản và sai, hoặc bạn làm cho nó đúng và phức tạp vô duyên. Thật khó để đạt được một vị trí tốt.
sara

@kai Điểm là hỗ trợ ngày thường khá khủng khiếp. Cái cũ java.util.Datecó gần như tất cả các vấn đề và vấn đề có thể xảy ra. Tôi chỉ biết một phần của java.time.*gói mới , nhưng nó sạch, dễ sử dụng và không có lỗi AFAICT. Người dùng cao cấp hơn có thể tìm thấy vấn đề, nhưng đó là một cải tiến lớn. +++ Vấn đề dường như là, đó là một vấn đề phức tạp và phiên bản đầu tiên đã vội vã và bị hỏng.
maaartinus

24

Vui lòng làm cho ngôn ngữ của bạn có thể phân tích / kiểm toán được cho những người bảo mật máy tính.

Những người bảo mật cần có khả năng tìm thấy các lỗ hổng trong một chương trình trước khi nó xuất xưởng. Lý tưởng nhất, chúng tôi được gọi sớm và có thể nhận xét về codebase khi nó phát triển, nhưng thường thì không.

Khi một phiên bản mới của ngôn ngữ hoặc thư viện cốt lõi xuất hiện, những thứ trước đây an toàn có thể không còn là:

  1. thư viện có thể trở nên mạnh hơn: ví dụ: thư viện URL hiện hỗ trợ javascript:
  2. có thể có những cách mới để chuyển đổi chuỗi hoặc byte thành mã: ví dụ evalhoặc thư viện giải nén
  3. kỹ thuật phản xạ ngôn ngữ có thể trở nên mạnh mẽ hơn: ví dụ: phơi bày các biến cục bộ

Bất kỳ thay đổi nào trong số này có thể làm tăng số lượng thẩm quyền có thể sử dụng được mà chương trình có, nhưng vì số lượng quyền hạn mà chương trình sử dụng (khi giao dịch với khách hàng không độc hại) đã không thay đổi, dân gian bảo mật khó có thể tìm ra mà không cần tăng cường Kiểm toán lại.

Vì vậy, hãy nghĩ về chúng tôi khi thiết kế và phiên bản ngôn ngữ. Dưới đây là một vài lời khuyên:

Xác định một vài nguyên thủy mà một chương trình có thể được phân tách thành.

HTML5 đặc biệt tệ theo cách này. Họ rõ ràng đã suy nghĩ rất nhiều về bảo mật và có một số người rất thông minh, nhưng thay vì chỉ định các yếu tố chương trình mới như <video>về mặt cũ, hoặc tạo ra một sự trừu tượng chung mà cả hai mới <video>và cũ <img>đều có thể được chỉ định về mặt, <video>vẫn chưa được chỉ định một yếu tố chương trình một lần khác với hậu quả bảo mật của riêng nó.

Làm cho ngôn ngữ của bạn có thể tuân theo phân tích tĩnh (ngay cả khi không được nhập tĩnh).

Dân gian bảo mật thường sử dụng phân tích tĩnh để tìm các mẫu và thử và loại trừ các phần của chương trình để chúng có thể tập trung vào các bit thực sự khó khăn.

Rõ ràng định danh nào là biến cục bộ và biến nào không.

Ví dụ: không mắc lỗi tương tự như các phiên bản JavaScript cũ khiến bạn không thể biết liệu có phải xlà tham chiếu biến cục bộ ở bên dưới hay không (theo cách đọc theo nghĩa đen của phiên bản cũ của thông số kỹ thuật):

if (Math.random() > 0.5) {
  Object.prototype.x = 0;
}

function f() {
  var x = 1;
  (function () {
    alert(x);  // Might alert 0, might alert 1.
  })();
}

Cho phép bảo mật có thể phân tách

Rất nhiều hệ thống bảo mật được thiết kế xung quanh một hạt nhân bảo mật bảo tồn các thuộc tính bảo mật, để dân bảo mật có thể tập trung nỗ lực phân tích một lượng nhỏ mã và giải phóng hầu hết các lập trình viên khỏi phải đối phó với dân gian bảo mật {gây phiền nhiễu, hoang tưởng, hoang tưởng} .

Có thể viết một kernel như vậy trong ngôn ngữ của bạn. Nếu một trong các thuộc tính bảo mật của ngôn ngữ của bạn, đó chỉ là một tập hợp con URL nhất định sẽ được tìm nạp, các nhà văn hạt nhân có thể làm gì đó để kênh tất cả URL tìm nạp thông qua mã của họ không? Hoặc có thể kiểm tra bản dựng tĩnh (như xem nhập khẩu) phục vụ cùng chức năng.

Một số ngôn ngữ như Drameak sử dụng mô hình khả năng đối tượng. Đó là cách tuyệt vời và là một cách tuyệt vời để có được bảo mật có thể phân tách.

Nhưng nếu bạn không thể làm điều đó, làm cho biểu đồ mô-đun trở thành một tạo tác có thể phân tích tĩnh có thể mang lại cho bạn khá nhiều lợi ích. Nếu tôi có thể chứng minh rằng một mô-đun không thể tiếp cận mô-đun I / O của tệp (ngoại trừ bằng cách gọi mã trong mô-đun trong TCB), thì tôi có thể loại trừ toàn bộ các lớp sự cố từ mô-đun đó.

Giới hạn thẩm quyền của các ngôn ngữ kịch bản nhúng

Rất nhiều hệ thống hữu ích được tổ chức như một lõi tĩnh khởi động rất nhiều mã được viết bằng các ngôn ngữ động (thậm chí là chức năng).

Và nhúng các ngôn ngữ kịch bản có thể làm cho một hệ thống mở rộng hơn nhiều.

Nhưng một ngôn ngữ kịch bản không nên có toàn quyền của VM.

Nếu bạn chọn cho phép các ngôn ngữ kịch bản nhúng, hãy giúp người xâm nhập dễ dàng giới hạn những gì họ có thể làm. Một mô hình khả năng đối tượng (xem bình luận về Drameak ở trên) rất phù hợp ở đây; Vì vậy, khi đánh giá mã bằng ngôn ngữ kịch bản, người gọi nên chuyển mã để thực thi và tất cả các biến toàn cục cho mã đó.

Coi evalnhư một ngôn ngữ nhúng chính nó như một ngôn ngữ kịch bản

Nếu ngôn ngữ của bạn có thể gọi trình biên dịch riêng của nó để biến một chuỗi thành mã, thì hãy cho phép nó được đóng hộp cát giống như bất kỳ ngôn ngữ kịch bản nhúng nào.

Sử dụng mô hình tương tranh đơn giản

Chúng tôi, những người bảo mật không muốn phải lo lắng về các điều kiện chủng tộc khi cố gắng tìm hiểu xem một tài sản bảo mật có được duy trì hay không.

Vui lòng xem xét các lựa chọn thay thế cho luồng trước khi giải quyết các luồng như một tùy chọn mặc định gần như không thể bảo mật.

Một điều đơn giản là sự tương tranh của vòng lặp sự kiện giống như được tìm thấy trong E, Verilog và JavaScript.

Đừng khuyến khích trích dẫn nhầm lẫn

Một số ngôn ngữ là ngôn ngữ keo và cuối cùng chúng xử lý các chuỗi bằng nhiều ngôn ngữ khác nhau.

Ví dụ: JavaScript thường tổng hợp các chuỗi HTML, CSS, XML, JSON và thậm chí là JavaScript. Các lập trình viên rất khó nhớ để mã hóa chính xác các chuỗi văn bản đơn giản khi kết hợp chúng để tạo các chuỗi trong các ngôn ngữ khác, vì vậy, các chương trình JS, không có gì đáng ngạc nhiên, có tất cả các loại trích dẫn các vấn đề nhầm lẫn: XSS là tồi tệ nhất.

Nếu bạn muốn bao gồm các tính năng thành phần chuỗi, hãy cố gắng giảm gánh nặng bảo mật của lập trình viên. DSL, macro vệ sinh và ngôn ngữ tạo khuôn mẫu nhúng có thể là một cách tuyệt vời để làm điều này bằng cách chuyển gánh nặng để thoát đúng cách vào thư viện hoặc nhà phát triển ngôn ngữ và tránh xa nhà phát triển cuối.


Sự cố đẹp.
Qix

23

Một số ngôn ngữ tốt nhất được thiết kế bởi những người muốn tạo ngôn ngữ cho chính họ.

Vì vậy, tôi nghĩ rằng các nhà thiết kế ngôn ngữ nên ít chú ý đến người dùng của họ. Bạn không thể làm hài lòng tất cả mọi người, bạn cũng không nên cố gắng.


4
Điều đó có thể đúng ở một mức độ nhất định. Tuy nhiên, nếu bạn không bao giờ lắng nghe người dùng của mình, bạn sẽ không bao giờ biết được nỗi đau mà bạn gây ra cho họ khi họ cố gắng sử dụng đứa con tinh thần của bạn. Không nghe / cảm thấy nỗi đau đó bạn sẽ không bao giờ nghĩ ra ý tưởng tuyệt vời tiếp theo giải quyết vấn đề đó và những người khác. Không có người đàn ông là một hòn đảo. Nỗi đau có thể là một động lực tuyệt vời cho việc tiêm chủng.
Berin Loritsch

5
@Berin: Tôi không nghĩ vấn đề là bạn không bao giờ nên lắng nghe người dùng của mình, nhưng đừng lắng nghe những người dùng muốn sử dụng ngôn ngữ cho những thứ mà nó không được thiết kế để làm. Nếu bạn thiết kế một ngôn ngữ để giải quyết một tập hợp hoặc vấn đề cụ thể, thì bạn nên phục vụ cho những người dùng cũng cần giải quyết những vấn đề đó. Tuy nhiên, bạn giải quyết vấn đề cực đoan và đôi khi một ngôn ngữ có thể tìm thấy một vị trí thích hợp trong một tên miền mới, vì vậy +1.
Jeremy Heiler

2
@Jeremy, vâng, đó chính xác là những gì tôi đang nói, nhưng tôi nghĩ rằng ngôn ngữ này không hoạt động tốt trong một miền mà nó không được thiết kế cho.
dan_waterworth

@dan_waterworth: Các ngôn ngữ thành công thường hoạt động, thường là tốt, trong các miền mà chúng không được thiết kế cho.
David Thornley

8
Thay vì "không lắng nghe người dùng", lời khuyên được nói rõ hơn là "đừng lắng nghe người dùng mà bạn không có".
chrisaycock

16

Chỉ 5-10% thời gian được thực sự viết mã. Các nhà thiết kế ngôn ngữ nên chú ý đến những khó khăn khi thực sự làm cho phần mềm hoạt động, có nghĩa là sửa lỗi và lỗi.

Điều đó có nghĩa là nên có một trình gỡ lỗi tốt. Không phải một số công cụ với cú pháp phức tạp và các lệnh chính chỉ tốt hơn một chút so với hàng tấn câu lệnh in.


2
+1. Gỡ lỗi là một trong những nơi mà một số ngôn ngữ tốt hơn các ngôn ngữ khác - và một số IDE tạo ra tất cả sự khác biệt giữa ngôn ngữ có thể sử dụng và ngôn ngữ có thể cản trở bạn.
Berin Loritsch

2
Tôi sẽ thêm một chút vào đây và nói, nếu có thể, dấu vết ngăn xếp hữu ích. Nếu có lỗi (hoặc không có ngoại lệ hoặc bất cứ điều gì, tùy thuộc vào ngôn ngữ của bạn), tôi muốn có thể xem toàn bộ ngăn xếp cuộc gọi đã xảy ra, cùng với các giá trị của các đối số được sử dụng. Tcl thực hiện điều này đặc biệt tốt .. nhưng, công bằng mà nói, mọi thứ đều là một chuỗi trong Tcl, vì vậy bạn có thể in giá trị của mọi thứ một cách dễ dàng.
RHSeeger

1
Không chỉ gỡ lỗi, mà làm cho nó khó để viết lỗi. Tôi đã rất vui khi Java giới thiệu kiểm tra giới hạn tự động trên các mảng ... nhưng ở đây chúng tôi, 15 năm sau, vẫn mắc những lỗi đó trong các ngôn ngữ khác.
Alex Feinman

3
Sẽ không tốt hơn nếu có một ngôn ngữ tìm thấy Lỗi tại thời điểm biên dịch? Ví dụ: khi tôi sử dụng Ada thì dành ít thời gian hơn cho trình gỡ lỗi sau đó khi tôi sử dụng C hoặc C ++.
Martin

12

Tôi nghĩ rằng họ nên chú ý đến Python, người thực hiện nhiều điều đúng hơn bất kỳ ngôn ngữ nào tôi đã gặp (và ngay cả khi bạn không thích một số tính năng). Điều đó không có nghĩa là họ nên mô phỏng Python, nhưng điều quan trọng là phải biết Python đã làm gì đúng, ngay cả khi bạn không muốn tạo ra một ngôn ngữ như Python.

Đối với những ý tưởng triết học có liên quan ở đó, đây là những ý tưởng quan trọng nhất từ ​​Zen of Python:

  • Rõ ràng là tốt hơn so với ngầm.
  • Tính dễ đọc.
  • Trường hợp đặc biệt không đủ đặc biệt để phá vỡ các quy tắc.
  • Mặc dù thực tế đánh bại sự tinh khiết.
  • Nên có một-- và tốt nhất là chỉ có một cách rõ ràng để làm điều đó.
  • Nếu việc thực hiện khó giải thích, đó là một ý tưởng tồi.
  • Không gian tên là một ý tưởng tuyệt vời - hãy làm nhiều hơn nữa!

Tôi nghĩ rằng một ngôn ngữ tuân theo các quy tắc này nhất thiết phải khá ổn, nhưng tôi chỉ biết một ngôn ngữ thực hiện điều này và đó là Python. Đối với tất cả các điểm tương đồng với ví dụ như Ruby khi triển khai, Ruby bỏ lỡ những thứ như khả năng đọc và mời bạn chơi golf, điều này rất thú vị, nhưng không hữu ích trong môi trường chuyên nghiệp.

Tính năng kỹ thuật duy nhất tôi bỏ lỡ trong Python là câu lệnh "cho đến khi" (như while, nhưng không kiểm tra biểu thức lần đầu tiên). Sau đó, có rất nhiều thứ trong cả thư viện chuẩn của Python và các ngôn ngữ khác có thể được cải thiện, nhưng đó không phải là ngôn ngữ nghiêm ngặt , vì vậy đó là một câu hỏi khác. :-)


4
Tôi xem xét hai điều khác quan trọng hơn, đặc biệt ở cấp độ thiết kế ngôn ngữ: "Các trường hợp đặc biệt không đủ đặc biệt để phá vỡ các quy tắc." bởi vì một ngôn ngữ với hàng ngàn trường hợp đặc biệt hoặc quy tắc phức tạp khó sử dụng, kết hợp với "Mặc dù tính thực tế đánh bại sự thuần khiết". bởi vì nếu không thì bạn trôi dạt vào vương quốc của những tấm bạt.

15
Nếu rõ ràng là tốt hơn ngầm định thì tại sao bạn không cần phải khai báo các biến? Khi một lỗi đánh máy đơn giản có thể gây ra các lỗi khó gỡ lỗi, (trái ngược với các lỗi bị bắt tại thời gian biên dịch hoặc lỗi thời gian chạy rõ ràng và dễ gỡ lỗi), đó là một cuộc đình công lớn đối với IMO ngôn ngữ.
Mason Wheeler

4
@Mason Wheeler: Lý do duy nhất bạn phải khai báo các biến trong các ngôn ngữ khác là bạn phải khai báo chúng thuộc loại nào. Python là động, vì vậy khai báo kiểu là không cần thiết, và do đó khai báo là không cần thiết. Tôi không thấy điều đó có liên quan gì đến ẩn / tường minh. Các loại trong Python là rõ ràng. Các biến cũng vậy. Sau mười năm, một lỗi đánh máy chưa bao giờ gây ra lỗi khó gỡ lỗi. Trong thực tế, chúng là tầm thường để gỡ lỗi.
Lennart Regebro

8
+1 cho danh sách, -1 cho người hâm mộ. Quan tâm đến tất cả các ngôn ngữ đã đạt được thành công đáng kể và cố gắng kết hợp, hoặc ít nhất là phân tích khả năng ứng dụng của các yếu tố đó có vẻ như là cách tiếp cận thực dụng hơn.
Steven Evers

3
@Lennart: Tôi muốn nói rằng việc có thể (nhưng không bắt buộc, xem quy tắc 4) để nêu rõ các loại hàm của hàm là một điều tốt. Nó tương tự như thiết kế theo hợp đồng. Đó là điểm tôi muốn thực hiện.
Theo Belaire

11

Khả năng sửa đổi ngôn ngữ cho phù hợp với nhu cầu của bạn là một điều lớn đối với tôi. Đối với Lisp, điều đó được thực hiện với macro, cho Tcl với uplevel. Ở mức độ thấp hơn, Ruby sử dụng lambdas và những thứ tương tự. Tôi chỉ muốn khả năng thêm các cấu trúc điều khiển mới phù hợp với vấn đề hơn là tạo ra các vấn đề của tôi xung quanh các cấu trúc điều khiển có sẵn. Một ví dụ đơn giản, cấu trúc "làm .. cho đến khi" tồn tại trong một số ngôn ngữ nhưng không phải là cách khác để xử lý một số trường hợp hơn "trong khi", việc có thể thêm các cấu trúc mới để đáp ứng các trường hợp khác là vô cùng hữu ích.

Theo nghĩa chung hơn, đây là siêu lập trình ... nhưng tôi chủ yếu sử dụng nó để xây dựng các cấu trúc điều khiển mới.


Hấp dẫn. Hỗ trợ lập trình meta tốt có thể khó lấy đúng, nhưng rất mạnh khi có. Tôi đã nghe từ những người thích Lisp rằng việc triển khai của Lisp là tốt nhất - nhưng họ nói rằng về mọi thứ ở Lisp. Bất kỳ ví dụ về những gì bạn nghĩ là lập trình meta được thực hiện phải không?
Berin Loritsch

"Siêu lập trình được thực hiện đúng" phải là nơi đơn giản để thực hiện đúng (tốt, cho hoạt động đơn giản hợp lý) và khi kết quả cuối cùng cảm thấy như một phần tự nhiên của ngôn ngữ.
Donal Fellows

1
Không chỉ sửa đổi, nhưng sửa đổi giải mã. Nếu bạn đã ánh xạ lại thứ gì đó bằng ngôn ngữ, tôi với tư cách là người đọc sẽ có thể nhanh chóng tìm ra nó. Chú thích hoặc các dấu hiệu bên ngoài khác có thể giúp với điều này.
Alex Feinman

Tôi nghĩ Mata-Lua hoặc Template Haskell làm tốt công việc cung cấp này. (Không đẹp như macro của Scheme, nhưng đó là những gì bạn phải trả cho việc sử dụng nhiều hơn sau đó bằng ngôn ngữ)
Theo Belaire

10

Điều quan trọng nhất là ngôn ngữ của bạn cần phải có "phong cách". Ví dụ, tôi sẽ gọi C là ngôn ngữ lập trình hệ thống dựa trên con trỏ. Tôi sẽ gọi Erlang là ngôn ngữ lập trình chức năng đồng thời cao. Một số ngôn ngữ khác (như C ++ và Java có thể tranh cãi) là những ngôn ngữ mà Allan Kay gọi là ngôn ngữ "kết tụ": Các ngôn ngữ Frankenstein bao gồm một loạt các tính năng được kết hợp với nhau.

Tiếp theo quan trọng nhất là thay đổi ngôn ngữ nên là phương sách cuối cùng. Ngay cả những âm thanh lành tính nhất cũng có thể trở nên phức tạp khi kết hợp với các tính năng khác của ngôn ngữ. Tôi muốn nói rằng để đưa một tính năng mới vào một ngôn ngữ, bạn cần phải:

  1. Chứng minh rằng nó thực sự cần thiết.
  2. Chứng minh rằng nó không thể được thực hiện trong một thư viện.
  3. Chứng minh rằng nó thuộc về ngôn ngữ.

2
Nói cách khác, ngôn ngữ nên có một nguyên tắc thiết kế bao quát và ngôn ngữ phải phù hợp với nguyên tắc đó. Nhận xét về sự tiến hóa ngôn ngữ được bảo hành (Tôi đã thấy điều này bị hỏng vài lần).
Berin Loritsch

1
Nhắc nhở tôi về trích dẫn C ++ yêu thích của tôi ... Một con bạch tuộc được tạo ra bằng cách đóng thêm chân vào một con chó.
ocodo

4
Chứng minh rằng nó không thể được thực hiện trong một thư viện . +1
Qix

2
Tôi thích thư viện thư viện. Thật tuyệt vời khi các ngôn ngữ như haskell không có các công cụ điều khiển tích hợp như vòng lặp, ngoại lệ hoặc tiếp tục. họ chỉ thực sự đơn giản để xác định trong ngôn ngữ, giữ cho cú pháp thực sự sạch sẽ và thúc đẩy khả năng mở rộng và khả năng kết hợp qua việc tạo ra một loạt các tính năng ngôn ngữ thông minh.
sara

10

Cảm ơn cho một câu hỏi tuyệt vời. Bạn đang nhận được một số câu trả lời khá tốt.

Không để mắt qua mắt bạn, nhưng tôi nhìn một lập trình viên như một kênh thông tin. Ý tưởng / khái niệm / yêu cầu đi vào một đầu và mã xuất hiện ở đầu kia.

Nếu bạn lấy một tập hợp các yêu cầu (bất kể chúng được nêu như thế nào) và bộ mã trên một bảng trắng khổng lồ và vẽ các đường ánh xạ từng yêu cầu tới mã thực hiện nó, độ phức tạp của biểu đồ đó sẽ phụ thuộc vào mức độ mã thể hiện các yêu cầu. Lý tưởng nhất, nó nên khá trực tiếp và một đối một, nhưng thật khó để có được trong thực tế.

Tôi đo độ đặc hiệu miền của ngôn ngữ là mức độ đơn giản hóa biểu đồ đó. Đó là một thuộc tính cực kỳ mong muốn và nó có thể được tiếp cận theo bất kỳ cách nào, bằng bất cứ cách nào từ việc chỉ định đúng các lớp / thói quen (danh từ / động từ), cho đến macro, để viết trình phân tích cú pháp và trình thông dịch / trình biên dịch của riêng bạn.

Hãy để tôi chỉ đưa ra một ví dụ về những gì tôi có ý nghĩa. Đối với vấn đề tạo giao diện người dùng hộp thoại linh hoạt, kỹ thuật này giúp loại bỏ việc phải xử lý sự kiện, di chuyển dữ liệu, hầu hết mọi thứ thường được thực hiện trong UI. Nó cũng dẫn đến việc giảm mã nguồn khoảng một thứ tự cường độ. Ngôn ngữ meta thực sự chỉ là một vài thói quen và macro trong C / C ++ / Lisp và tôi cũng đã thực hiện nó bằng các ngôn ngữ không có macro.

Nếu việc thực hiện một yêu cầu có thể được thực hiện với chỉnh sửa 5 điểm thành mã hoặc với 10, thì thực hiện với yêu cầu 5 không chỉ là ít mã hơn mà còn ít cơ hội bỏ lỡ một bước và mắc lỗi. Vì vậy, một ngôn ngữ càng cụ thể theo miền, mã càng nhỏ, dễ bảo trì hơn và không có lỗi hơn. Tôi nghĩ rằng chúng ta cần phải biết cách lái xe về phía đó. Nó không có nghĩa là mã dễ đọc hơn, trừ khi người đọc đã đầu tư vào đường cong học tập để hiểu kỹ thuật.


9

Các loại số nguyên bị ràng buộc và khác biệt như trong Pascal và Ada. Thành thật: bạn có thường xuyên cần toàn bộ phạm vi của bất kỳ số nguyên nào không? Tôi nghĩ rằng có rất nhiều điều cần được cải thiện trong các kiểu nguyên thủy để thể hiện tốt hơn thế giới thực.


2
Các loại số nguyên giới hạn ala C, C ++, D, Java, C #, v.v ... có vị trí của chúng chắc chắn. Một số loại lập trình không quan tâm và chỉ cần phân biệt số nguyên so với dấu phẩy động. Thậm chí sau đó, có lẽ chúng ta chỉ cần một loại số và lo lắng về phần không thể thiếu của số sau này? Nói tóm lại, lập trình kinh doanh ít nhạy cảm với loại số nguyên cụ thể hơn thực tế là một số là một số nguyên. Khi bạn đang thực hiện một giao thức ở mức thấp, các quy tắc sẽ thay đổi mạnh mẽ.
Berin Loritsch

2
Những gì tôi nghĩ nơi các loại như trong Ada nơi bạn chỉ có thể nói type Date_Of_Month is 1 .. 31;và để lại các quyết định như 16 hoặc 32 bit cho trình tối ưu hóa. Nhưng quan trọng hơn là việc gán 32 hoặc 0 hoặc -5 cho một biến loại sẽ mang lại cho bạn một RANGE_ERROR.
Martin

Phạm vi hoạt động tốt cho những thứ như Date_Of_Month(hoặc Month_Of_Year) trong đó có một phạm vi rõ ràng để sử dụng, nhưng nhiều trường hợp - có lẽ là hầu hết - mờ. type Persons_Age is 0..120? Nếu ai đó phá vỡ kỷ lục tuổi thọ thì sao? type Year is 0..9999? Nếu bạn là nhà Ai Cập học thì sao?
dan04

Nếu bạn là một nhà Ai Cập học, bạn không cần biết type Egyptian_Year is -9999 .. 300;. Theo kinh nghiệm của tôi, bạn có thể tìm thấy giới hạn hữu ích cho các số nguyên hầu hết thời gian. Về mặt này, bạn nên xem xét type Scrolls_Found is array Egyptian_Year of Natural;Bạn không thể / không nên có một loại không giới hạn là chỉ mục mảng. Nó chỉ là một vector tấn công cho tin tặc. BTW: Ada cho phép giới hạn phạm vi được tính khi chạy.
Martin

1
@kai không ai nói rằng tính năng đặc biệt này của các hệ thống loại phải được sử dụng ở mọi nơi mà không có ngoại lệ. Tôi chắc chắn Ada cũng cho phép một người sử dụng các loại số "thông thường". Và các kiểu số giới hạn chắc chắn hữu ích cho một số vấn đề (khá phổ biến).
Sange Borsch

8

Có những tính năng giúp ngôn ngữ lập trình dễ sử dụng một khi bạn học chúng, và có những tính năng giúp chúng dễ học để sử dụng. Vì người dùng ngôn ngữ lý tưởng có mối quan hệ lâu dài với nó, tối ưu hóa để dễ sử dụng sẽ tốt hơn tối ưu hóa để dễ học. Đừng làm mọi thứ trở nên khó khăn hơn mức cần thiết, nhưng đừng hy sinh tính biểu cảm (có thể viết một ít mã mà rất nhiều) để dễ đọc cho những người không quen với ngôn ngữ này. Mặt khác, ngôn ngữ không nên đọc như tiếng ồn đối với những người đã làm việc với nó trong nhiều năm; Điều đó sẽ không dễ sử dụng hoặc học hỏi.


8

Các quy ước đặt tên (Tôi đang nhìn vào PHP của bạn)


Ít hơn một vấn đề thiết kế ngôn ngữ, mặc dù. Chắc chắn, bạn luôn phải để mắt đến những gì vào thư viện tiêu chuẩn, nhưng các nhà thiết kế ngôn ngữ không thể thực thi các quy ước đặt tên;)

3
Bạn có thể cho thư viện tiêu chuẩn.
Malfist

3
Thậm chí đừng đề cập đến PHP. Ngôn ngữ tồi tệ nhất thường được sử dụng xung quanh. Không được thiết kế bởi một nhà khoa học máy tính chỉ là một anh chàng muốn các mẫu và steroid được thêm vào.
Keyo

@delnan: một số ngôn ngữ, như Mercury hoặc Eiffel, áp đặt các quy ước đặt tên (tất cả các tên lớp vốn, các biến bắt đầu bằng chữ hoa, v.v.) và chúng được thực thi bởi trình biên dịch. Fortran nói rằng các biến bắt đầu bằng i, j, k là số nguyên (do đó cách sử dụng truyền thống là biến vòng lặp trong hầu hết các ngôn ngữ ...). Và như vậy. Bằng cách nào đó gây phiền nhiễu nếu bạn không thích quy ước, nhưng ít nhất là tốt cho tính nhất quán của mã nguồn.
PhiLho

@PhiLho: Mặc dù vậy rất hạn chế. Nó không thể thực thi - chỉ một ví dụ - sử dụng chữ viết hoa hoặc dấu gạch dưới phù hợp, có ý nghĩa (đối với người đọc con người) (nó có thể thử nhưng sẽ gây rủi ro cho sự tỉnh táo của các lập trình viên trong quá trình này).

7

Tích hợp hạng nhất với môi trường phát triển.

Ngày nay, mã hóa được thực hiện trong một môi trường phong phú. Đối với HTML / CSS / JS, chúng tôi có Fireorms và các công cụ tương tác khác. Đối với Java, Eclipse và IDEA và các IDE thực sự khác. Và kể từ đó trở đi. Có một hệ sinh thái của các công cụ, bắt đầu với trình soạn thảo nhưng không kết thúc ở đó:

  • Tổ chức mã trong và trên các tệp
  • Làm nổi bật thông minh
  • Hoàn thành thông minh / gõ dự đoán
  • Gỡ lỗi tĩnh (cú pháp gắn cờ, lỗi ngữ nghĩa và lỗi cách điệu)
  • Tạo và sử dụng các mẫu và macro
  • Kiểm soát phiên bản (phiên bản, hợp nhất, phân nhánh, ...)
  • Phát triển phân tán với nhiều tác giả (bình luận, tài liệu nội tuyến, chú thích, ...)
  • Thời gian chạy gỡ lỗi (dấu vết ngăn xếp, bước, đồng hồ, ...)
  • Gỡ lỗi "trực tiếp" tương tác (như Fireorms - chỉnh sửa hành vi của hệ thống trực tiếp)
  • ... Tôi thậm chí không biết những gì tiếp theo.

Ngôn ngữ nên được xây dựng để cung cấp hỗ trợ cho các hoạt động này. Một số tiến bộ đã được thực hiện - ví dụ các chú thích trong Java để giúp các nhà phát triển khác hiểu ý định của mã.

Nhưng chủ yếu là nó đã bị hack, như sử dụng $ Id $ trong một bình luận để nguồn được kiểm soát CVS có thể chứa số phiên bản. Tại sao tôi không thể làm một cái gì đó như thế này từ chính ngôn ngữ?


Bạn có ý nghĩa gì đó như ASIS (ISO / IEC 15291: 1999 Hồi Ada Semantics Interface Giao diện kỹ thuật)? ASIS không bao gồm tất cả những gì bạn muốn nhưng khá nhiều. Tôi thường mong muốn một cái gì đó như ASIS cho các ngôn ngữ lập trình khác. Xem sigada.org/wg/ocationwg để biết chi tiết.
Martin

Một số trong những điều này tương đối rẻ để làm hoặc miễn phí từ IDE của bạn: tổ chức mã, tô sáng cú pháp, gấp mã, kiểm soát phiên bản, mẫu / macro. Những người khác đòi hỏi nhiều nỗ lực hơn: gỡ lỗi thời gian chạy, gỡ lỗi tĩnh, hoàn thành thông minh / gõ dự đoán, tái cấu trúc, v.v.
Berin Loritsch

6

Tính toán phân tán

Bữa trưa miễn phí đã kết thúc. Ngày nay người ta cần các chương trình chạy trên nhiều lõi / nhiều bộ xử lý (và trong trường hợp đặc biệt nhiều máy tính).

Thật không may, viết mã đa luồng là khó về mặt khái niệm, vì vậy thực sự không cần phải thêm ngôn ngữ như một rào cản.

Việc sử dụng tương lai của C ++ 0x chắc chắn rất thú vị, vì tất cả những gì nó được mang đến như một thư viện và không giải phóng bạn khỏi các vấn đề đồng bộ hóa thực tế (bạn biết đấy, những vấn đề rất dễ giải quyết ...)

Tôi thực sự thích cách tiếp cận vấn đề của Go : đa luồng được tích hợp sẵn và cách tiếp cận được thực hiện (các kênh và khỉ đột) đặt ra một tư duy dễ dàng hơn nhiều so với các cách tiếp cận semaphore / mutex / lock truyền thống. Vẫn dễ dàng truy cập cấu trúc không đồng bộ hóa mặc dù (Go có con trỏ) hoặc đến bế tắc (chu kỳ chờ đợi trên các kênh ...)

Tôi nghĩ rằng các ngôn ngữ ủng hộ tính bất biến của dữ liệu, như các ngôn ngữ chức năng, có thể có quyền của nó (mặc dù tôi thích trải nghiệm ở đó).

Ngoài ra, mô hình diễn viên có thể là mục tiêu tiếp theo của chúng tôi. Nó có nghĩa là cho máy tính phân tán quá.


Một ví dụ khác sẽ là Erlang. Một chủ đề phổ biến giữa các ngôn ngữ thuộc loại này là cách tiếp cận không chia sẻ , trong đó trạng thái chủ yếu được truyền cùng với thông điệp. Cách tiếp cận quy mô tốt.
Berin Loritsch

@Berin: Bạn nói đúng, mặc dù tôi đã không trích dẫn Erlang trong tin nhắn vì tôi biết rất ít về nó, nhưng tôi nhớ chính xác nó thực hiện mô hình Diễn viên.
Matthieu M.

6

Gọi tôi là điên nhưng một trong những tính năng ngôn ngữ quan trọng nhất với tôi là sự sẵn có của một tài liệu tham khảo trực tuyến tốt, cùng với các ví dụ. Tôi biết rằng tôi có thể tìm thấy kết quả tìm kiếm tốt cho bất kỳ ngôn ngữ nào, nhưng tôi thực sự thích trang web API của MSDN và Java. Chúng làm cho việc lập trình dễ dàng hơn nhiều đối với một người không có nhiều kinh nghiệm trong ngôn ngữ cụ thể.


JavaDoc, CppDoc, RubyDoc, v.v. đã là một tài sản tuyệt vời để hiểu các thư viện tiêu chuẩn, cũng như các thư viện bạn tạo. Tất cả chúng không được tạo ra bằng nhau và một số dễ điều hướng hơn những cái khác.
Berin Loritsch

Đồng ý, Trang web Java API là một tài sản tuyệt vời. Thật tuyệt khi có một định dạng chuẩn để tạo tài liệu API. Tăng năng suất từ ​​việc sử dụng IDE có hỗ trợ tích hợp để phân tích JavaDoc (netbeans) là đáng kinh ngạc. Mặc dù tôi có một trí nhớ kinh khủng nên có lẽ nó có lợi cho tôi hơn những người khác.
toc777

6

Nhiều khả năng để giúp trình biên dịch kiểm tra mã của bạn.

Là một lập trình viên hệ thống nhúng, tôi luôn sử dụng C. Nhưng tôi luôn ước mình có nhiều cách / tốt hơn để nói với trình biên dịch những gì tôi mong đợi từ mã của mình để nó có thể xác minh nó.

Tôi có thể có một chức năng

f(int x)

nhưng tôi thích

f(int range[-5..25] x)

EG Tôi muốn có thể viết các xác nhận về các chức năng bằng cách sử dụng một số loại ngôn ngữ chức năng cấp cao hơn như Lisp hoặc Haskell. Chúng sẽ không được biên dịch thành mã, nhưng có thể được sử dụng để phân tích tĩnh hoặc động.


Thực chất là một cách hiệu quả để kiểm tra giới hạn? Điều này quả thật rất tuyệt. Mặc dù, tôi ít nhất muốn bao gồm điều đó để kiểm tra thời gian chạy cũng như kiểm tra thời gian biên dịch. Khi bạn lấy thông tin từ cơ sở dữ liệu hoặc từ giao diện người dùng, bạn luôn đảm bảo giá trị sẽ hợp lệ. Nếu đây là một tính năng ngôn ngữ, tôi cũng muốn sử dụng nó cho các mục đích này.
Berin Loritsch

3
Bạn nên sử dụng Pascal. Bạn có thể xác định một loại bao gồm một phạm vi số tùy ý, chẳng hạn như -5..25, mà trình biên dịch có thể xác minh tại thời gian biên dịch. (Tất nhiên, miễn là bạn chỉ gán các hằng số.)
Mason Wheeler

1
@Kugel: Còn gì khác ngoài tính năng biên dịch được khẳng định? Và kiểm tra đơn vị sẽ không kiểm tra mã trong sản xuất. Và không kiểm tra trong sản xuất cũng giống như cất cánh thuyền sống sau chuyến đi đầu tiên. Để tiết kiệm nhiên liệu và làm cho tàu nhanh hơn.
Martin

1
Tôi sẽ sử dụng Ada, ngoại trừ nền tảng tôi đang làm việc không có trình biên dịch Ada. Nó chỉ có một trình biên dịch C, vì vậy đây là tất cả học thuật.
Rocketmagnet

1
Tôi đã sử dụng rất nhiều khẳng định, nhưng sẽ tốt hơn nếu có thứ này và những thứ khác như các tính năng ngôn ngữ.
Rocketmagnet

5

Cú pháp nhỏ với càng ít từ khóa càng tốt vì cú pháp dài dòng khó học và không giúp đọc được.

Ví dụ tồi tệ nhất là Ada:

procedure Hello is
begin
  Put_Line("Hello World!");
end Hello;

Các từ điền vào như, như, .. không có ý nghĩa đối với các ngôn ngữ lập trình.


4
Tôi nghĩ ví dụ tồi tệ nhất là ngôn ngữ mà bạn nói public static void.
Joey Adams

1
Ý tưởng không phải là mới và đã được triển khai dưới dạng SmallTalk mà không có từ khóa nào cả. Vì vậy, bạn nên sử dụng SmallTalk làm ví dụ tích cực cho khiếu nại của mình. BTW: Nếu bạn không biết Ad dùng để làm gì ISthì bạn chưa hiểu Ada (bạn đã bao giờ lập trình Ada chưa?): ISTách khai báo thủ tục với khai báo các biến cục bộ và cũng phân biệt một đặc tả với việc thực hiện. Tất nhiên bạn sẽ chỉ chú ý khi so sánh đặc tả và việc thực hiện một chức năng để thấy rằng ISý nghĩa hoàn hảo và hoàn toàn không phải là một phụ.
Martin

1
Quên đề cập: Cú pháp SmallTalk cũng phù hợp với mặt sau của bưu thiếp. Vì vậy, nó cũng sẽ đáp ứng mong muốn của bạn đối với thành phố nhỏ. Tất nhiên hầu hết các ý tưởng ở đây đã được triển khai ở một số ngôn ngữ ở đâu đó và hầu hết các áp phích ở đây sử dụng ngôn ngữ đó làm ví dụ tích cực thay vì đưa ra một ví dụ tiêu cực bị lỗi . Tôi sẽ bỏ phiếu cho bạn xuống nếu tôi đủ danh tiếng. Không phải vì ý tưởng của bạn là xấu - mà là sử dụng ví dụ tiêu cực.
Martin

7
Các từ Filler thực sự có thể phục vụ một mục đích nếu chúng giúp phân tán cú pháp. Ví dụ, tôi rất thích if x then …đến if (x) …. Chúng tôi đã giao dịch một cặp dấu ngoặc cho một từ khóa theo ngữ cảnh. Điều này có ý nghĩa bởi vì điều kiện xcó thể là một biểu thức phức tạp với dấu ngoặc đơn của chính nó. Loại bỏ cặp ngoài cùng có thể làm tăng đáng kể khả năng đọc. Tất nhiên, một cách khác là sử dụng dấu hai chấm ở đây, như trong Python. Trên thực tế, tôi tin rằng hầu hết các chất làm đầy khác nhau như vậy có thể được thay thế bằng dấu hai chấm. Không chắc chắn tôi thích phương pháp nào.
Konrad Rudolph

3
@Konrad: Nếu nó làm sai cú pháp, thì đó không phải là phụ. Đây is một phụ vì Ada có thể đã cho phép procedure Hello begin ... endmà không có sự mơ hồ.
dan04

4

Tôi muốn xem thêm ngôn ngữ học tập . Không chỉ các ngôn ngữ cho người mới bắt đầu tuyệt đối với các hạn chế toàn diện hơn như yêu cầu khoảng cách giữa mỗi mã thông báo , mà cả ngôn ngữ cho những người đã biết lập trình và muốn tìm hiểu các khái niệm mới hoặc nói chung về lập trình tốt hơn.

Đối với tôi, Haskell là một ví dụ tuyệt vời về ý nghĩa của "ngôn ngữ học tập" (mặc dù nó cũng đã trở nên phổ biến và tiện ích chung trong nhiều năm qua). Bằng cách từ bỏ cú pháp C quen thuộc và có các toán tử thành phần hàm ngược (ví dụ: (+2) . (*3)hàm nhân với 3, sau đó thêm 2), Haskell đã dạy tôi viết các hàm ngắn hơn. Trình kiểm tra loại tàn nhẫn của nó đã giúp tôi học ngôn ngữ nhanh hơn và cải thiện khả năng suy nghĩ logic về mã. Cả hai lợi ích này đã tràn sang các ngôn ngữ khác, thậm chí là lắp ráp.

Mục tiêu của việc học ngôn ngữ và những ngôn ngữ có mục đích chung thường mâu thuẫn. Một ngôn ngữ học tập phải là thử thách và bổ ích để học, và nên thực thi một phong cách cụ thể, ngay cả khi phong cách đó không phải là tốt nhất cho nhiều ứng dụng. Một ngôn ngữ có mục đích chung sẽ tốt cho việc hoàn thành công việc và việc sử dụng trừu tượng nên được đo lường cẩn thận và "có ý nghĩa". Ví dụ, khi sửa chữa một trang web, tìm hiểu về monads sẽ là điều cuối cùng trong tâm trí của một lập trình viên. Ở phía bên kia của đồng tiền, khi ai đó đang học lập trình, họ không cần phải lội qua "khoảng trống tĩnh công khai" nếu họ chưa học về các chức năng.

Nếu bạn là nhà thiết kế ngôn ngữ, vui lòng quyết định xem ngôn ngữ của bạn là ngôn ngữ học hay ngôn ngữ ứng dụng. Điều này sẽ xác định mức độ bạn sẽ muốn sử dụng độ tinh khiết trong thiết kế của bạn.


2
Thành phần chức năng của Haskell theo cách nào lạc hậu? Đó là một bản dịch trực tiếp (f ∘ g)(x) = f(g(x)).
Jon Purdy

@Jon Purdy: Có nghĩa là bạn phải viết các hàm theo thứ tự ngược lại của ứng dụng của chúng. Trong cả hai hình thức, gđược áp dụng cho đối số đầu tiên, tiếp theo là f. Nếu bạn muốn sắp xếp một danh sách, nhóm nó và lấy mục đầu tiên của những danh sách đó, bạn sẽ viết (map head . group . sort) listhoặc map head $ group $ sort listhoặc map head (group (sort list)). Trong mọi trường hợp, bạn sẽ viết các thao tác ngược lại. Nhân tiện, nhập khẩu Control.Arrowcho phép bạn nói (sort >>> group >>> map head) list, nhưng >>>nhà điều hành có vẻ khá lúng túng và dài dòng đối với tôi.
Joey Adams

2
Tôi không biết, tôi vẫn nghĩ rằng từ phải sang trái có ý nghĩa. (map head . group . sort) listđọc là "mục đầu tiên của mỗi nhóm trong một loại list", điều này khá tự nhiên và đối với tôi, nhiều chức năng hơn (sort >>> group >>> map head) list, đọc khá bắt buộc và lạc hậu là "sắp xếp sau đó nhóm lấy mục đầu tiên của mỗi nhóm. .. list".
Jon Purdy

@JoeyAdams - các >>>nhà khai thác vẻ khá vụng về và verbose - Một vài ngôn ngữ chức năng gần đây đã bắt đầu sử dụng |>như một nhà điều hành chaining từ trái sang phải, mà có lẽ là một chút dễ dàng hơn trên mắt ...
Jules

4

Vì chúng tôi đang ở năm 2011,

  • một đặc điểm kỹ thuật hoàn toàn đầy đủ. không có lỗ hổng kiến ​​trúc phụ thuộc như trong C
  • hỗ trợ đa luồng; không chỉ các tính năng đồng bộ hóa (khóa), mà các tính năng ngôn ngữ giúp đa luồng dễ dàng như viết một vòng lặp:

    tất cả (o trong myCollection) {o.someMethod ()}

  • đa mô hình; hãy để tôi, lập trình viên, quyết định xem tôi muốn sự an toàn trong thời gian biên dịch của ngôn ngữ tĩnh hay độ căng của ngôn ngữ động, trên cơ sở từng trường hợp cụ thể; cung cấp cho tôi các tính năng hướng đối tượng, tính năng chức năng, vv

  • tính nhất quán (tôi biết rằng nó đòi hỏi một chút cho cả tính nhất quán và đa mô hình ...)


Tôi với bạn 100% cho một đặc điểm kỹ thuật hoàn chỉnh. Đa mô hình và tính nhất quán chắc chắn sẽ là một hành động cân bằng. Bạn có thể chỉ định một tập hợp các hành vi cho mô hình động như một tập hợp con của các hành vi để kiểm tra tĩnh - nhưng tôi nghĩ hai cách tiếp cận này có thể cho vay theo các kiểu lập trình rất khác nhau. Họ thực sự không thể là ngôn ngữ riêng biệt tại thời điểm đó. Có lẽ một cặp ngôn ngữ nhất quán với khả năng tương thích 100% sẽ là những gì bạn đang tìm kiếm?
Berin Loritsch

Các ngôn ngữ như Scala (và có lẽ là Haskell? Tôi không biết đủ) có hệ thống kiểu tĩnh mạnh mẽ và căng thẳng, nhờ vào suy luận kiểu và ẩn ý.
PhiLho

2
Các tính năng phụ thuộc vào kiến ​​trúc là tốt khi một ngôn ngữ cho phép lập trình viên chỉ định những gì là hoặc không quan trọng. Điều khiến C kinh khủng là không có cách nào để khai báo "kiểu số bao bọc modulo 65536"; ngay cả khi một nền tảng triển khai uint16_t, tiêu chuẩn yêu cầu một số triển khai coi sự khác biệt giữa hai uint16_tgiá trị là đã ký và các nền tảng khác coi sự khác biệt là không dấu; nó cung cấp không có cách nào để lập trình viên chỉ định hành vi nào là mong muốn.
supercat

Tôi không đồng ý cho đa chủng tộc; khiến cho quá nhiều chỗ ngọ nguậy cho các trận chiến theo phong cách mã hóa. Thư viện A được viết với một loạt các mô hình động . Thư viện B được viết với một loạt các mô hình tĩnh . Chà, bây giờ Thư viện A cần nói chuyện với Thư viện B; tầng giữa ở đâu? Nếu bạn phải viết keo giữa hai đoạn mã trong cùng một ngôn ngữ, ngôn ngữ vốn đã bị lỗi IMO.
Qix

3

Quy trình nhẹ

Tôi muốn có các quy trình nhẹ như trong Erlang. Đây chủ yếu là một vấn đề cho thời gian chạy. Điều này bị thiếu trong JVM và .NET CLR. LWP giúp tạo phần mềm đồng thời ồ ạt. Lý tưởng nhất là không tốn kém hơn để tạo ra một quy trình vì nó là để tạo ra một đối tượng bằng ngôn ngữ. Tôi muốn tạo ra hàng triệu quy trình trong các ứng dụng của mình.

Nó được triển khai như một nhóm luồng với lập lịch định trước, do đó, một tác vụ duy nhất không chặn nhiệm vụ khác và các tác vụ có thể được lên lịch trên bất kỳ lõi cpu nào có sẵn.

Hỗ trợ đệ quy đuôi

Tôi muốn có sự hỗ trợ cho đệ quy đuôi. Đây cũng có thể là một vấn đề cho môi trường thời gian chạy. Ví dụ, JVM không hỗ trợ đệ quy đuôi.

Lập trình phân tán dễ dàng

Tôi muốn được hỗ trợ gửi ( ! ) Và nhận nguyên thủy cho các phần của ứng dụng đang chạy trên các máy khác trên cùng một netword như trong Erlang. Điều này giúp dễ dàng xây dựng các ứng dụng có thể mở rộng, ví dụ như kho dữ liệu phân tán. Thêm vào đó là tuần tự hóa tích hợp trong ngôn ngữ cũng rất hữu ích như trong erlang. Và không như trong Java, tôi phải làm thủ công.



Scala có đệ quy đuôi và được biên dịch thành JVM. Trình biên dịch Java của IBM cũng có thể thực hiện đệ quy đuôi - đôi khi.
Martin

3

Tạo điều kiện cho siêu lập trình.

giới hạn các hình thức đặc biệt

Trong Python không có lý do chính đáng tại sao in nó không phải là hàm dựng sẵn. Nó trông và hoạt động như một chức năng ngoại trừ việc không muốn làm gì với parens.

Chúng ta có thực sự cần for, foreach, whilevà những thứ tương tự nhau như hình thức đặc biệt của riêng mình. Làm thế nào về một cấu trúc vòng lặp và một số macro mặc định để cung cấp đường cú pháp của các dạng vòng lặp biến thể.

lập trình meta cho các hình thức đặc biệt

form['if'](test-fn, body-fn)


Ruby sort có "các hình thức đặc biệt" để lặp, ít nhất là theo nghĩa các đối tượng lặp lại thường có một phương thức như thế eachlấy một khối mã làm đối số. (Ruby cũng có forwhilecác vòng lặp, nhưng không có lập trình viên Ruby tự trọng nào thực sự sử dụng chúng.)
mipadi

@mipadi: Tôi là một fan hâm mộ lớn của các khối Ruby và các thành ngữ liên quan.
dietbuddha

có lẽ họ nghĩ - Bạn sẽ bắn mắt ra. :) Tôi đoán đó là sự liên kết của tất cả các "Python" mạnh mẽ và "không có lý do chính đáng tại sao". Tuy nhiên, siêu lập trình là một vấn đề thiết kế ngôn ngữ hợp lệ thường bị bỏ qua. Vì lý do đó mà tôi sẽ nâng cao điều này.
Berin Loritsch

@Berin: Tôi thực sự sử dụng và là một fan hâm mộ của Python khiến nó trở nên thú vị hơn.
dietbuddha

Một loại vòng lặp sẽ làm cho dòng mã bị che khuất. Chẳng hạn, một do..whilevòng lặp sẽ trông như thế nào nếu có một loại vòng lặp có đánh giá ở trên cùng? Nó sẽ không giống như một vòng lặp do .. trong khi tất cả.
Qix

2

Khả năng mạng

Một ngôn ngữ vận chuyển mà không có một số hỗ trợ mạng là khá khập khiễng trong thế giới ngày nay.

Hầu hết các ứng dụng trong thế giới thực cần giao tiếp qua một số loại mạng:

  • cập nhật tự động
  • truy cập cơ sở dữ liệu
  • dịch vụ web

Tất nhiên, đây cũng là nền tảng của hỗ trợ điện toán phân tán / đám mây.


8
Nhưng nó có thể là một tính năng thư viện tiêu chuẩn tốt.
Donal Fellows

@Donal: Tôi chưa bao giờ nói khác (hoặc ít nhất là không nghĩ như vậy), câu hỏi mở cho cả các tính năng ngôn ngữ và thư viện. Quan điểm của tôi chỉ là nếu bạn nhận được gói ngôn ngữ và không có khả năng kết nối mạng ở đó, bạn sẽ lấp đầy nỗi đau sớm hơn sau này :)
Matthieu M.

3
Thư viện tiêu chuẩn thực sự là một phần của trải nghiệm ngôn ngữ, và nó cần được đối xử với sự quan tâm và tôn trọng tương tự. Tôi cũng đồng ý với yêu cầu này đối với một thư viện tiêu chuẩn.
Berin Loritsch

1

Tôi thích một ngôn ngữ lập trình dễ học, và dễ kết hợp để tạo ra những thứ mới.

Ví dụ, trong khi hấp dẫn để có nhiều cách để viết một cái gì đó, tôi nghĩ tốt hơn là chỉ có một hoặc hai cách để viết nó. Bằng cách đó, chương trình dễ dàng hơn để duy trì.

Một ngôn ngữ mà các khái niệm của nó có thể áp dụng trên tất cả các yếu tố rất hữu ích (tôi nghĩ rằng đây được gọi là tính trực giao) Vì vậy, lần tới khi bạn đối mặt với một tính năng ngôn ngữ mới, bạn có thể suy luận cách sử dụng nó.

Tôi hiểu đôi khi cú pháp ngôn ngữ phải cản trở để thực hiện tốt hơn trong giai đoạn biên dịch / phiên dịch, nhưng đôi khi tôi cảm thấy nhà thiết kế ngôn ngữ trì hoãn công việc này với nhà phát triển. Chẳng hạn, các chuỗi đa dòng trong Java hoặc Javascript.

Cuối cùng, cú pháp ngôn ngữ là giao diện người dùng của nó và do đó, nó phải rõ ràng, súc tích, trực quan, dễ sử dụng và nên tôn trọng thói quen của bạn.


Trực giao có nghĩa là mỗi tính năng làm một cái gì đó khác nhau. Nhìn vào các công cụ như grep hoặc awk. Họ làm một việc, tốt. Sau đó, bạn nối chúng theo các thứ tự khác nhau để làm bất cứ điều gì bạn cần.
Theo Belaire

1
  • Khả năng đọc : Càng ít / nhỏ nhất các ký hiệu được sử dụng trong ngữ pháp, càng sạch & càng tốt.
  • Các loại hướng đối tượng : Phương thức, không phải chức năng.
  • Hiểu được : Các giao diện lưu loát tích hợp, tên ngắn gọn và toàn diện cho các lớp / giao diện thư viện và các loại.

1
Xin lỗi, nhưng tôi phải cho bạn -1 vì đã hoàn toàn sai về điều này. Sự căng thẳng giúp viết mã nhanh hơn, nhưng nó chắc chắn không làm cho mã dễ đọc hơn, vượt quá mức tối thiểu nhất định. Một mức độ dài nhất định làm cho mã dễ đọc hơn nhiều, bởi vì những từ và ký hiệu thêm đó có nghĩa là một cái gì đó và truyền đạt thông tin có ý nghĩa cho người lập trình, đặc biệt nếu nó được viết bởi người khác và bạn không có lợi thế là đã có tinh thần mô hình của nó trong đầu của bạn.
Mason Wheeler

Đối với tôi, mã sạch là mã có thể đọc được. Tôi cũng đã nói nhỏ nhất: có ":" thay vì "=>" trong mảng PHP hoặc có "." thay vì "->", chắc chắn sẽ là một sự cải tiến (và tôi đã thích PHP rồi).
dukeofgaming

4
@Mason: Tôi và nhiều nhà văn kỹ thuật giỏi (ví dụ William Zinsser), không đồng ý. Độ dài là kẻ thù của khả năng đọc, không căng thẳng.
Konrad Rudolph

2
Tôi đi cho một hình thức căng thẳng được xác định theo các biểu tượng . Mặc dù vậy, tôi khá hài lòng với các biểu tượng đa ký tự, miễn là chúng là những thứ mà người đọc tự nhiên coi là một biểu tượng duy nhất (ví dụ: một từ là một biểu tượng).
Donal Fellows

1
Điểm đầu tiên của bạn mâu thuẫn trực tiếp với hai cái sau của bạn.
Qix

1

Thêm một tính năng cho một ngôn ngữ lập trình hiện có. Vì vậy, ngôn ngữ mới B là ngôn ngữ cũ A cộng với tính năng X.

Ví dụ hiện có:

  1. C thêm lớp => C ++
  2. Java thêm một số thứ => C #

2
Đây là một sự đơn giản hóa rất lớn. Một ví dụ tốt hơn nhiều sẽ là sự khác biệt giữa C và Objective-C.
Jon Purdy

0

Khi nói đến công nghệ / nền tảng / ngôn ngữ / cơ sở dữ liệu, vv hầu hết các lần liên quan đến hiệu suất. Trong tương lai, nhiều phần mềm ngày nay có thể được thiết kế bằng ngôn ngữ đồ họa vì chúng ta có sức mạnh tính toán mạnh mẽ hơn.

Tôi hy vọng vào ngày mà chúng ta có sức mạnh tính toán và ngôn ngữ nơi bạn thiết kế ứng dụng của mình và bạn không phải lo lắng về chi tiết ngôn ngữ .

Cập nhật: Tôi gửi một liên kết đến LabView ngôn ngữ như vậy

Cập nhật: Tôi nên giải thích thêm những gì tôi muốn nói về sự mạnh mẽ của máy tính. Hiệu suất của phần mềm được biên dịch có thể không mạnh bằng phần mềm được biên dịch dựa trên ngôn ngữ cú pháp. Tôi đang nghĩ về lập trình đồ họa là một cấp độ lập trình cao hơn và có thể có nhiều chi phí hơn. Máy tính ngày nay có thể và dễ dàng chạy các ngôn ngữ lập trình đồ họa.


3
Máy tính đã đủ mạnh để làm điều này. Nó không thực tế, vì bạn sẽ cần phải nhập mã vì lý do này hay lý do khác .
Jeremy Heiler

2
Nó vẫn là một ngôn ngữ. Đã có nhiều hơn một nỗ lực để biến điều này thành hiện thực. Các công cụ UML sẽ tạo ra một số lượng mã nhất định, nhưng khi mô hình đủ chi tiết để tạo ra một sản phẩm hoạt động, nó không còn có thể sử dụng để hiểu mã. Tôi tin rằng có một cái gì đó trên môi trường Unix để kết nối đồ họa của các ứng dụng, nhưng nó đòi hỏi rất nhiều cấu hình để làm cho nó chính xác. Các công cụ quy trình làm việc sử dụng siêu hình này để cho phép những người không lập trình thiết kế quy trình công việc.
Berin Loritsch

1
Nói tóm lại, trong khi tôi nghiêm túc nghi ngờ tính hữu ích của phương pháp này nói chung, có những ứng dụng cụ thể hiện đang được sử dụng và hoạt động tốt cho ứng dụng đó. Re: điểm của bạn ... 1. Máy tính có sức mạnh tính toán, mặt kỹ thuật không phải là vấn đề. 2. Vấn đề là cung cấp một ngôn ngữ hình ảnh đủ biểu cảm để thực hiện công việc theo nghĩa chung mà không bị lạc trong các chi tiết. Bên ngoài các ứng dụng thích hợp, văn bản dường như là một đại diện nhỏ gọn hơn nhiều của một chương trình. Tôi đã upvote vì nó được áp dụng cho câu hỏi đặt ra.
Berin Loritsch

1
@Amir: Sau đó, vui lòng giải thích tại sao máy tính cần phải mạnh hơn để "lập trình đồ họa" thúc đẩy phát triển phần mềm?
Jeremy Heiler

7
@Amir: Bạn đang giới hạn một giới hạn kỹ thuật với một giới hạn cơ bản hơn. Lý do chúng tôi không có nhiều ngôn ngữ máy tính đồ họa là vì chúng tôi không biết làm thế nào để làm tốt chúng (và không biết liệu chúng có thể được thực hiện tốt hay không). Tôi biết về LabView và đã nghe đủ về việc làm những việc phức tạp trong đó hoặc thay đổi những điều đơn giản. Chúng ta cũng không cần máy tính mạnh hơn để thiết kế một ngôn ngữ như vậy, vì vậy hãy tiếp tục và cố gắng phác thảo một số chương trình mẫu bằng ngôn ngữ giả định như vậy.
David Thornley
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.