Tại sao không thể có một ngôn ngữ lập trình phổ biến thế giới, phục vụ tất cả các mục đích? [đóng cửa]


57

tại sao không kết hợp các tính năng tốt nhất của tất cả các ngôn ngữ lập trình hiện có và phù hợp với nó trong ngôn ngữ lập trình phổ quát?


23
Thuật ngữ 'tốt nhất' là chủ quan, vì vậy bạn sẽ không bao giờ có một điều tốt nhất được chấp nhận nhất. Tất nhiên, có khá nhiều ngôn ngữ phù hợp với phạm vi phát triển rộng trên tất cả các nền tảng. C ++ và Java là hai chính.
GrandmasterB

5
@GrandmasterB Bạn đã quên C #
Daniel Little

15
Có, nó được gọi là 'C'
Martin Beckett

9
Chúng ta là một loài có khả năng không đồng ý bẩm sinh (nhờ vào tính cá nhân của chúng ta), do đó chúng ta sẽ không bao giờ đồng ý về những gì được yêu cầu trên toàn cầu, và do đó sẽ không bao giờ có một (ít nhất là không phải do con người tạo ra!)
Nim

9
Một ngôn ngữ lập trình phổ quát? Ý bạn là, tương tự như ngôn ngữ phổ quát của con người mà mọi người đã chuyển sang rất nhiều năm trước?
Kyralessa

Câu trả lời:


116

Vì lý do tương tự, bạn không sử dụng một con dao quân đội Thụy Sĩ để khắc con gà ...

http://upload.wik hè.org/wikipedia/commons/thumb/4/48/My_swiss_army_knife.JPG/800px-My_swiss_army_knife.JPG

Con dao của quân đội Thụy Sĩ thường có một lưỡi dao, cũng như các công cụ khác nhau, chẳng hạn như tua vít và có thể mở và nhiều thứ khác. Các tệp đính kèm này được xếp bên trong tay cầm của con dao thông qua cơ chế điểm trục ...

Thiết kế của con dao và tính linh hoạt của nó đã dẫn đến sự công nhận trên toàn thế giới ...


26
Vì lý do tương tự, bạn không mang minivan đến cuộc đua kéo. Vì lý do tương tự, bạn không mang theo súng lục nước để đấu tay đôi.
Chris

19
@Chris Nếu là một cuộc đấu súng nước thì sao?
Rusty

44
Vì lý do tương tự, bạn không bao giờ đi với một người Sicilia khi cái chết đang ở trên đường.
Rusty

6
Nếu bạn có một con dao quân đội Thụy Sĩ đã làm tất cả những điều bạn cần để xây dựng một ngôi nhà, liệu nó có tốt với bất kỳ ai trong số họ không?
Brad Mace

4
Câu trả lời này là một sự tương tự khủng khiếp. Có lẽ nếu bạn đã viết: bởi vì ngôn ngữ tiếng Pháp cho phép độ trung thực của biểu thức khác với ngôn ngữ tiếng Anh, tôi có thể thích sự tương tự tốt hơn. Nhưng ngôn ngữ máy tính không phải là 'thứ', cũng không phải ngôn ngữ của con người. Câu trả lời đúng là: chúng tôi không biết. Nó sẽ đòi hỏi cái nhìn sâu sắc hơn về cách con người thể hiện logic và cách họ đến điểm này. Hơn nữa, một số ngôn ngữ là 'ngôn ngữ meta', có thể diễn đạt các DSL khác. Chúng tôi có nên bao gồm những điều này trong câu hỏi của bạn?
Dibbeke

80

Bởi vì

  1. không ai muốn viết lại tất cả các mã kế thừa.
  2. Thật khó để đồng ý về tất cả các mục đích
  3. Khi bạn tập hợp một danh sách đầy đủ các mục đích, chúng sẽ thay đổi trước khi bạn có thể xây dựng nó.
  4. Ai đó sẽ bắt đầu một ngôn ngữ hoàn toàn khác do một mục đích mới.
  5. Microsoft
  6. táo
  7. Mã nguồn mở
  8. Chúng ta sẽ làm gì với tất cả Cá Babel?
  9. Thậm chí không thể làm cho SQL trở nên phổ biến.

Bạn dừng lại ngắn. Tôi đã mong đợi một trong những danh sách "Top 10" nghiêm túc nhất của ha-ha.
Jeffrey Hantin

4
+1 để ngăn chặn, ít nhất là bây giờ, một chiến dịch "Cứu cá Babel". Hippies chết tiệt.
Rusty

2
Đối với cá Babel, hãy làm sushi!
Muad'Dib

1
Về điểm 1, tất cả các mã di sản cuối cùng sẽ có thể sở hữu được tái bản nào sử dụng mốt mới nhất trong mã / thư viện hoặc sẽ không thể chạy một cách hiệu quả mà không cần số tiền vô lý của chi phí hỗ trợ.
Michael

38

Những gì bạn có trong lập trình là một miền vấn đề rất lớn. Tên miền này cực kỳ và theo nhiều hướng.

Đây là lý do tại sao các bộ điều khiển chuyến bay nhúng được viết bằng C và các trang web được viết bằng PHP, Java, Rails, .NET và một loạt các bộ điều khiển khác.

