Tại sao có nhiều ngôn ngữ lập trình?


130

Tôi khá thành thạo C / C ++ và có thể tìm hiểu các ngôn ngữ kịch bản khác nhau (awk / sed / perl). Tôi đã bắt đầu sử dụng python rất nhiều vì nó kết hợp một số khía cạnh tiện lợi của C ++ với khả năng kịch bản của awk / sed / perl.

Nhưng tại sao có nhiều ngôn ngữ lập trình khác nhau? Tôi đoán tất cả các ngôn ngữ này có thể làm những điều tương tự, vậy tại sao không chỉ sử dụng một ngôn ngữ và sử dụng ngôn ngữ đó cho các máy tính lập trình? Đặc biệt, có lý do gì tôi nên biết một ngôn ngữ chức năng như một lập trình viên máy tính?

Một số bài đọc liên quan:


2
cũng có sự khác biệt giữa OO và không OO. Thêm vào đó, một số ngôn ngữ đi kèm với các gói đẹp: R, Maple, Matlab, Mathematica thường thiếu từ các ngôn ngữ khác.
Artem Kaznatcheev 17/03/2016



2
Để thực hiện các thuật toán song song, lập trình hàm tốt hơn, nói chung khi bạn có các đối tượng có thể thay đổi, tốt hơn là sử dụng mô hình OO, nếu không, nếu bạn muốn đối phó với các đối tượng bất biến ) thì tốt hơn nên thay đổi nó thành mô hình chức năng. Kịch bản này tồn tại rộng rãi trong xử lý song song. Ngoài ra một số mẫu OO tuyệt vời, như giao diện trôi chảy và chuỗi phương thức đang hoạt động giống như mô hình chức năng.

4
Tại sao có nhiều xe như vậy? Tại sao có nhiều máy bay? Và những gì về TUYỆT VỜI! Ý tôi thực sự là! Bạn đi xuống đại dương và ở đó, giống như, tất cả các KINDS của những điều nguy hiểm! Là gì điểm của tất cả những differents mọi thứ?!?!? Thật không hiệu quả! Thật lãng phí !! Và freakin là những gì điểm của tất cả những lựa chọn khác nhau?!?!? Geez - khôn lên mọi người! Không ai có thể cần bất cứ thứ gì ngoại trừ một chiếc Yugo, F-150 và một chiếc tàu biển! Ồ, vâng, máy bay - MD-80 sẽ hoạt động tốt với mọi thứ. Đó Bây giờ đó là tất cả các định cư ... :-)
Bob Jarvis

Câu trả lời:


116

Ngôn ngữ lập trình phát triển và được cải thiện theo thời gian (đổi mới).

Mọi người lấy ý tưởng từ các ngôn ngữ khác nhau và kết hợp chúng thành các ngôn ngữ mới. Một số tính năng được cải thiện (cơ chế kế thừa, hệ thống loại), một số được thêm vào (bộ sưu tập rác, xử lý ngoại lệ), một số được loại bỏ ( gotocâu lệnh, thao tác con trỏ mức thấp).

Các lập trình viên bắt đầu sử dụng một ngôn ngữ theo một cách cụ thể không được hỗ trợ bởi bất kỳ cấu trúc ngôn ngữ nào. Các nhà thiết kế ngôn ngữ xác định các mẫu sử dụng như vậy và giới thiệu các khái niệm trừu tượng / cấu trúc ngôn ngữ mới để hỗ trợ các mẫu sử dụng đó. Không có thủ tục trong ngôn ngữ lắp ráp. Không có lớp nào trong C. Không có xử lý ngoại lệ trong (sớm) C ++. Không có cách nào an toàn để tải các mô-đun mới bằng các ngôn ngữ ban đầu (dễ dàng trong Java). Không có các luồng tích hợp (dễ dàng trong Java).

Các nhà nghiên cứu nghĩ về các cách khác nhau để thể hiện tính toán. Điều này dẫn đến Lisp và nhánh ngôn ngữ chức năng của cây ngôn ngữ, Prolog và nhánh lập trình logic, Erlang và các mô hình lập trình dựa trên diễn viên khác, trong số các mô hình khác.

Theo thời gian, các nhà thiết kế / nghiên cứu ngôn ngữ hiểu rõ hơn về tất cả các cấu trúc này và cách chúng tương tác và thiết kế ngôn ngữ để bao gồm nhiều cấu trúc phổ biến, tất cả được thiết kế để hoạt động liền mạch với nhau. Điều này dẫn đến các ngôn ngữ tuyệt vời như Scala, có các đối tượng và lớp (được biểu thị bằng các đặc điểm thay vì thừa kế đơn hoặc đa), các tính năng lập trình chức năng, các kiểu dữ liệu đại số được tích hợp độc đáo với hệ thống lớp và khớp mẫu và đồng thời dựa trên diễn viên.

Các nhà nghiên cứu tin vào các hệ thống kiểu tĩnh cố gắng cải thiện tính biểu cảm của họ, cho phép những thứ như gõ các lớp chung trong Java (và tất cả những điều tuyệt vời trong Haskell), để lập trình viên được đảm bảo hơn trước khi chạy chương trình mà mọi thứ sẽ không xảy ra đi sai Các hệ thống kiểu tĩnh thường đặt ra một gánh nặng lớn cho người lập trình (gõ các kiểu), vì vậy nghiên cứu đã đi vào giảm bớt gánh nặng đó. Các ngôn ngữ như Haskell và ML cho phép lập trình viên bỏ qua tất cả các chú thích loại (trừ khi họ đang làm một cái gì đó khó khăn). Scala cho phép lập trình viên bỏ qua các kiểu trong phần thân của các phương thức, để đơn giản hóa công việc của lập trình viên. Trình biên dịch nhiễm tất cả các loại còn thiếu và thông báo cho người lập trình các lỗi có thể xảy ra.

Cuối cùng, một số ngôn ngữ được thiết kế để hỗ trợ các tên miền cụ thể. Ví dụ bao gồm SQL, R, Makefiles, ngôn ngữ đầu vào Graphviz, Mathmatica, LaTeX. Việc tích hợp những gì các chức năng của các ngôn ngữ này vào các ngôn ngữ có mục đích chung (trực tiếp) sẽ khá cồng kềnh. Các ngôn ngữ này dựa trên các khái niệm trừu tượng dành riêng cho miền cụ thể của chúng.

