it-swarm-vi.com

Tại sao không thể có một ngôn ngữ lập trình "phổ quát" phục vụ tất cả các mục đích?

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?

60
killown

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

http://upload.wikimedia.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 ...

116
David_001

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. Apple
  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.
80
JeffO

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 máy chủ 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 mất căn cứ cho 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ế.

38
Bill Leeper
  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 bit tuốc 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ụ làm tất cả 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] một tuốc nơ vít 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ạ.

24
brettmjohnson

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 là tiềm năng để một ngôn ngữ trở thành 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 tương tự 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 sai lầm.

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ó cho 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 các 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ể đó 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 #) biên dịch bên 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 cho 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ó.

20
Mark H

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.

10
Bill

"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 đề đó.

7
ChrisF

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 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.

5
MaHuJa

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 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
Maniero

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ữ mà lấy ra một cái 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) - đưa 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 - loại bỏ 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 bởi chú Bob Martin - Ngôn ngữ lập trình cuối cùng

4
mikera

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 '...

4
Dan Rosenstark

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ó.

4
Homde

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 thị trường 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ừ đúng 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ư hệ thống Imperial và Metric, đến từ những nơi có khả năng lãnh đạo ý tưởng 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 cách khác) 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 ra sự trừu tượng hóa phần cứng các lớp, và có một cài đặt khá lớn dựa trê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 so với các phương pháp dựa trên Tầm nhìn trong bài viết 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
DeveloperDon

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

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 xác định mọi thứ - lớp, 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
Mike Dunlavey

Không có công cụ nào có tất cả các tính năng tốt nhất. Chẳng hạn, 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.

Tuy nhiên Cobra có vẻ đầy hứa hẹn theo hướng có tất cả các tính năng Nice từ các ngôn ngữ khác. :-)

0
Andrea

Ngoài tranh luận về con dao của quân đội Thụy Sĩ (có một điểm - đó là nhiều hơn 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à một ngôn ngữ như vậy sẽ không thể cả hai 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 .

0
comingstorm

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 python là một ngôn ngữ phổ quát, 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.

0
hasen