Đối với bộ điều khiển chuyến bay nhúng, tôi có khoảng 128k bộ nhớ để làm việc và trên hết là nếu mã của tôi có một ngoại lệ chưa được xử lý thì máy bay gặp sự cố, 200 người chết và tôi bị kiện phải điều chỉnh $ 1B, và phải gửi các kỹ sư cho mọi người sân bay trên thế giới để sửa máy bay bị mất khách hàng của tôi $ 10 triệu / ngày. Tôi phải làm việc với một ngôn ngữ rất chặt chẽ và có một số lượng nhỏ các bộ phận chuyển động có thể bị sai.

Đối với ứng dụng web của tôi, tôi có vài GB bộ nhớ để làm việc, nhưng tốc độ mạng bị hạn chế (ở mức độ thấp hơn hàng ngày, nhưng đây có lẽ là giới hạn lớn nhất của web). Tôi sẽ xem xét một ngôn ngữ mang lại cho tôi rất nhiều tính năng và tạo ra đầu ra có thể được truyền đi nhanh nhất có thể. Tôi không thực sự quan tâm nếu trang web của tôi bị sập, tôi có thể sẽ mất một vài doanh số (100 đô la) và phải vá trường hợp sử dụng bị đánh bom, không có vấn đề gì lớn.

Các trang web đã không được viết bằng C trong hơn 15 năm (có ai thực hiện bất kỳ tập lệnh cgi nào không?) Và theo như tôi biết thì các bộ điều khiển chuyến bay mới bắt đầu xem xét C ++, nhưng ngay cả sau đó theo một cách rất hạn chế.


3
Hầu hết các trang web thực sự kiếm tiền sẽ mất hơn 100 đô la nếu họ trải qua thời gian chết đáng kể. Không cho thấy nó có thể so sánh với một tình huống sinh tử, nhưng vẫn vậy, điều này làm giảm rủi ro nhiều hơn một chút.
Aaronaught

3
Bạn có biết Facebook tuyệt vời như thế nào không. Gần đây họ đã đăng mã họ đẩy mã cứ sau 37 phút. Trang web của họ liên tục bị cấm theo cách này hay cách khác và họ có một triệu vé trong hồ sơ tồn đọng của họ. Vấn đề là với web không ai sẽ chết, bạn "có thể" mất một vài doanh số, nhưng tất cả đều không thực sự nhiều rủi ro. Hầu hết các vấn đề bạn gặp phải sẽ chỉ ảnh hưởng đến một số khách hàng chứ không phải toàn bộ cơ sở
Bill Leeper

24
  1. Đi đến nhà để xe của bạn (hoặc nhà để xe của cha mẹ bạn).
  2. Mở hộp công cụ.
  3. Nếu bạn thấy nhiều hơn một công cụ, hãy nghĩ về cách áp dụng cho câu hỏi của bạn.

Nếu bạn không có hộp công cụ, hoặc chỉ có một trong những cái búa nhỏ với các đầu vặn vít trong tay cầm rỗng, thì tôi rất thông cảm với bạn.

Nghiêm túc. Nếu bạn đi đến một cửa hàng tự động, thợ máy của bạn chỉ có một công cụ duy nhất trong công cụ của mình phải không? Anh ấy (hoặc cô ấy) là một chuyên gia, với các công cụ cấp chuyên nghiệp được thiết kế đặc biệt để thực hiện các nhiệm vụ sửa chữa ô tô khác nhau.

Tương tự, các nhà phát triển phần mềm chuyên nghiệp nên sở hữu một bộ công cụ đủ để thực hiện giao dịch của mình. Nếu bạn mở hộp công cụ của mình và chỉ thấy [phần mềm tương đương với] một tuốc nơ vít của Philips, thì bạn không thể coi mình là một chuyên gia.

Bạn có thể vặn bu-lông bằng cờ lê đầu mở, cờ lê đầu hộp, cờ lê ratchet hoặc cờ lê điều chỉnh. Bạn thậm chí có thể xoay một bu lông trong một nhúm với kìm trượt, vụng về, với thiệt hại từ nhẹ đến nghiêm trọng. Nhưng nó là khá khó khăn để biến một bu lông bằng búa tạ.


Đó là bao gồm "nhà để xe của cha mẹ." Điều đó thực sự làm cho nó rõ ràng hơn, vì tôi không có nhà để xe.
Dan Rosenstark

5
Một sự tương tự tốt hơn sẽ là một ngôn ngữ giống như một hộp công cụ hơn là một số công cụ riêng lẻ.
Tom Hawtin - tackline

4
Có thể có 20 công cụ khác nhau trong hộp. Nhưng tôi cá là bạn chỉ cần một ngôn ngữ để mô tả chúng.
ThomasX

2
Ngày nay, hộp công cụ giống như các thư viện có sẵn cho ngôn ngữ được đề cập.
Michael

18

Một loại câu trả lời khác cho những người khác - tôi thực sự nghĩ rằng có khả năng ngôn ngữ sẽ trở thành một ngôn ngữ "phổ quát", cho phép các tính năng và mô hình của nhiều ngôn ngữ khác, mặc dù có lẽ không phải là ngôn ngữ được thiết kế nghiêm ngặt mà bạn có thể nghĩ đến.