Không có sự tiến hóa trong thiết kế ngôn ngữ lập trình, tất cả chúng ta vẫn đang sử dụng ngôn ngữ hợp ngữ hoặc C ++.

Như để biết một ngôn ngữ lập trình chức năng : các ngôn ngữ chức năng cho phép bạn diễn đạt các tính toán khác nhau, thường chính xác hơn so với việc sử dụng các ngôn ngữ lập trình khác. Xem xét về sự khác biệt giữa C ++ và Python và nhân nó với 4. Nghiêm trọng hơn, như đã được đề cập trong một câu trả lời khác, lập trình chức năng cung cấp cho bạn một cách nghĩ khác về các vấn đề. Điều này áp dụng cho tất cả các mô hình khác; một số phù hợp hơn với một số vấn đề, và một số thì không. Đây là lý do tại sao các ngôn ngữ đa mô hình đang trở nên phổ biến hơn: bạn có thể sử dụng các cấu trúc từ một mô hình khác nếu bạn cần, mà không thay đổi ngôn ngữ và, thách thức hơn, bạn có thể trộn các mô hình trong một phần mềm.


1
Hoàn toàn đồng ý. Tôi quan tâm đến việc các ngôn ngữ đa mô hình (ví dụ Scala) sẽ diễn ra trong một vài năm nữa. Nếu chúng cho phép tích hợp DSL dễ dàng, chúng ta thực sự có thể thấy sự suy giảm dần dần về số lượng ngôn ngữ.
Raphael

2
Câu trả lời rất chi tiết! Chúng tôi có thể thừa nhận rằng hầu hết các ngôn ngữ lập trình có thể là Turing Equivalent, nhưng điều đó không có nghĩa là sự trừu tượng mà họ hỗ trợ phù hợp với mọi miền vấn đề.
CyberFonic

Đặt lắp ráp và C ++ trong cùng một hộp làm tổn thương trái tim tôi. C ++ đã phát triển rất nhiều !! Đặc biệt kể từ C ++ 11 trở đi.
Peregring-lk

66

tldr: Không có ngôn ngữ viên đạn bạc.

Tôi hy vọng họ sẽ không kiện tôi, nhưng đây là một bức ảnh từ một trong những bài thuyết trình của Stanford.

nhập mô tả hình ảnh ở đây

Khi bạn quyết định chọn một ngôn ngữ, bạn chỉ có thể chọn 2 trong số 3 tính năng này .

Và đó là lý do tại sao mọi người buồn và muốn phát minh ra một siêu ngôn ngữ sẽ bao gồm cả 3 trong số họ.

Trên thực tế, có một danh sách rất lớn các yêu cầu (một số trong số chúng bạn có thể thấy trong các câu trả lời khác) nhưng chúng chỉ thêm chi tiết vào các tính năng cốt lõi. Ngoài ra, có những lý do lịch sử và chính trị để thích một ngôn ngữ hơn ngôn ngữ khác.

Sự kết hợp của các yếu tố như vậy mang lại một ngôn ngữ mới.

( Và tôi đã nghe nói rằng mọi lập trình viên giỏi nên tạo ra ngôn ngữ mới của riêng họ;) )


11
Theo thời gian tam giác đang co lại, theo nghĩa là các góc ngày càng gần nhau hơn ..... Tôi hy vọng / mơ ước.
Dave Clarke

1
Hiệu suất và Tính tổng quát, có thể so sánh ít hơn nhưng tôi sẽ nói thêm rằng trải nghiệm trong ngôn ngữ mang lại cho bạn năng suất cao hơn chính ngôn ngữ đó, thật không công bằng khi so sánh "năng suất của ngôn ngữ", bởi vì bạn cần có kiến ​​thức và chuyên môn tất cả chúng, một giả thuyết rất khó xảy ra.
Hernan_eche

Đây là một tuyên bố thú vị và loại nhắc nhở tôi về định lý CAP. Đây chỉ là một cuộc tranh luận không chính thức, hay tam giác có thể được chứng minh?
evnu

1
@evnu, đây là một đối số quasiformal của một phần: giả sử tính tổng quát có nghĩa là các chương trình hợp lệ có độ dài n trong ngôn ngữ L bao trùm một không gian vấn đề lớn hơn, mỗi không gian con của các vấn đề chỉ được bao phủ bởi một số phân số của các chương trình độ dài n. Nếu các chương trình có độ dài n bên ngoài không gian con cụ thể của bạn thay vào đó trong không gian con của bạn, bạn sẽ có nhiều khả năng tìm thấy một chương trình ngắn hơn để giải quyết vấn đề của bạn (vì vậy có lẽ bạn sẽ làm việc hiệu quả hơn), nhưng ngôn ngữ sẽ ít chung chung hơn - - nó sẽ giải quyết vấn đề trong các không gian con khác kém hơn (nghĩa là với các chương trình dài hơn).
Jonas Kölker

Đây là một lập luận tốt rằng bạn cần ít nhất hai ngôn ngữ lập trình, cũng như một số lượng lớn các ngôn ngữ dành riêng cho miền, do đó bao trùm cả ba cạnh của tam giác. Chúng ta có nhiều, rất nhiều, nhiều hơn thế. (Và tôi đã đặt c ở đỉnh trên cùng của tam giác, nhưng đó là một mối bận tâm khá nhỏ.)
Peter Shor

25

Thế giới đầy những thứ có nhiều biến thể khác nhau: bộ xử lý văn bản, xe hơi, thiết kế nhà, đồ uống, kẹo, bút, xẻng, v.v ... Những lý do tại sao chúng ta có rất nhiều nguyên tắc có thể được rút ra theo một vài nguyên tắc:

  • Ai đó nghĩ rằng họ có thể cải thiện các sản phẩm hiện có
  • Một thiết kế khác là cần thiết bởi những cân nhắc của địa phương (nghĩ: nhà sàn so với nhà trên tấm bê tông)
  • Một danh mục sản phẩm mới đáp ứng nhu cầu không tồn tại trước đây

Đi vào bất kỳ cửa hàng cung cấp văn phòng nào và xem phần "dụng cụ viết" - có hàng trăm loại bút. Tất cả đều làm gần giống nhau: đưa mực lên bề mặt viết. Nhưng mỗi cây bút bạn thấy được hiển thị để bán là có vì một trong ba lý do trên.

  • Bút máy mực là một cải tiến trên bút máy nhúng, bản thân chúng là một cải tiến trên bút lông.
  • NASA cần một cây bút có thể viết trong trường hợp không có trọng lực, vì vậy cây bút bi lăn áp lực đã được phát minh.
  • Cây bút đầu tiên cũng có thể là một cây gậy nhọn nhúng trong hắc ín hoặc máu; trước đó mọi người đã cạo đá cùng nhau hoặc bôi các sắc tố trên tường bằng lông thú. (Chỉ là một phỏng đoán.)

Sự phát triển của bút sẽ tiếp tục vì không một sản phẩm nào phù hợp với nhu cầu của mọi người dùng. Một số bút rẻ tiền và dùng một lần, một số đắt tiền và được chế tạo bằng vật liệu chất lượng cao; một số sử dụng gel, một số sử dụng mực, một số sử dụng sắc tố; một số có nắp vặn, một số không có mũ; thùng rộng, thùng hẹp, thùng tròn, thùng vuông; ngắn dài; đỏ, trắng, đen, xanh. Vân vân.

Nhưng đủ về bút.

Vô số ngôn ngữ lập trình hiện tại của chúng tôi có thể được truy nguyên từ những ngôn ngữ đầu tiên: mã máy số cho các máy tính đầu vào những năm 1940. Nguyên thủy, khó sử dụng và tốn nhiều công sức để vào máy tính, nhưng họ đã làm được việc. Không lâu sau đó, các lập trình viên đã gán các từ ghi nhớ (như ADD, CALL, LOAD) cho các mã máy, tạo ra lớp ngôn ngữ gọi là "ngôn ngữ lắp ráp".

Các kiến ​​trúc bộ xử lý khác nhau được gọi cho các mã ghi nhớ khác nhau, tùy thuộc vào các tính năng cụ thể của các máy bên dưới. Lấy những khác biệt này vào tài khoản có nghĩa là phát minh ra các ngôn ngữ lắp ráp khác nhau.

(Có lẽ đến bây giờ bạn có thể thấy nơi này sẽ diễn ra ...)

Các lập trình viên đã xem xét các chương trình ngôn ngữ lắp ráp của họ và thấy các mẫu: các chuỗi hướng dẫn tương tự sẽ được sử dụng để tạo thành các vòng lặp, điều kiện, gán biến, gọi hàm, v.v. Do đó, các ngôn ngữ lập trình thủ tục đã ra đời. Các ngôn ngữ này gói gọn các nhóm hướng dẫn theo các thuật ngữ ô như "nếu", "trong khi", "cho phép", v.v.

Trong một phân tích toán học về lập trình máy tính đã xuất hiện các ngôn ngữ chức năng - một cách hoàn toàn mới để xem xét tính toán. Không tốt hơn, không tệ hơn, chỉ khác.

Và sau đó là hướng đối tượng, gõ tĩnh, gõ động, ràng buộc muộn, ràng buộc sớm, sử dụng bộ nhớ thấp, sử dụng bộ nhớ cao, song song, ngôn ngữ cho các mục đích sử dụng cụ thể và bật và tắt.

Cuối cùng, chúng tôi có các ngôn ngữ lập trình khác nhau vì chúng tôi muốn các ngôn ngữ lập trình khác nhau. Mỗi nhà thiết kế ngôn ngữ có ý tưởng riêng của họ về cách ngôn ngữ "giấc mơ" của họ sẽ trông và vận hành. Sự đa dạng là một điều tốt .


Tôi không thấy bất kỳ lý do thuyết phục nào được đưa ra ở đây vì lý do tại sao chúng ta nên có nhiều ngôn ngữ bên cạnh đó mọi người muốn vì bất kỳ lý do gì.
Raphael

Đó là chính xác. Lập trình viên về bản chất là người giải quyết vấn đề. Để giải quyết vấn đề, họ cần các công cụ thường ở dạng ngôn ngữ lập trình. Nếu các công cụ không thể giúp họ giải quyết vấn đề theo cách họ muốn, họ sẽ phát minh ra các công cụ mới. Hãy nghĩ về nó theo cách này: vì các công cụ là phần mềm và phần mềm mới được viết để giải quyết các vấn đề mới, bản thân các công cụ có thể là vấn đề cần giải quyết. Những vấn đề được giải quyết bằng cách làm cho các công cụ mới.
Barry Brown

Chỉ một nit: Nhánh chức năng của các ngôn ngữ là một ý tưởng của các nhà toán học về cách diễn đạt cái mà ngày nay chúng ta gọi là "điện toán", bắt đầu được xem xét khoảng 50 năm trước các máy tính đầu tiên. Không có gì khi LISP (dưới một hình thức nào đó) là ngôn ngữ lâu đời thứ hai vẫn còn tồn tại, ngôn ngữ đầu tiên là FORTRAN.
vonbrand

20

Các ngôn ngữ lập trình hàm thường dựa trên mô hình tính toán khác nhau (nhưng tương đương về sức mạnh): lambda-compus . Có một số ngôn ngữ chưa được gõ (có kiểu gõ giống Python) như LISP, Scheme (được sử dụng trong sách / khóa học Cấu trúc máy tính có thể nhận biết rộng rãi ) và các ngôn ngữ được gõ tĩnh như Haskell, ML, F #.

SICP là thứ đưa tôi vào lập trình chức năng, nhưng những người khác giới thiệu bài viết này của John Hughes và cuộc phỏng vấn này với anh ta.

Lập trình chức năng hiện đang được Microsoft thúc đẩy, ví dụ, người đã bao gồm F # (ngôn ngữ chức năng của họ cho .NET) trong VS2010 và 11; họ cũng sử dụng một số nhà phát triển Haskell trong MSR, IIRC.

Lưu ý rằng cũng có một số ngôn ngữ lập trình chức năng không phải lambda-tính toán, chẳng hạn như Refal , dựa trên khớp mẫu và viết lại.

Bởi vì mức độ trừu tượng trong các ngôn ngữ chức năng là khác nhau, thái độ của bạn đối với việc giải quyết vấn đề thay đổi, khi bạn sử dụng các kỹ thuật lập trình chức năng. Một số người nói rằng nó có thể làm cho bạn trở thành một lập trình viên tốt hơn nói chung.