Để sử dụng sự tương tự của brettmjohnson ở trên, ý tưởng rằng mỗi ngôn ngữ lập trình là công cụ bên trong một hộp (hoặc trên một con dao quân đội Thụy Sĩ) là giả định mà mọi người đang đưa ra, nhưng thực sự là một giả định thiếu sót.

Nếu ngôn ngữ lập trình là hộp công cụ thì sao?

Ý tôi là, điều gì sẽ xảy ra nếu bạn có thể thêm và xóa các tính năng khỏi ngôn ngữ theo ý muốn và có hộp công cụ của riêng bạn với các công cụ bạn cần trong đó - ngay cả khi các công cụ dành cho các mục đích khác nhau.

Khái niệm tồn tại một phần rồi. Ví dụ: các ngôn ngữ như Nemerle cho phép bạn thêm cú pháp vào ngôn ngữ và như vậy, bạn có thể có được "tính năng tốt nhất từ ​​ngôn ngữ X" và thêm nó vào Nemerle (hoặc của riêng bạn). Điều này không nhất thiết có nghĩa là viết macro của riêng bạn mọi lúc - mỗi ngôn ngữ (hoặc mô hình) có thể được xác định bên trong một macro trong thư viện chuẩn - sao cho bạn có thể import Haskell; import Prolog;và bắt đầu viết hai ngôn ngữ như thể nó là một phần của ngôn ngữ của bạn?

Câu hỏi sau đó là - làm thế nào để bạn có được các tính năng của các ngôn ngữ / mô hình khác nhau để làm việc với nhau? Mặc dù tôi không thể trả lời rằng, các khung như .Net và JVM cung cấp một số giải pháp - các ngôn ngữ ít nhất tương thích một phần do cách chúng được biên dịch. Bạn có thể lấy bất kỳ mã nào được viết bằng C # chẳng hạn và sử dụng nó từ F # mà không có khiếu nại.

"Vấn đề" với giải pháp như hiện nay, là việc sử dụng các ngôn ngữ này cùng nhau đòi hỏi bạn phải tạo chúng thành các dự án riêng biệt, không thể tham chiếu lẫn nhau - bạn chỉ có thể tham chiếu 1 chiều. Rào cản ngôn ngữ là mỗi dự án biên dịch tất cả các tệp của nó thành Ngôn ngữ trung gian chung trước khi bất kỳ dự án nào khác có thể truy cập vào nó.