1
Một lớp ngôn ngữ thú vị khác là ngôn ngữ lập trình logic, như Prolog. Tôi chỉ có một trải nghiệm rất hạn chế với DataLog vì vậy có lẽ ai đó có thể viết câu trả lời về những điều đó?
Daniil

2
Tôi đồng ý rằng chúng ta cần một ngôn ngữ lập trình cho mỗi mô hình lập trình: mệnh lệnh, OO, khai báo, chức năng, v.v. Nhưng điều này không giải thích tại sao chúng ta có rất nhiều ngôn ngữ OO.
Đại

@Dai, tốt, chúng ta thực sự? Nền tảng lý thuyết không phải là đặc điểm duy nhất của ngôn ngữ. Ví dụ, người ta có thể nói rằng một tính năng chính của Java hoặc C # là (so với C ++) máy ảo, điều này làm cho Java khác biệt đáng kể.
Daniil

Nhưng sau đó, nếu cả C # và Java đều sử dụng khái niệm máy ảo, tại sao chúng ta không sử dụng cú pháp giống hệt nhau cho cả hai ngôn ngữ? Tôi nghĩ rằng mọi nhà thiết kế đều có những ý tưởng mạnh mẽ của anh ấy / cô ấy như thế nào và ngôn ngữ của anh ấy / cô ấy sẽ trông như thế nào và có xu hướng tạo ra tiêu chuẩn của riêng anh ấy / cô ấy.
Đại

@Dai, có rất nhiều sự khác biệt nhỏ giữa C # và Java. Thêm vào đó, tôi nghĩ rằng đã có một số tranh chấp pháp lý về Java VM cho Windows hoặc một cái gì đó tương tự.
Daniil

19

Cụ thể, có lý do nào để tôi biết một ngôn ngữ chức năng như một lập trình viên máy tính không?

Đúng. Bởi vì haskell đã thay đổi cách tôi nghĩ. Nó có thể thay đổi cách bạn nghĩ quá.

Câu chuyện: Tôi từng nghĩ rằng tôi có thể học bất kỳ ngôn ngữ lập trình nào trong một ngày. Một ngày nọ tôi bắt đầu Haskell. Tôi đã hoàn thành tất cả mọi thứ đến trước các đơn nguyên trong nửa ngày. Bây giờ đã là một năm kể từ ngày đó và tôi vẫn vô vọng bị mắc kẹt tại Monads.

Đọc:

  1. Ngôn ngữ và suy nghĩ wiki

  2. Ký hiệu như một công cụ để suy nghĩ của Kenneth E. Iversion, bài giảng Turing Award

Nhưng tại sao có nhiều ngôn ngữ lập trình khác nhau?

Ký hiệu là công cụ để suy nghĩ. Chúng ta cần các ký hiệu khác nhau được thiết kế riêng để đối phó với những suy nghĩ khác nhau một cách thoải mái. Vì vậy, chúng tôi tạo ra các ngôn ngữ mới.

Ngoài ra, đọc . ;-)


5
Để tái diễn là thiêng liêng!
Pratik Deoghare

4
lặp đi lặp lại là con người?
Suresh

1
Không chắc chắn nếu đó là một quảng cáo tốt cho Haskell. ;)
Barry Brown

@Pratik Deoghare. Học Haskell trong một ngày có lẽ không phải là một ý tưởng tốt. Tôi có thể nói, hãy đọc một cuốn sách văn bản hay về lập trình chức năng, như Bird và Wadler, và dành thời gian của bạn để làm điều đó. Sau đó, các đơn vị có thể không quá khó khăn.
Uday Reddy

"Tôi đã hoàn thành mọi thứ xuất hiện trước các đơn nguyên trong nửa ngày." Có thật không? Bạn đã học đánh máy, functor, ADT, các loại, vv trong nửa ngày? Không thể nào. LYAH có các đơn vị ở chương 12 trên 14. RWH không có đơn vị nào cho đến chương 6 và chúng được giới thiệu rất
chậm

13

Hầu như không thể có một lập trình viên đôi khi không cảm thấy bực bội vì những hạn chế của ngôn ngữ họ đang sử dụng và quyết định gãi ngứa. Do đó, một ngôn ngữ mới - hay phương ngữ của một ngôn ngữ hiện có - được sinh ra.

Abadi và Cardelli trong "A Theory of Object" phát triển cả một nhóm ngôn ngữ lập trình từ các nền tảng hướng đối tượng. Họ chứng minh rằng lập trình chức năng là trường hợp đặc biệt của OO nhưng không phải là điều ngược lại.

Phát minh ra một cái gì đó mới là niềm vui, đó là lý do tại sao mọi người có nhiều khả năng tạo ra một ngôn ngữ khác hơn là góp phần làm cho ngôn ngữ hiện có trở nên tốt hơn. Tất nhiên, có những người quản lý ngôn ngữ không hoan nghênh những thay đổi đối với tầm nhìn của họ. Ví dụ tốt nhất là khoảng cách giữa những người ủng hộ Common Lisp và Scheme.


3
Lý thuyết về các đối tượng không trình bày cả một nhóm ngôn ngữ lập trình có thể sử dụng. Nó trình bày một nền tảng cho các ngôn ngữ lập trình hướng đối tượng và một ngôn ngữ lạ ở đó, không dựa trên các lớp. Tôi không thấy mối liên hệ giữa "Lý thuyết về các đối tượng" và lập trình chức năng. Ví dụ, tính toán đối tượng không có khái niệm về sự lười biếng. Ngoài ra còn có nghiên cứu mã hóa các khái niệm OO về chức năng và hồ sơ, ví dụ, công việc của Pierce vào cuối những năm 90.
Dave Clarke


11

Tại sao có nhiều nước trên thế giới? Sẽ không dễ dàng hơn nếu chúng ta chỉ có 5 hoặc 6 siêu năng lực, hoặc thậm chí là một vương quốc toàn cầu của Trái đất? Thật dễ dàng để tranh luận tại sao nó sẽ không tốt hơn --- để bắt đầu, cạnh tranh các quốc gia khác nhau có thể dẫn đến tiến bộ, và từ quan điểm của dân chủ, nhân quyền, v.v., nhiều quốc gia có thể tốt hơn một - - nhưng điều này không giải thích, tại sao chúng ta có nhiều quốc gia. Nó chỉ giải thích tại sao nhiều quốc gia sẽ tốt hơn .

Tương tự, bạn có thể hỏi, tại sao rất nhiều ngôn ngữ khác nhau của con người? Tiếng Ba Lan, tiếng Ả Rập, tiếng Quan Thoại ... Sẽ không dễ dàng hơn nếu chỉ có một ngôn ngữ? Bạn có thể tranh luận một trong hai cách, nhưng đó sẽ là những lý do tại sao nó sẽ tốt hơn nếu cuộc sống là cách này hay cách khác. Nó sẽ không giải thích nguyên nhân đằng sau có quá nhiều ngôn ngữ khác nhau của con người.

Vấn đề là, có rất nhiều người trên hành tinh này, và tất cả chúng ta đang làm việc của chúng ta, tất cả chúng ta đều có ý kiến ​​của mình, tất cả chúng ta đều muốn chịu trách nhiệm và có quốc gia hoặc ngôn ngữ lập trình của riêng mình và chúng ta thường nghĩ rằng chúng ta biết rõ hơn hơn những người khác, hoặc ít nhất đừng bận tâm để hiểu những gì người khác cung cấp.

Đọc bài đăng blog rất khai sáng này, Tại sao rất nhiều khung web Python? Rõ ràng, có khoảng 50 khung web trong Python. Điều này thật vô lý; hoàn toàn không có lý do hợp lý cho điều đó. Nhưng tác giả của bài trả lời bài đăng: có rất nhiều khung web Python vì nó rất dễ tạo ra một . Bạn không cần một lý do hợp lý để có nhiều khung web python hoặc nhiều ngôn ngữ lập trình hơn. Mọi người sẽ tiếp tục tạo ra những cái mới bởi vì họ không biết những gì đã có sẵn, hoặc vì họ hy vọng họ có thể kiếm tiền, hoặc chỉ vì tạo ra những thứ mới là niềm vui!

Hãy để tôi mô tả một ví dụ cá nhân. Khoảng 10 năm trước tôi đã viết một số mã C ++ cho một công ty Phần Lan. Bạn biết đấy, ở Phần Lan họ có những chiếc xe tải khổng lồ đó, tốt, di chuyển đường dài và cung cấp rất nhiều thứ từ nơi này sang nơi khác. Tôi chắc chắn, có những chiếc xe tải như vậy ở Mỹ là tốt. Vì vậy, một vấn đề điển hình là đảm bảo rằng tất cả 24 lốp xe đều ổn. Tất nhiên, có công nghệ được thử nghiệm theo thời gian: áp suất và nhiệt độ có thể được theo dõi, và những thay đổi mạnh mẽ sẽ chỉ ra rằng đã xảy ra sự cố. Tất nhiên, tất cả các công nghệ này là độc quyền, được cấp bằng sáng chế, với tất cả các hàm ý. (Hãy nhớ rằng: các bằng sáng chế được cho là thúc đẩy sự đổi mới!) Vì vậy, công ty Phần Lan này muốn phát hiện tình trạng của lốp xe bằng ... âm thanh. Ý tưởng là cài đặt micrô để nghe âm thanh phát ra từ tất cả các lốp xe và thực hiện một số loại phép thuật xử lý tín hiệu trên các âm thanh đó để xem liệu một trong các lốp xe có vấn đề gì không, và tôi đang làm một nguyên mẫu của sự điên rồ này. (Họ thậm chí còn có một phòng thí nghiệm chuyên dụng để ghi lại âm thanh mẫu; một lần họ gửi cho tôi một bản ghi video ấn tượng về một dịp đặc biệt khi họ cố gắng làm nổ lốp xe sau khi chịu áp suất 5 hoặc 10 tấn và làm nóng đến nhiệt độ vô lý .) Rõ ràng, một lần nữa, không có một lý do hợp lý cụ thể nào cho sự phát triển này, ngoại trừ việc đó là niềm vui và một số người muốn kiếm tiền. Vì vậy, cũng hiểu rằng có rất nhiều lý do là tại sao ai đó sẽ bắt đầu phát triển một ngôn ngữ lập trình mới. Không có nhu cầu hoặc thậm chí khả năng để tìm hiểu tất cả chúng. (Họ thậm chí còn có một phòng thí nghiệm chuyên dụng để ghi lại âm thanh mẫu; một lần họ gửi cho tôi một bản ghi video ấn tượng về một dịp đặc biệt khi họ cố gắng làm nổ lốp xe sau khi chịu áp suất 5 hoặc 10 tấn và làm nóng đến nhiệt độ vô lý .) Rõ ràng, một lần nữa, không có một lý do hợp lý cụ thể nào cho sự phát triển này, ngoại trừ việc đó là niềm vui và một số người muốn kiếm tiền. Vì vậy, cũng hiểu rằng có rất nhiều lý do là tại sao ai đó sẽ bắt đầu phát triển một ngôn ngữ lập trình mới. Không có nhu cầu hoặc thậm chí khả năng để tìm hiểu tất cả chúng. (Họ thậm chí còn có một phòng thí nghiệm chuyên dụng để ghi lại âm thanh mẫu; một lần họ gửi cho tôi một bản ghi video ấn tượng về một dịp đặc biệt khi họ cố gắng làm nổ lốp xe sau khi chịu áp suất 5 hoặc 10 tấn và làm nóng đến nhiệt độ vô lý .) Rõ ràng, một lần nữa, không có một lý do hợp lý cụ thể nào cho sự phát triển này, ngoại trừ việc đó là niềm vui và một số người muốn kiếm tiền. Vì vậy, cũng hiểu rằng có rất nhiều lý do là tại sao ai đó sẽ bắt đầu phát triển một ngôn ngữ lập trình mới. Không có nhu cầu hoặc thậm chí khả năng để tìm hiểu tất cả chúng. một lần họ gửi cho tôi một bản ghi video ấn tượng về một dịp đặc biệt khi họ cố gắng nổ lốp mẫu sau khi chịu áp suất 5 hoặc 10 tấn và làm nóng đến nhiệt độ vô lý.) Rõ ràng, một lần nữa, không có lý do cụ thể nào Lý do cho sự phát triển này, ngoại trừ việc đó là niềm vui và một số người muốn kiếm tiền. Vì vậy, cũng hiểu rằng có rất nhiều lý do là tại sao ai đó sẽ bắt đầu phát triển một ngôn ngữ lập trình mới. Không có nhu cầu hoặc thậm chí khả năng để tìm hiểu tất cả chúng. một lần họ gửi cho tôi một bản ghi video ấn tượng về một dịp đặc biệt khi họ cố gắng nổ lốp mẫu sau khi chịu áp suất 5 hoặc 10 tấn và làm nóng đến nhiệt độ vô lý.) Rõ ràng, một lần nữa, không có lý do cụ thể nào Lý do cho sự phát triển này, ngoại trừ việc đó là niềm vui và một số người muốn kiếm tiền. Vì vậy, cũng hiểu rằng có rất nhiều lý do là tại sao ai đó sẽ bắt đầu phát triển một ngôn ngữ lập trình mới. Không có nhu cầu hoặc thậm chí khả năng để tìm hiểu tất cả chúng.