Bước đệm hướng tới việc loại bỏ rào cản đó sẽ là cho phép mã của các ngôn ngữ khác nhau (ví dụ: C # và F #) được biên dịch trong cùng một dự án. Về lý thuyết, bạn có thể biên dịch từng tệp riêng biệt (hoặc theo nhóm - nếu chúng có loại một phần hoặc tham chiếu vòng tròn), sau đó biên dịch các tệp của một ngôn ngữ khác có thể truy cập vào các đối tượng đã biên dịch (CIL). Bạn sẽ cần xác định nghiêm ngặt thứ tự biên dịch để làm việc này - nhưng thứ tự biên dịch đã được yêu cầu trong trường hợp F #.

Dù sao, tôi không nói "chắc chắn có thể có một ngôn ngữ phổ quát". Tôi đề nghị rằng có khả năng tương tác tốt hơn nhiều giữa các ngôn ngữ hiện đang tồn tại. Trong thực tế, nó không có khả năng cải thiện rất sớm, chỉ vì khối lượng công việc khổng lồ là để thực hiện một ngôn ngữ và các thư viện, các công cụ, vv cần thiết để sử dụng nó.


4
Tất cả thế giới không phải là một PC. Phần lớn các bộ xử lý trên hành tinh này có ít hơn 64K byte tổng dung lượng bộ nhớ. Một ngôn ngữ có thể được sử dụng trên các bộ xử lý này đã bị giảm đi so với những ngôn ngữ mà hầu hết trên diễn đàn này dường như sử dụng rằng ngôn ngữ phổ quát của bạn sẽ kết thúc như một ngôn ngữ lắp ráp nâng cao. Tôi nghĩ rằng nó sẽ được gọi là "C".
uɐɪ

10

Các tính năng tốt nhất của một số ngôn ngữ xung đột với các tính năng tốt nhất của những ngôn ngữ khác.

Ví dụ: Phản xạ nhận biết kiểu là một tính năng thực sự tốt, nhưng nó sẽ không có giá trị nhiều trong một ngôn ngữ được gõ lỏng lẻo, nhưng đôi khi gõ lỏng lẻo cũng có thể là một lợi ích thực sự.

Ngay cả trong một ngôn ngữ, bạn không thể luôn sử dụng tất cả các tính năng tốt nhất cùng một lúc vì chúng xung đột với nhau.


nhưng nếu tính năng này được bật / tắt theo các yêu cầu cần thiết chẳng hạn: bạn có thể bật phản xạ nhận biết loại và vô hiệu hóa khả năng ngôn ngữ được gõ lỏng lẻo và v.v ...
killown

2
và nếu bạn đã thử kết hợp một loạt các tính năng của ngôn ngữ thành một ngôn ngữ có thể làm bất cứ điều gì, bạn sẽ nhận được rất nhiều sự dư thừa, nhầm lẫn, lỗi từ tất cả các cách khác nhau để sử dụng các kết hợp tính năng khác nhau và rất nhiều lãng phí nỗ lực chỉ định mô hình nào bạn đang sử dụng trên dòng này.

giết bạn là đúng, nhưng giải quyết vấn đề bằng cách làm cho ngôn ngữ siêu cấu hình làm cho ngôn ngữ khó sử dụng như mô tả của fennic. Tôi thích một ngôn ngữ linh hoạt cho phép mọi thứ ngay cả khi chúng nguy hiểm trong một số trường hợp, nhưng mức độ cấu hình bạn cần kết hợp một số khái niệm sẽ khiến nó phức tạp hơn là chỉ lùi lại và viết giải pháp ở cấp độ C thấp hoặc một cái gì đó .
Hóa đơn

1
+1 cho các tính năng xung đột
Frank Shearar

Tôi nghĩ rằng vấn đề không chỉ là ngôn ngữ có xung đột, mà là nhiều ngôn ngữ giả định một khung cơ bản bao gồm các tính năng áp đặt một mức phí nhất định, nhưng cho phép các hoạt động nhất định được đơn giản hóa. Các ngôn ngữ cũng thường có một số 'mẫu sử dụng điển hình' nhất định được liên kết với chúng. Việc lựa chọn các tính năng nên được bao gồm trong một khung và các kiểu mã hóa nào sẽ được sử dụng, liên quan đến sự đánh đổi; và các kết hợp khác nhau của các tính năng và mẫu sẽ tốt hơn cho các ứng dụng khác nhau.
supercat

7

"Jack của tất cả các ngành nghề - bậc thầy của không." lò xo để tâm.

Một số chương trình yêu cầu tốc độ, số lượng lớn bộ nhớ khác hoặc truy cập nhanh vào đĩa. Một số ngôn ngữ tốt ở một ngôn ngữ, nhưng lại kém về ngôn ngữ khác - Tôi không nghĩ bạn sẽ có một ngôn ngữ tốt cả.

Vì vậy, trong khi bạn có thể viết hầu như bất kỳ chương trình nào bằng bất kỳ ngôn ngữ nào, những gì bạn nhận được không được đảm bảo là chương trình "tốt nhất" bạn có thể viết để giải quyết vấn đề đó.


4

Có. Không có công cụ nào là tốt nhất cho mọi thứ, nhưng một số công cụ như nhiều ngôn ngữ lập trình phục vụ cho tất cả các mục đích, không phải là tốt nhất cho tất cả.

Bạn có thể chọn công cụ tốt nhất cho công việc nhưng có những ngôn ngữ lập trình có thể được sử dụng cho tất cả các mục đích và bạn có thể chọn chúng. Tôi không khuyên bạn nhưng điều đó là có thể.


4

Bởi vì một cái gì đó tôi gọi là "nghịch lý khái quát hóa / chuyên môn hóa", có lẽ có một tên khác và thực sự không phải là một nghịch lý

Một ngôn ngữ lập trình càng khái quát thì càng cần nhiều mã để hoàn thành một cái gì đó. Ngôn ngữ càng chuyên biệt, bạn càng ít có thể thực hiện được với nó.


2
Tôi đồng ý với bạn ngoại trừ việc có thể có các thư viện chuyên ngành bằng ngôn ngữ tổng quát.
dan_waterworth

@dan: Đồng ý, nhưng chỉ khi ngôn ngữ tập trung vào việc cung cấp các tính năng cho các nhà văn thư viện. Hai ngôn ngữ yêu thích của tôi là D và Python. Cả hai đều là ngôn ngữ khá chung chung (đặc biệt là D) nhưng cả hai đều có nhiều tính năng cho người viết thư viện, vì vậy bạn có thể xây dựng thư viện của riêng mình để xử lý các công cụ chuyên biệt. Tôi khinh thường các ngôn ngữ siêu tên miền cụ thể như Matlab và R.
dsimcha

4

Ngôn ngữ định hình cách mọi người nghĩ. Điều này đúng với ngôn ngữ tự nhiên. Nếu một đứa trẻ chỉ biết một ngôn ngữ với các số "một, hai, nhiều", thì việc dạy toán cho trẻ là ... khó. (Xin lỗi, tôi không có liên kết) Trong tiếng Anh, chúng ta nói về những thời điểm khác nhau như thể chúng là địa điểm - do đó khái niệm du hành thời gian là có thể tưởng tượng. Trong một số ngôn ngữ khác, ý tưởng du hành thời gian sẽ không bao giờ xảy ra với người nói.

Điều này cũng đúng với các ngôn ngữ lập trình.

Do đó, nếu chúng ta có một ngôn ngữ lập trình duy nhất, mọi người sẽ nghĩ về tất cả các nhiệm vụ tính toán giống hệt nhau. Do đó, chúng tôi sẽ không khám phá các lựa chọn thay thế, và cách tốt nhất để làm một cái gì đó sẽ vẫn chưa được khám phá.

Điều gần nhất mà chúng ta có với ngôn ngữ phổ quát là C. C ánh xạ rất sát với các khái niệm phần cứng cơ bản (cách mọi thứ thực sự được thực hiện trong phần cứng) và các chương trình trong mọi ngôn ngữ * có thể chuyển đổi thành C. (Xem cách CFront sử dụng trình biên dịch C cho trình biên dịch nhiệm vụ) Vấn đề với C về cơ bản là các chuyển đổi được đề cập ở trên sẽ không có ý nghĩa từ góc độ lập trình viên C.

"Lambdas" luôn có thể có trong C. Cú pháp bị tắt, bao gồm cả mã trải khắp toàn bộ dự án / tệp, do đó nó không phải là một giải pháp ưa thích. Với phiên bản không chụp / upvalue / etc, hãy xác định hàm ở một nơi khác và truyền con trỏ đến hàm. (xem qsort () ) Để sử dụng lambdas với các giá trị đã bắt, số lượng và độ phức tạp của mã bạn phải viết tăng lên rất nhiều - theo như tôi biết thì chưa có ai thực sự viết mã để sử dụng phương pháp lập trình này trong C. Trái ngược với các ngôn ngữ mà lambdas là một phần của ngôn ngữ, và về cơ bản được sử dụng ở mọi nơi.

Sự khác biệt chính giữa C và C ++ là cách bạn có thể yêu cầu C ++ chăm sóc mọi thứ cho bạn; nhưng sau đó bạn không còn có thể nhìn thấy, chỉ từ một dòng mã, bạn thực sự yêu cầu nó bao nhiêu. Câu trả lời trở thành: nó phụ thuộc (vào tất cả các mã khác này).

Một số ngôn ngữ lập trình là tuyệt vời cho các nhiệm vụ cụ thể, nhưng nơi mà hầu hết các chương trình hiện tại được sử dụng trên toàn thế giới đơn giản sẽ không có ý nghĩa nếu được lập trình bằng ngôn ngữ đó. Đó là, nếu ngôn ngữ có thể được sử dụng để thực hiện chương trình đó để bắt đầu, đó không phải là ngôn ngữ nhất định.


2
"Trong một số ngôn ngữ khác, ý tưởng du hành thời gian sẽ không bao giờ xảy ra với những người nói chuyện." Cần dẫn nguồn. Giả thuyết Sapir của Whorf không có nghĩa là được chấp nhận rộng rãi đặc biệt ở dạng mạnh.
Muhammad Alkarouri

4

Sự bất khả thi về giá trị kỹ thuật của việc có một ngôn ngữ phổ quát? Đó là tổng số vô nghĩa. Bạn có thểcó một ngôn ngữ phổ quát bao gồm tất cả các cơ sở. Vấn đề chủ yếu mang tính lịch sử: các ngôn ngữ khác nhau được phát minh để làm những việc khác nhau và được sử dụng trong các cộng đồng khác nhau. Nhiều người trong số họ bị mắc kẹt. Thêm vào sở thích đó (vi! Emacs! Chờ đợi, ý tôi là Java! C #, chờ tôi có nghĩa là Microsoft, Nguồn mở, v.v.) và nhúng chung các tai nạn lịch sử ... Hãy nhìn vào các ngôn ngữ tự nhiên ở một vùng đất nhỏ đại chúng như một số nước châu Âu để xem chủ đề này có thể trở nên điên rồ như thế nào. Một số thị trấn có niềm tự hào và niềm vui riêng, một phương ngữ nhỏ mà chỉ họ nói. Các quốc gia và cộng đồng lập trình không khác nhau, cộng đồng lập trình cũng hợp lý hơn. Nếu đúng như vậy, tất cả chúng ta sẽ nói esperanto và lập trình trong Universal đôi khi '...


1
Vấn đề còn sâu sắc hơn thế. Càng có nhiều tùy chọn bạn cung cấp, càng phải được chỉ định rõ ràng thay vì là một cách ngầm định mọi thứ hoạt động trong ngôn ngữ đó. Các vấn đề trở nên rõ ràng hơn nếu, thay vì so sánh Java với C #, bạn so sánh Java với Prolog. Để có các tính năng của cả hai trong một ngôn ngữ sẽ làm phức tạp cú pháp của ngôn ngữ ghép. Một lựa chọn hợp lý hơn có thể là giảm cú pháp đến mức tối thiểu và cho phép mọi tính năng được triển khai như một thư viện siêu lập trình. Về cơ bản, đó là những gì Lisp làm, mặc dù cốt lõi của nó không đủ thấp cho một số công việc.
Steve314

4

Thật sai lầm khi nghĩ rằng "kết hợp tất cả các tính năng" sẽ tạo ra một ngôn ngữ tốt hơn.

Bạn có nhiều khả năng kết thúc với một mớ hỗn độn, phức tạp, không thể đọc được.

Thiết kế ngôn ngữ tốt đòi hỏi sự lựa chọn và đánh đổi phải được thực hiện. Có thể cho rằng các ngôn ngữ tốt nhất / cách mạng nhất / thành công nhất là những ngôn ngữ lấy ra thứ gì đó và cung cấp một sự thay thế tốt hơn thay vì thêm những thứ mới vào. Ví dụ

  • Các ngôn ngữ lập trình có cấu trúc (C, Pascal) - lấy ra "goto", thay thế bằng các thủ tục và các vòng lặp có cấu trúc, v.v.
  • Java - đưa ra "quản lý bộ nhớ thủ công", thay thế bằng bộ nhớ được quản lý / GC
  • Haskell / Clojure - đưa ra "trạng thái đột biến không kiểm soát"
  • Lisp - đưa ra hầu hết "cú pháp ngôn ngữ", thay thế bằng một cây biểu thức đồng âm linh hoạt của biểu thức s

Có một cuộc nói chuyện tuyệt vời trên đỉnh này của chú Bob Martin - Ngôn ngữ lập trình cuối cùng


"Ngôn ngữ lập trình có cấu trúc (C, Pascal) - lấy ra" goto ", thay thế bằng các thủ tục và các vòng lặp có cấu trúc, v.v." - Xin lỗi, bạn sai ở đó: C có goto. Nhưng tôi thích phần còn lại của câu trả lời. Điều chính C làm là cho phép bạn không quan tâm chính xác mọi thứ trong bộ nhớ là gì và đăng ký vào lúc nào và nó ẩn bộ đếm chương trình (về địa chỉ chính xác mà nó đang ngồi, một lần nữa. Bạn có thể di chuyển nó ở mức độ lắp ráp chính xác với một goto).
Wyatt8740

0

Không có công cụ nào có tất cả các tính năng tốt nhất. Ví dụ, một tính năng hay của Javascript và Scheme là chúng nhỏ, vì vậy nếu bạn bắt đầu đóng gói các tính năng, bạn đã mất tính năng này.

Still Cobra có vẻ hứa hẹn theo hướng có tất cả các tính năng hay từ các ngôn ngữ khác. :-)


0

Bởi vì nếu bạn tạo ra một ngôn ngữ như vậy, nó sẽ là một ngôn ngữ mới khác. Bạn có thể có một lượng lớn người hâm mộ, nhưng tất cả các ngôn ngữ khác sẽ vẫn tồn tại.

C vẫn tồn tại mặc dù nhiều ngôn ngữ mới đã được phát minh kể từ đó.

Bạn có thể nói rằng trăn là một ngôn ngữ phổ quát như vậy, nhưng sau đó cũng có ruby.

Lý do có nhiều ngôn ngữ đơn giản là vì có nhiều lập trình viên và một số trong số họ thích tạo ngôn ngữ mới.

Lý do không có ngôn ngữ phổ quát duy nhất mà mọi người đồng ý là lập trình như một nghề thủ công không bị quy định bởi một số tổ chức đưa ra tất cả quyết định. Mọi người có thể tự do làm những gì họ muốn.

Đó là một điều tốt.


Tôi cũng sẽ tranh luận rằng nó không tốt cũng không xấu mà là một sự giả tạo của thực tế rằng công nghệ phần mềm thậm chí không phải là một trăm năm tuổi, và còn rất non nớt so với mọi loại kỹ thuật khác đang tồn tại.
Michael

0

Với tất cả những gì được viết cho đến nay, thật khó để thêm nhiều lý do mới, nhưng tôi sẽ ném vào một vài.

  • Sự tiến hóa: Nó không chỉ là các hệ thống sinh học được giới thiệu, biến đổi và trải qua một cuộc cạnh tranh sinh tồn nhất đối với các nguồn lực và một cách thích hợp để gọi riêng của chúng. Sự cạnh tranh là tốt và đẩy mọi thứ về phía trước.

  • Trưởng thành: Chúng tôi đã tạo ra các ngôn ngữ máy tính có lẽ ít hơn một thế kỷ. Chúng tôi chưa thể có câu trả lời vì chúng tôi thậm chí không biết tất cả các câu hỏi.

  • Nguồn gốc riêng biệt: Không chắc chắn từ thích hợp cho việc này, nhưng trên thế giới, chúng có nhiều hệ thống chữ viết bắt đầu ở nhiều vùng địa lý. Hãy suy nghĩ về Cuneiform đã được quyết định một phần bởi các yêu cầu khắc vào viên đất sét. Hãy nghĩ về tiếng Phạn, bảng chữ cái tiếng Hy Lạp, tiếng Do Thái, tiếng La Mã, tiếng Ả Rập. Chữ tượng hình, phương pháp viết chữ đẹp của Trung Quốc với hơn 6000 biểu tượng được chia sẻ ở nhiều nước Đông Á. Hãy nghĩ về các bảng chữ cái hỗn hợp hiện đại hơn với cơ sở ngữ âm như Cyrillic, Katakana và Hirigana. Tôi không phải là một nhà ngôn ngữ học vì vậy đừng quá gay gắt những điều không chính xác, nhưng khi các nền văn hóa trên toàn thế giới cần một cái gì đó, họ sẽ tạo ra nó và biến nó thành sự cần thiết. Ngôn ngữ máy tính xuất hiện khi có rất nhiều giao tiếp trên toàn thế giới và giống như các hệ thống Imperial và Metric, đến từ những nơi có ý tưởng lãnh đạo mạnh mẽ. Nhưng ngôn ngữ lập trình phục vụ nhiều nền văn hóa khác nhau (một số trong đó là văn hóa doanh nghiệp), vì vậy chúng phản ánh những người tạo ra chúng. Ngôn ngữ máy tính đi kèm với các di sản văn hóa định hình thiết kế và sử dụng của họ. Trong văn hóa nhân hệ điều hành, C và C ++ dường như không bị loại bỏ sớm đối với Java (hoặc ngược lại) vì chúng cho phép tạo mã gốc, khớp nối chặt chẽ / hiệu quả với phần cứng để tạo các lớp trừu tượng hóa phần cứng và có cài đặt dựa trên kích thước khá lớn.

  • Thiết kế thiết kế: Ngôn ngữ lập trình bắt nguồn từ việc sử dụng các mô hình tổ chức khác nhau. COBOL và Ada đến từ các ủy ban là một phần của DOD có nhiều thứ bậc. Nếu tôi nhớ lại chính xác C, C ++, Java và có lẽ nhiều người khác đến từ một hoặc một số ít nhà thiết kế. Fred Brooks so sánh kết quả của ủy ban với các phương pháp dựa trên tầm nhìn trong bài báo của mình, Thiết kế thiết kế (http://www.youtube.com/watch?v=pC-DlX-PaF4). Nếu hôm nay chúng ta ngồi xuống để chọn một Da Vinci hoặc một ủy ban để xác định ngôn ngữ lập trình phổ quát, liệu chúng ta sẽ biết ai hoặc bằng phương pháp nào nên được kiến ​​trúc?


0

Có lẽ hơi khác một chút về tất cả điều này:

Một ngôn ngữ là gì? Nói một cách đơn giản, đó là từ vựng, cú pháp và ngữ nghĩa.

Điều đầu tiên bạn làm với ngôn ngữ lập trình là gì?
Bạn định nghĩa mọi thứ - lớp học, biến, phương thức - bạn mở rộng vốn từ vựng và ngữ nghĩa.

Tại sao? Vì vậy, bây giờ bạn có thể nói những điều trong đó bạn không thể nói trước đây.
Dù muốn hay không, bạn đã tạo ra một ngôn ngữ có mục đích đặc biệt mới.

IMHO, điều cần tìm trong một ngôn ngữ có mục đích chung là nếu nó giúp dễ dàng tạo ra các ngôn ngữ có mục đích đặc biệt.


0

Ngoài tranh luận về dao-quân-quân (có một điểm - rất khó để thiết kế một ngôn ngữ phổ rộng tốt hơn ngôn ngữ dành riêng cho miền - nhưng điều đó không có nghĩa là ngôn ngữ đó sẽ không phải là cả hai có thể và một ý tưởng tốt), có vấn đề với "kết hợp các tính năng tốt nhất":

  • Đối với các tính năng ngôn ngữ, "tốt nhất" là chủ quan, hoặc ít nhất (tối thiểu) có thể tranh cãi.
  • Một số tính năng không tương thích; một tính năng tốt từ một ngôn ngữ có thể sẽ nổ tung khi kết hợp với một tính năng tốt từ ngôn ngữ khác.
  • Chúng tôi chưa hoàn thành các tính năng mới.

Nói tóm lại, thiết kế ngôn ngữ khó hơn và phức tạp hơn thế. Mặc dù, bạn có thể muốn xem Scala .



-2

Có một ngôn ngữ lập trình phổ quát. Nó được gọi là "ngôn ngữ máy" và mọi thứ trong bất kỳ ngôn ngữ máy tính nào khác cuối cùng được thực thi như ngôn ngữ máy.

Nó trông như thế nào? Một chuỗi 0-9 và AF.

Nhưng đó là một con chó cái để sử dụng. Vì vậy, Alan phát minh ra một ngôn ngữ có thể được dịch sang ngôn ngữ máy và phù hợp hơn với những gì Alan muốn làm. Bill phát minh ra một ngôn ngữ khác cho những gì Bill muốn làm. Trước đó, bạn đã có Cobol và Fortran và Lisp và Java. Tất cả chúng chỉ là những ngôn ngữ đơn giản hóa của ngôn ngữ máy, dễ viết một số loại chương trình nhất định nhưng khó hơn, hoặc không thể, để viết các loại chương trình khác. Một là tốt cho kế toán, một là tốt cho việc kiểm soát tàu con thoi.


6
Ngôn ngữ máy không phổ quát; thậm chí không gần gũi. Mỗi máy có ngôn ngữ riêng.
hasen

3
Ngoài ra, đây không phải là chuỗi 0-9 và AF. Đó là 1 và 0.
David Conrad

@hasen @David có hợp lý không khi đề xuất như @Andy rằng mọi ngôn ngữ, từ một quan điểm của một ngôn ngữ dành riêng cho tên miền, được xây dựng trên các ngôn ngữ khác?
Armand

Tôi đã nói 0-9 và AF vì đó là những gì bạn phải biết để sử dụng mã đa cú đấm trên máy móc khóa. Nó trông giống như 0-1 hoặc 0-15 hoặc 0-255 nếu bạn lấy nó làm số, tùy thuộc vào mức độ lớn của một khối tại một thời điểm. Và hansen là đúng; mỗi LOẠI máy đều có ngôn ngữ riêng. Hầu như tất cả các PC ngày nay đều chấp nhận mã 80386; thậm chí điện thoại của tôi sẽ! Nhưng iPad sẽ không.
Andy Canfield

@hasenj và với đặc điểm rộng rãi khác nhau. Tư duy cần thiết để lập trình 6502 khác với lập trình x86 và lần lượt khác với chip RISC. Rất xa phổ quát.

-2

Chỉ vì,

không có máy tính ĐẠI HỌC.

không phải là một dạng tấm UNIVERSAL.

không phải là một lập trình viên UNIVERSAL.

và thậm chí không phải là một khách hàng UNIVERSAL.

: P

Vì vậy, đơn giản là chúng ta cần một cái khác cho một cái khác. ;)


-2

Hầu hết các câu trả lời ở đây tập trung vào việc sử dụng công cụ tốt nhất cho từng vấn đề. Tôi không tin rằng đây là một lý do đủ tốt.

Nếu bạn nhìn vào các công ty lớn thì thông thường công ty sẽ có xu hướng sử dụng một (hoặc một số ít) ngôn ngữ và công nghệ, ngay cả khi đối với một dự án cụ thể có ngôn ngữ nào đó tốt hơn.

Điều này được thực hiện bởi vì những lợi ích phát sinh từ việc tiêu chuẩn hóa được cải thiện, hỗ trợ dễ dàng hơn, chia sẻ mã, v.v ... lớn hơn (hầu hết các lần) sau đó là giá trị gia tăng của một ngôn ngữ cụ thể.


1
Tôi chưa bao giờ thấy bất kỳ dự án công ty tử tế nào sử dụng ít hơn 4 ngôn ngữ khác nhau. Và tôi không tin vào bất kỳ "lợi ích" nào từ việc lựa chọn các công cụ không phù hợp. Nó không bao giờ làm việc.
SK-logic

-3

Tôi nghĩ rằng tất cả các câu trả lời "bởi vì bạn không khắc tượng bằng bút chì" đều thiếu điểm.

Ai ở đây, TRULY chọn một ngôn ngữ trước mỗi dự án mới?

Sự thật là, chúng ta chỉ cần một vài ngôn ngữ lập trình, và thế giới lập trình sẽ được tốt hơn theo cách đó: mọi người sẽ tập trung vào việc các ngôn ngữ kịch bản tốt hơn thay vì được rải rác trên python / ruby / perl / younameit ví dụ.

C # được lập trình trên / cho các cửa sổ (được rồi, có Mono, có ai ở đây chạy ứng dụng C # dưới ứng dụng Mono mỗi ngày không?) Và điều đó khiến người dùng mua Windows7 / 8 và điều đó kiếm tiền cho Microsoft.
Các công ty khác cũng làm như vậy, sau đó nguồn mở biết rõ hơn, rồi cả thiên tài nữa ... và chúng tôi có rất nhiều ngôn ngữ giống nhau, đó chỉ là bản chất tự tâm của nhân loại.


Đồng ý - chúng tôi hầu như chỉ thực sự cần một ngôn ngữ "an toàn" cấp cao, ngôn ngữ lập trình hệ thống "không an toàn" ở mức độ thấp, tất cả các ngôn ngữ lắp ráp (một ngôn ngữ cho mỗi CPU, chúng không thể tránh khỏi nhưng bị ẩn), cộng với một số mục đích đặc biệt (cụ thể theo tên miền) ngôn ngữ (ví dụ SQL). Vấn đề thực sự là không ai có thể tuyên bố một ngôn ngữ "không dùng nữa" (ngay cả khi nhà thiết kế ngôn ngữ cố gắng thực hiện - ví dụ: Python 2 so với Python 3). Nhiều ngôn ngữ mới mỗi năm và không có ngôn ngữ cũ nào bị loại bỏ có nghĩa là cuối cùng sẽ có nhiều ngôn ngữ được sử dụng hơn các lập trình viên sử dụng chúng. ;-)
Brendan

-5

Chúng ta phải tìm đến kinh tế để trả lời câu hỏi này. Nếu nó tiết kiệm tiền kinh doanh chỉ có một ngôn ngữ, chúng tôi sẽ có nó. Họ sẽ chuẩn hóa nó và yêu cầu mọi người sử dụng nó. Các ngôn ngữ khác sẽ mòn mỏi trong các tòa nhà học thuật bụi bặm và tầng hầm của những người đam mê mắt hoang dã. Điều này đã không xảy ra, vì vậy họ phải không có động cơ lợi nhuận trong ngôn ngữ lập trình phổ quát hoặc bây giờ người ta sẽ phát triển một cách tự nhiên.


1
"Tiền tiết kiệm" là (mặc dù kế toán nỗ lực tốt nhất) là một khái niệm mơ hồ và mơ hồ trong vòng đời. Giống như cơ học đã không chuẩn hóa ngay cả một kích thước cờ lê, đừng bận tâm đến toàn bộ bộ công cụ, công nghệ phần mềm đã không chuẩn hóa vì có rất nhiều tiêu chí để chọn một công cụ (ngôn ngữ) hoặc thậm chí là bộ xử lý / HĐH / môi trường
Andrew
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.