Tất nhiên, tất cả những điều này chỉ áp dụng nếu bạn tin vào sự tiến hóa. Nếu bạn tin vào một số hình thức thiết kế thông minh, rằng Chúa cũng đã tạo ra tất cả các ngôn ngữ lập trình, thì bạn sẽ phải tìm một mục đích đằng sau vô số điều này. Có lẽ Chúa muốn thúc đẩy cạnh tranh giữa các ngôn ngữ lập trình khác nhau để nghệ thuật phát triển phần mềm đạt đến trạng thái cao nhất có thể.

Tóm lại, có nhiều người, nhiều quốc gia, nhiều ngôn ngữ lập trình. Đây chỉ là bản chất của cuộc sống! Chúng ta hãy biết ơn vì điều đó: điều này chỉ có nghĩa là lĩnh vực lập trình / khoa học máy tính còn sống và phát triển mạnh mẽ.


câu trả lời rất hoàn hảo, tôi không biết tại sao nó không được chấp nhận!
Am_I_Hỗ trợ

8

Tại sao có nhiều ngôn ngữ lập trình khác nhau?

Bởi vì có những lựa chọn được thực hiện:

  • Chế độ đặc tả: Bắt buộc so với chức năng
  • Gõ: Gõ tĩnh so với gõ động
  • Thứ tự đánh giá: gọi theo giá trị so với gọi theo tên
  • Modularity: dựa trên lớp so với loại dữ liệu trừu tượng
  • Mô hình thực thi: tuần tự so với đồng thời

May mắn thay, hai cái cuối cùng là sự phân đôi không cần thiết, tức là, người ta có thể đặt cả hai lựa chọn vào một ngôn ngữ lập trình duy nhất. Nhưng, ba nhị phân đầu tiên tạo ra 8 kết hợp. Vì vậy, ngay cả trong một thế giới lý tưởng, sẽ có ít nhất 8 ngôn ngữ lập trình. Khi bạn đi sâu vào, sẽ có nhiều lựa chọn thiết kế sắc thái hơn trong các mô hình cụ thể. Ví dụ, nếu một người quyết định thực hiện một ngôn ngữ gõ tĩnh dựa trên lớp, có nhiều cách khác nhau để thiết kế hệ thống loại. Vẫn chưa có một cách làm kinh điển. Nếu một người quyết định thực hiện một ngôn ngữ lập trình đồng thời, có nhiều cách khác nhau để biểu diễn đồng thời: semaphores, các khu vực quan trọng có điều kiện, màn hình, truyền tin nhắn (đồng bộ so với không đồng bộ). Trong truyền tin nhắn đồng bộ,

Một phần của nghiên cứu chúng tôi thực hiện trong lý thuyết ngôn ngữ lập trình được dành cho việc giải quyết các lưỡng phân này. Ví dụ, tôi đã làm việc để giải quyết sự phân đôi giữa lập trình mệnh lệnh và chức năng trong một bài báo gọi là " Bài tập cho các ngôn ngữ ứng dụng " và phương pháp của chúng tôi hiện đã được Haskell áp dụng, biến nó thành ngôn ngữ chức năng và mệnh lệnh. Điều đó không có nghĩa là sự phân đôi được giải quyết hoàn toàn. Một lập trình viên Haskell vẫn phải đối mặt với việc lựa chọn giải quyết vấn đề của mình theo chức năng hay bắt buộc. Luca Cardelli đã làm việc để giải quyết sự phân đôi gõ tĩnh so với động. Paul Levy đã làm việc để giải quyết sự phân đôi giữa các giá trị so với gọi theo tên gọi . Không phải tất cả các kết quả này đã được thực hiện trong các ngôn ngữ lập trình thực tế.


Nếu tất cả các ngôn ngữ này có thể làm những điều tương tự, tại sao không chỉ sử dụng một ngôn ngữ và sử dụng ngôn ngữ đó cho máy tính lập trình?

Bởi vì đối với một lập trình viên trong thế giới thực, việc làm một cái gì đó là không đủ. Nó cũng quan trọng như thế nào nó được thực hiện. Khi nó được thực hiện đúng, miền vấn đề được thể hiện một cách trung thực trong chương trình, tính mô đun của vấn đề được giữ lại và các chương trình trở nên dễ hiểu, sửa đổi và duy trì. Tất cả những điều này ảnh hưởng đến chi phí phát triển và bảo trì chương trình. Chúng cũng ảnh hưởng đến độ tin cậy và bảo mật của phần mềm.

Chẳng hạn, nhiều người sử dụng chương trình có tên " Quicken " cho các tài khoản tài chính. Chương trình ban đầu được phát triển trong một số phiên bản nội bộ của Visual Basic, và nó khá tốt. Tuy nhiên, thật khó để mở rộng và duy trì nó. Trong những năm qua, khi công ty cố gắng mở rộng nó cho các tính năng mới hơn, chương trình ngày càng trở nên có lỗi với hàng triệu khách hàng không hài lòng ở khắp mọi nơi. Họ có thể sẽ được hưởng lợi từ việc tái thiết kế phần mềm bằng ngôn ngữ lập trình hướng đối tượng được gõ mạnh.


Cụ thể, có lý do nào để tôi biết một ngôn ngữ chức năng như một lập trình viên máy tính không?

Trong lịch sử, "lập trình chức năng" được phát minh bởi Godel, Kleene và Church sau khi thực hành toán học tiêu chuẩn, và "lập trình mệnh lệnh" được phát minh bởi Turing để xác định khái niệm tính toán cơ học. Trước Turing, không có bằng chứng nào về toán học từng phân tích các ý tưởng lập trình bắt buộc. (Trong khi tất cả các thuật toán toán học truyền thống được thể hiện theo "phong cách bắt buộc", nội dung thiết yếu của chúng vẫn còn hoạt động.) Vì vậy, lập trình mệnh lệnh rất mới đối với nền văn minh của con người, và toán học của nó vẫn chưa được hiểu rõ lắm. Lý do số 1 tại sao mọi người nên biết một số lập trình chức năng là để hiểu làm thế nào lập trình có thể là toán học. (Tôi không thừa nhận rằng lập trình mệnh lệnh là phi toán học, đó là những gì lập trình viên chức năng sẽ có bạn tin tưởng. Nhưng tôi đồng ý rằng, với tình trạng nghệ thuật hiện tại, chúng ta chưa biết làm thế nào để lập trình mệnh lệnh một cách toán học. Nhiều người trong chúng ta đang nghiên cứu chính xác vấn đề đó.)


1

Bạn có thể xem nó như một sự tiến hóa.

Ban đầu, máy tính được lập trình hoàn toàn bằng mã nhị phân. Sau đó, việc ghi nhớ được giới thiệu và ngôn ngữ lắp ráp được giới thiệu, chủ yếu phụ thuộc nhiều vào CPU được sử dụng.

Sau khi các ngôn ngữ cấp cao hơn (cấp 3) được giới thiệu (Pascal, C, ADA, Cobol), một số ngôn ngữ rất chung chung (như C), một số ngôn ngữ phù hợp hơn để xử lý dữ liệu (Cobol), một số để tính toán (Fortran).

Sau đó, các ngôn ngữ cấp 4 phát sinh, như các ngôn ngữ logic (như Prolog). Các ngôn ngữ chung nhất là sự kế thừa của ngôn ngữ cấp ba; một số trong số họ là Java, C #.

Chúng tôi cũng thấy các ngôn ngữ dành riêng cho internet / web, như ASP.NET, PHP.

Và các ngôn ngữ cho một miền cụ thể (DSL), hầu hết hoạt động cùng với một ngôn ngữ chung.

Sau đó, có những ngôn ngữ cho trẻ học lập trình, như LOGO.

Ngoài ra các ngôn ngữ để viết mã nhanh, như Python, Ruby, v.v., các ngôn ngữ để xử lý XML (XSLT).

Và tôi có lẽ đã quên rất nhiều ngôn ngữ và thậm chí các loại ngôn ngữ.


1
Trình tự thời gian của bạn bị nhầm lẫn. Prolog là từ năm 1972, trẻ hơn Ada (1983). Tôi không biết ý của bạn là "người kế thừa ngôn ngữ cấp ba"; một số ngôn ngữ không phải là hậu duệ của Fortran, bao gồm cả C và Pascal (bắt đầu Ada).
prosfilaes 21/07/2015

1
@prosfilaes, cách nhầm lẫn. FORTRAN là ngôn ngữ đầu tiên vẫn được sử dụng, sau đó đến LISP, sau đó là COBOL. Algol được định nghĩa để xuất bản các thuật toán, không sử dụng máy (nhưng các trình biên dịch thuộc loại nào cũng được), với các cảnh báo Pascal và sau đó C. PL / 1 là sự pha trộn kỳ lạ của FORTRAN và COBOL với các cấu trúc điều khiển Algol-ish.
vonbrand

1

câu trả lời khác là tốt, sẽ thêm một vài góc độ mới. khi DC viết ngôn ngữ phát triển giống như ngôn ngữ thực của con người! và họ mượn các khái niệm và cú pháp từ nhau một lần nữa giống như ngôn ngữ thực sự của con người. nói cách khác, đó cũng là một nghiên cứu khá thực về từ nguyên của ngôn ngữ máy tính.

điều này cũng có nghĩa là có một lịch sử lâu dàidòng thời gian chủ yếu bắt đầu vào khoảng những năm 1930 với phép tính lambda .

có sự tương tác / hiệp lực / cộng sinh mạnh mẽ giữa lý thuyết và ứng dụng với các ngôn ngữ lập trình. các ứng dụng mới được phát minh dẫn đến các lý thuyết mới và ngược lại. một ngôn ngữ lập trình theo nhiều cách là cầu nối giữa lý thuyết và ứng dụng .

một nghiên cứu trường hợp thú vị từ lịch sử là Fortran. nó không được biết đến nhiều nhưng các phiên bản trước của Fortran (chủ yếu là trước Fortran77) có ngữ pháp mơ hồ . điều này có nghĩa là cùng một lệnh có thể là hợp pháp "giải thích" / biên soạn cách khác nhau bởi trình biên dịch vì có nhiều "giải thích" hợp lệ (điều này không phải là cảm giác kỹ thuật tương tự của ngôn ngữ "giải thích").

Vì vậy, lý thuyết về ngữ pháp chính thức đã được phát triển vào khoảng thời gian Fortran được phát minh, và đó là một cuộc khủng hoảng nhỏ khi vấn đề mơ hồ ngôn ngữ được phát hiện. Cú pháp Fortan đã được điều chỉnh lại để tránh sự mơ hồ này và các ngôn ngữ sau này nhạy cảm hơn với sự mơ hồ về ngữ pháp trong thiết kế của chúng. OOP cũng là một ví dụ rất quan trọng / quan trọng nhất về khái niệm lý thuyết / tiến bộ trong các ngôn ngữ lập trình "tác động" hoặc "gợn sóng" sang nhiều ngôn ngữ hiện có, biến đổi chúng.

nghiên cứu trường hợp khác là phát minh của công nghệ mới. ví dụ, việc phát minh ra cơ sở dữ liệu quan hệ đã có tác động rất lớn đến các ngôn ngữ máy tính, ví dụ như với SQL và các giao diện ngôn ngữ máy tính với nó (ví dụ như trong java, "JDBC"). tương tự như vậy trên toàn thế giới web với tác động thậm chí còn lớn hơn. dường như có một sự bùng nổ của các ngôn ngữ có thời gian xung quanh sự bùng nổ của dotcom , điều này hoàn toàn trùng khớp với sự phát triển ban đầu của WWW và có thể được so sánh với các vụ nổ tiến hóa .

dường như cũng có một xu hướng gia tăng lâu dài trong các ngôn ngữ lập trình mới kết hợp với sức mạnh xử lý tăng theo cấp số nhân của luật Moores mà một số người cho rằng có thể đang chậm lại.

xu hướng lâu dài hiện tại trong các ngôn ngữ lập trình dường như hướng tới Dữ liệu lớnSong song hóa, ví dụ như với MapReduce . đó cũng là một mối quan tâm hiện tại trong việc đóng cửa .

một khía cạnh quan trọng khác của ngôn ngữ là chúng thể hiện mức độ trừu tượng ngày càng tăng . họ xây dựng trên các bản tóm tắt cấp thấp hơn để tạo ra các bản tóm tắt cấp cao hơn (tương tự như một kim tự tháp). bằng cách này, tiến trình phát triển ngôn ngữ máy tính có lẽ là vô tận và chúng ta có thể tương đối chắc chắn những cái mới quan trọng sẽ tiếp tục được phát minh lâu dài trong tương lai. điều này có lẽ tương tự như một khái niệm tương tự trong tâm lý học gọi là chunking đã thông báo, xây dựng các khái niệm tinh thần cấp cao hơn từ các khối xây dựng cấp thấp hơn.

Bất cứ ai đã nghiên cứu nhiều ngôn ngữ máy tính đều phải thừa nhận rằng tâm lý bầy đàn có thể được quan sát theo đó một số khía cạnh của chúng hóa ra là mốt nhất thời, tức là không quá quan trọng như được ủng hộ, hoặc thậm chí là chết (sử dụng) theo thời gian! một số ý tưởng / thay đổi cốt lõi vẫn còn nhưng sự cường điệu (quá mức) mất dần. trong ý nghĩa này, ngôn ngữ lập trình cũng rơi vào và ra khỏi thời trang . Theo tôi, hai trường hợp trong nửa thập kỷ qua thực sự hữu ích nhưng đã vượt qua:

ngày càng có sự tương đồng về bản thân có thể được quan sát trên nhiều ngôn ngữ chính mà tất cả chúng đều có xu hướng hội tụ để thực hiện nhiều tính năng tương tự theo cách riêng của chúng, ví dụ như với các biểu đồ so sánh sản phẩm "kiểm tra" nhiều tính năng trong lưới.


xem thêm các mẫu thiết kế thường xuyên qua các ngôn ngữ và được triển khai bằng các ngôn ngữ. một khía cạnh quan trọng khác của nghiên cứu ngôn ngữ / chức năng là các tính năng được triển khai trong các thư viện
vzn

FORTRAN không bao giờ có một mô tả chính thức, ít hơn sự phức tạp của biểu thức có thể dẫn đến sự mơ hồ về ngữ pháp (vâng, tôi đã bắt đầu lập trình trong một từ gớm ghiếc gọi là PDQ FORTRAN, và sau đó là FORTRAN IV) ngôn ngữ mà sự mơ hồ (rất lúng túng) trong ngữ pháp được đưa ra ánh sáng có Algol, ngôn ngữ đầu tiên được định nghĩa bằng một ngữ pháp.
vonbrand

điểm lấy wrt gốc / FORTRAN đầu tiên nhưng các phiên bản sau được chính thức hóa hơn với các định nghĩa ngữ pháp chặt chẽ hơn. đó là một nghiên cứu trường hợp cho thấy sự tiến hóa của một ngôn ngữ cùng với lý thuyết ngôn ngữ.
vzn

FORTRAN đã bắt buộc phải ăn một ngữ pháp, nhưng không bao giờ được thiết kế xung quanh một ngữ pháp. Algol bắt đầu xu hướng đó, được tiếp tục bởi Pascal, gia đình Modula, Oberon, C và đó là con của họ, PL / 1, Ada và như vậy. Với công nghệ ngữ pháp miễn phí ngữ cảnh và sự hiểu biết về phân tích cú pháp, ngày nay việc xác định một ngữ pháp và dịch nó thành một trình phân tích cú pháp không có lỗi là gần như không có, không có ngôn ngữ mới hơn không có.
vonbrand

phụ lục, nghiên cứu trường hợp bằng các ngôn ngữ mới hơn / mới nổi: Google go , node.js , Apple swift
vzn

-3

Họ không, đó chỉ là một mánh lới quảng cáo tiếp thị-- nếu bạn làm cho ngôn ngữ giống như "C", thì điều đó sẽ làm giảm rào cản rõ ràng để gia nhập.

Một số không có ảnh hưởng C nào cả: SQL, Pascal, Delphi, FORTRAN, COBOL, Ada, PowerBuilder, HyperTalk, Lisp, Simula, FOCAL, BASIC, PL / I, Algol, Algol-68, SNOBOL, Modula, Visual BASIC, Tutor, logo, Forth, DIBOL, Helix, AppleScript, Python, Erlang, Ruby, Pick, English, RPG, PL / SQL, ASP, Prolog, SmallTalk, Perl, bash, Wand BASIC, REXX, DOS ngôn ngữ.

Những loại đó NHÌN như C, nhưng có rất ít điểm chung với nó: JavaScript, Java, C #, (có thể nói là) Objective-C.

Đó là tất cả các loại tiếp thị, Java, C ++ và JavaScript giống như C, nhưng khó có thể khác biệt hơn dưới vỏ bọc.


5
"Họ không" - những gì không phải là gì? Trong mọi trường hợp, tôi không thấy cách này trả lời câu hỏi. Nó chỉ đơn giản là một danh sách các ngôn ngữ, cùng với một tuyên bố hoàn toàn không có căn cứ rằng tiếp thị có liên quan.
David Richerby 10/03/2016

2
"Một số không có ảnh hưởng C nào cả: ... Algol, Algol-68, ..." - Thật buồn cười, bạn nên nói rằng, với điều đó là C phát sinh từ Algol. "Nếu bạn làm cho ngôn ngữ giống như" C ", thì điều đó làm giảm rào cản rõ ràng để vào" - iirc, điều này đã được chứng minh là sai. Sinh viên không được tiếp xúc với lập trình trước sẽ học nhanh hơn với các ngôn ngữ khác (tôi nghĩ rằng họ đã sử dụng Haskell trong nghiên cứu đó).
Raphael
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.