Có bao nhiêu loại ngôn ngữ lập trình? [đóng cửa]


30

Về cơ bản, tôi muốn học nhiều ngôn ngữ lập trình để trở thành một lập trình viên tuyệt vời. Tôi chỉ biết một số ít chuyên sâu và tôi đã hy vọng ai đó có thể giải thích về việc có bao nhiêu lớp hoặc loại ngôn ngữ lập trình . Giống như cách bạn sẽ gộp chúng lại với nhau nếu bạn phải học chúng theo nhóm.

Đến từ nền tảng Java, tôi quen thuộc với kiểu gõ tĩnh, nhưng tôi biết rằng ngoài cách gõ động còn có sự đa dạng trong các ngôn ngữ có sẵn mà tôi rất thích xem phân tích phân loại nếu có thể.


2
Sẽ tốt hơn nếu nói "Loại nào .." thay vì bao nhiêu?
Amir Rezaei

Vâng, tôi đã học được rằng một cái gì đó như Prolog và C về cơ bản là khác nhau, vì vậy tôi đã nghĩ rằng mỗi trong số chúng tương ứng với một loại ngôn ngữ lập trình khác nhau, và tôi đã hy vọng có thể nắm bắt được bao nhiêu loại.
sova

7
2: loại làm những gì bạn muốn và loại không
Matt Ellen

1
Học về các loại ngôn ngữ lập trình khác nhau hoàn toàn mang tính xây dựng ! Bạn có khả năng có thể lập luận rằng điều này nên được đóng lại như một bản sao của điều này nhưng tôi nghĩ chúng là những câu hỏi đủ khác biệt để tách biệt.
Peter Boughton

1
@Sova, tôi khuyên bạn nên lựa chọn ngôn ngữ mới đầu tiên để thử một thứ không sử dụng cú pháp dựa trên c. Điều đó sẽ khiến đầu bạn tập trung hơn vào cách nó hoạt động so với sự khác biệt so với cái bạn biết rõ nhất.
Erik Reppen

Câu trả lời:


73

Nó phụ thuộc vào cách bạn muốn phân loại ngôn ngữ. Về cơ bản, các ngôn ngữ có thể được chia thành hai loại: ngôn ngữ bắt buộc trong đó bạn hướng dẫn máy tính cách thực hiện một nhiệm vụ và ngôn ngữ khai báo mà bạn nói cho máy tính biết phải làm gì. Các ngôn ngữ khai báo có thể được chia nhỏ thành các ngôn ngữ chức năng , trong đó một chương trình được xây dựng bằng cách soạn thảo các hàm và logicngôn ngữ lập trình, trong đó một chương trình được xây dựng thông qua một tập hợp các kết nối logic. Các ngôn ngữ bắt buộc đọc giống như một danh sách các bước để giải quyết vấn đề, giống như một công thức. Các ngôn ngữ bắt buộc bao gồm C, C ++ và Java; ngôn ngữ chức năng bao gồm Haskell; ngôn ngữ lập trình logic bao gồm Prolog.

Các ngôn ngữ bắt buộc đôi khi được chia thành hai nhóm nhỏ: ngôn ngữ thủ tục như C và ngôn ngữ hướng đối tượng . Tuy nhiên, các ngôn ngữ hướng đối tượng là một chút trực giao với các nhóm, vì có các ngôn ngữ chức năng hướng đối tượng (OCaml và Scala là ví dụ).

Bạn cũng có thể nhóm ngôn ngữ bằng cách gõ: tĩnhđộng . Các ngôn ngữ được nhập tĩnh là những ngôn ngữ trong đó việc gõ được kiểm tra (và thường được thi hành) trước khi chạy chương trình (thường là trong giai đoạn biên dịch); ngôn ngữ gõ động kiểm tra loại trì hoãn kiểm tra thời gian chạy. C, C ++ và Java là các ngôn ngữ được nhập tĩnh; Python, Ruby, JavaScript và Objective-C là các ngôn ngữ được gõ động. Ngoài ra còn có untyped ngôn ngữ, trong đó bao gồm các ngôn ngữ lập trình Forth.

Bạn cũng có thể nhóm các ngôn ngữ theo nguyên tắc gõ của chúng : gõ yếu , hỗ trợ chuyển đổi kiểu ẩn và gõ mạnh , cấm chuyển đổi kiểu ẩn. Các dòng giữa hai thứ này hơi mờ: theo một số định nghĩa, C là một ngôn ngữ được gõ yếu, trong khi các ngôn ngữ khác cho rằng nó được gõ mạnh. Gõ kỷ luật không thực sự là một cách hữu ích để nhóm ngôn ngữ.


1
Sẽ đặt ra một cái gì đó tương tự, nhưng sẽ +1 và thêm nhận xét thay thế. Mỗi thể loại hoặc kết hợp cũng có nhiều spin-off được tạo bằng cách tập trung vào các yếu tố cụ thể. OOP, ví dụ, các tập hợp: OOP dựa trên nguyên mẫu, Lập trình hướng theo khía cạnh, Lập trình dựa trên thành phần, v.v. Các mô hình chức năng cũng có các spin-off, chẳng hạn như các ngôn ngữ trong đó một quy trình hoặc luồng không đồng bộ là đơn vị cơ sở và bạn lập trình bằng cách kết hợp các quy trình song song với nhau.
CodexArcanum

Làm thế nào các ngôn ngữ kịch bản, ví dụ VBScript, phù hợp với điều này? Nó có thể là một chút thủ tục và một chút OO vì người ta có thể tạo ra nhiều loại khác nhau, vì vậy điều đó có làm cho nó trở thành một hybrid?
JB King

Điều này thật đúng với gì mà tôi đã tìm kiếm. Cảm ơn nhiều.
sova

3
Các ngôn ngữ @JB King OOP thường mang tính thủ tục, ít nhất là trong các cơ quan phương thức. Ngoài ra, đó là một quan niệm sai lầm phổ biến rằng OOP có nghĩa là "đối tượng". Rất nhiều ngôn ngữ có kiểu dữ liệu và đối tượng. Có rất nhiều tranh luận về định nghĩa chính xác của OOP là gì, nhưng nó thường bao gồm sự kế thừa và / hoặc đóng gói (trạng thái riêng tư) làm chủ đề chính. Một ngôn ngữ không có một trong hai hình thức sẽ khó phân loại thành ngôn ngữ OOP.
CodexArcanum

2
@sova Tôi chỉ có thể nghĩ về hai ngôn ngữ hoạt động như thế. Erlang dựa nhiều vào xử lý song song, nhưng nếu bạn muốn giống như những gì tôi đã nói chính xác, bạn nên xem xét về Polyphonic C #. Đó là ngôn ngữ nghiên cứu (hiện được xếp lại thành C-omega) dựa trên Pi-Tính (giống như cách FP dựa trên lambda calc) Pi-calc dựa trên đơn vị của một quy trình và bạn khai báo các quy trình và kết hợp đồng bộ và asych gọi vào họ. Cũng nhìn vào Mũi tên trong FP, đặc biệt là Haskell. Mũi tên rất giống như vậy.
CodexArcanum

12
  • hội,, tổ hợp
  • Thủ tục
    • Căn bản
    • C
  • Hướng đối tượng
    • C #
    • Java
  • Tuyên bố
    • Prolog
    • SQL
  • Chức năng
    • Lisp
    • Haskell

Đây là những cái chính, nhưng có rất nhiều mô thức khác ngoài đó, và có rất nhiều sự chồng chéo giữa chúng.


Làm thế nào về khai báo (ví dụ Prolog, SQL)?
Bruce Alderman

@Bruce, có em ngay bây giờ.

Vâng, đây là ý tưởng chung mà tôi đã học được ở đâu đó trên đường đi.
Sevenseacat

6
Không nên lắp ráp được coi là thủ tục?
MattDavey

2
Làm thế nào về các ngôn ngữ lập trình concatenative (dựa trên ngăn xếp), chẳng hạn như Forth và Factor? Bạn có thể coi nó là một loại lập trình Chức năng, nhưng nó có lẽ đủ khác biệt để xứng đáng được đề cập. vi.wikipedia.org/wiki/Concatenative_programming_lingu
KChaloux

11

Đối với các loại ngôn ngữ lập trình (Paradigms), xem tại đây:
http://en.wikipedia.org/wiki/Programming_paradigm

Để biết các đặc điểm khác của ngôn ngữ lập trình (ví dụ: Hệ thống Loại), hãy xem tại đây: http://en.wikipedia.org/wiki/Programming_lingu


à "mô hình" thật là một từ tốt! cảm ơn bạn
sova

@sova Tôi sẽ chấp nhận đây là câu trả lời hay nhất, vì đơn giản là có quá nhiều mô hình để liệt kê trong câu trả lời P.SE, ít hơn nhiều để mô tả các sắc thái của mỗi câu.
Rei Miyasaka

9

Nhấp vào hình ảnh để xem PDF. Lập trình poster mô hình

Bạn nên xem các mô hình lập trình cho người giả: Điều mà mọi lập trình viên nên biết của Peter Van Roy. Điều này sẽ cung cấp cho bạn một cái nhìn tổng quan về cách nó đang diễn ra bên ngoài.

Nếu bạn muốn đi xa hơn, bạn có thể đọc Khái niệm, Kỹ thuật và Mô hình lập trình máy tính . Bằng cách này, bạn sẽ không học được nhiều ngôn ngữ, nhưng bạn sẽ học được những mô hình ẩn sau các loại ngôn ngữ khác nhau. Vì vậy, học một ngôn ngữ mới sẽ dễ dàng hơn cho bạn.


6
  • Thủ tục: Hội, Java, C #, F #, Lisp, Fortran.

  • Đặt dựa trên: SQL.

  • Mô hình dựa trên: Perl, Regex, Snobol.

  • Cây dựa: XSLT.

  • Mảng dựa: APL.


2
+1 để sử dụng một loại phân loại khác và cũng để nhận ra rằng 'thủ tục' trên thực tế chứa hầu hết các phân loại của người khác. (tất nhiên điều đó chỉ có nghĩa là từ này có rất ít ý nghĩa và thịt nằm trong các phân khu như vậy)
Javier

4

Có nhiều cách khác nhau để trả lời điều này, nhưng về mặt chúng có thể được phân loại thành:

Ngôn ngữ máy: Ngôn ngữ máy là ngôn ngữ lập trình cấp thấp. Nó dễ hiểu bởi máy tính nhưng khó đọc bởi mọi người. Đây là lý do tại sao mọi người sử dụng ngôn ngữ lập trình cấp cao hơn. Các chương trình được viết bằng ngôn ngữ cấp cao cũng được biên dịch và / hoặc diễn giải thành ngôn ngữ máy để máy tính có thể thực thi chúng.

Ngôn ngữ hội: Ngôn ngữ hội là một đại diện của ngôn ngữ máy. Nói cách khác, mỗi hướng dẫn ngôn ngữ lắp ráp sẽ dịch sang một hướng dẫn ngôn ngữ máy. Mặc dù các câu lệnh hợp ngữ có thể đọc được, các câu lệnh vẫn ở mức độ thấp. Một nhược điểm của ngôn ngữ lắp ráp là nó không khả chuyển, vì mỗi nền tảng đi kèm với một Ngôn ngữ hội cụ thể.

Ngôn ngữ cấp cao: Ngôn ngữ cấp cao là thứ mà hầu hết các lập trình viên sử dụng hiện nay. Các ngôn ngữ như C, C ++ và Java đều là các ngôn ngữ cấp cao. Ưu điểm của ngôn ngữ cấp cao là chúng rất dễ đọc và di động. Một nhược điểm của ngôn ngữ cấp cao là chúng kém mạnh hơn ngôn ngữ hội. Bởi vì một câu lệnh trong một ngôn ngữ cấp cao được dịch thành nhiều câu lệnh ngôn ngữ máy.

Các ngôn ngữ cấp cao có thể được phân loại thành:

  1. Ngôn ngữ chức năng: Trong ngôn ngữ chức năng, một chương trình được chia thành các định nghĩa chức năng. Ngôn ngữ chức năng là một loại ngôn ngữ khai báo. Chúng chủ yếu dựa trên tính toán lambda đánh máy với hằng số. Một số ngôn ngữ Chức năng nổi tiếng là Scala, F #, Clojure và Lisp.

  2. Ngôn ngữ thủ tục: Trong Ngôn ngữ thủ tục, một chương trình được viết theo một chuỗi các bước cần được tuân theo để tạo ra kết quả. COBOL, FORTRAN và C là một số ngôn ngữ thủ tục.

  3. Ngôn ngữ lập trình hướng đối tượng: Trong các ngôn ngữ OOP, một chương trình được chia thành Đối tượng chứa dữ liệu cũng như các phương thức hoạt động trên dữ liệu. Java, C # và C ++ là các ngôn ngữ OOP.

  4. Ngôn ngữ lập trình logic: Ngôn ngữ logic được sử dụng để tạo các chương trình cho phép máy tính suy luận logic. ví dụ: ngôn ngữ logic

Đối với nghiên cứu chuyên sâu, kiểm tra:


3

Tôi có xu hướng suy nghĩ về các tính năng:

Cú pháp:

C-Dựa hoặc những gì có bạn. Java có cú pháp dựa trên C. Tôi đặc biệt khuyên bạn nên thử một cái gì đó như Python hoặc Ruby để thoát khỏi cú pháp và suy nghĩ nhiều hơn về các nguyên tắc cơ bản về cách một ngôn ngữ nhất định hoạt động. Tôi cho rằng không có cú pháp nào cần phải cồng kềnh hơn dựa trên C và không có vấn đề gì khi xây dựng các khối xung quanh khoảng trắng.

Biên dịch so với giải thích w. Quá trình xây dựng so với phiên dịch / Bảng điều khiển:

Tôi có rất ít sự quen thuộc với thời gian biên dịch so với các mối quan tâm về môi trường thời gian chạy nhưng tôi nhận thấy rằng có rất nhiều mối quan tâm mà tôi hiếm khi nghĩ đến.

Tương tự như vậy, có rất nhiều ngôn ngữ được giải thích vẫn có một quá trình biên dịch để chạy bên trong một máy ảo như Java. Bạn vẫn phải xây dựng lại để thấy những thay đổi đối với mọi thứ.

Và sau đó có JavaScript và Python mà bạn có thể thực thi nhanh chóng, ra lệnh bằng lệnh trong bảng điều khiển trong môi trường trực tiếp. Tất cả ba có thể dẫn đến cách viết mã rất khác nhau.

Gõ động so với nghiêm ngặt:

Tôi có xu hướng xem hai là sự đánh đổi thiết kế. Khi bạn ở cấp độ thấp hơn nhiều và hiệu suất là rất quan trọng, gõ tĩnh có rất nhiều ý nghĩa. Tôi chưa bao giờ hiểu khái niệm này là "an toàn" hơn so với người khác bằng cách nào đó nhưng tôi đã nghĩ ra một ngôn ngữ rất dẻo / năng động, nơi bạn chỉ cần học cách hệ thống gõ hoạt động và những gì mong đợi, về cơ bản. Loại shenanigans hiếm khi là mối quan tâm của tôi trong JS. Trong một số cách, tính linh hoạt có thể làm cho mọi thứ trở nên mạnh mẽ hơn, mặc dù phải thừa nhận rằng một cú chạm mạnh mẽ hơn cho một nhà phát triển cấp độ cao hơn nếu bạn không biết về một số lỗ hổng trong ngôn ngữ.

Phạm vi cấp độ khối so với phạm vi chức năng so với ?:

Block-Level là phổ biến nhất (mọi thứ giữa {} trong hầu hết các ngôn ngữ cú pháp dựa trên c). Phạm vi JavaScript được xây dựng xung quanh các hàm (cũng được sử dụng để xây dựng các đối tượng sao cho các đối tượng cũng hiệu quả). Ngoài ra còn có một sự thay đổi lớn trong loại quyền truy cập mà bạn có từ phạm vi bên trong đến phạm vi bên ngoài. Tôi không quen thuộc với các kế hoạch phạm vi khác nhưng tôi chắc chắn chúng tồn tại.

OOP cổ điển so với Prototypal OOP vs Recent-OOP (cấu trúc trong C?) So với Non-OOP:

Ngay cả trong OOP dựa trên lớp cũng có rất nhiều chỗ để thay đổi. Cho dù bạn có thể thực hiện nhiều kế thừa (ew, vượt quá, ew), xác định giao diện, v.v ...

Trong JavaScript, chúng ta có một loại OOP nguyên mẫu hỗn hợp, trong đó các đối tượng đơn giản hơn nhiều, có khả năng biến đổi cao, nhưng chúng ta vẫn có khả năng tách giao diện khỏi các mối quan tâm nội bộ, mà IMO, là khía cạnh quan trọng của việc đóng gói.

Vấn đề của OOP là thực sự có rất nhiều thứ bạn có thể rút ra mà về cơ bản là định hướng OOP mà không phải là kỹ thuật OOP. Tất nhiên có những người theo chủ nghĩa thuần túy nhưng vào cuối ngày, Mẫu thiết kế là về việc đạt được một số trừu tượng nhất định hoạt động tốt trong các tình huống nhất định. Đừng quá nhanh để cho rằng các ý tưởng từ một ngôn ngữ dựa trên OOP không được sử dụng trong một cái gì đó theo định hướng thủ tục hơn. Và tôi không nói về JavaScript. Nó hoàn toàn không bị giới hạn bởi phiên bản ngớ ngẩn của mô hình OOP dựa trên nguyên mẫu.

Chức năng hạng nhất:

Không có những thứ này trong một ngôn ngữ là một điều khó khăn để tôi từ bỏ. Bạn có thể truyền các hàm xung quanh giống như chúng là dữ liệu để sử dụng trong các bối cảnh khác. Điều này làm cho các kế hoạch xử lý sự kiện đặc biệt rất dễ thực hiện nhưng nó cũng giúp dễ dàng điều chỉnh ngôn ngữ để hoạt động theo cách bạn muốn. Đó là, hơn bất cứ điều gì tôi nghi ngờ, điều đã tạo nên thành công cho JavaScript, mặc dù nó đã được thiết kế trong hai tuần và nhận được cú pháp gần đúng của Java như là một kế hoạch tiếp thị.

Đóng cửa:

Tôi không chắc cuộc tranh luận diễn ra ở đâu cho Java, nhưng tôi biết rất nhiều nhà phát triển Java đã kêu gọi cho tính năng này một hoặc hai năm trước. Trong ngôn ngữ không đóng, khi một hàm đóng, bất cứ thứ gì có thể tham chiếu nội dung nào đó từ bên trong hàm đó sẽ không thể truy cập được vì đó là rác được thu thập. Trong một bao đóng, bối cảnh thực thi bị ràng buộc sao cho nếu bạn có thể tham chiếu các thứ bên trong hàm đóng đó từ một phạm vi khác như trong một đối tượng hoặc hàm được trả về, về cơ bản bạn sẽ nhận được các vars đó khi chúng đóng. Nó giống như làm kẹt chân bạn trong cánh cửa của bộ sưu tập rác, mặc dù tôi nghi ngờ nó được triển khai giống như các bản sao của những chiếc bình được làm thành lọ địa phương của thực thể tham chiếu.

Cứng nhắc / nghiêm ngặt / an toàn so với việc mang đến cho bạn tất cả những sợi dây bạn muốn:

Các nhà phát triển JS và nhà phát triển Java có xu hướng hoàn toàn không hiểu nhau và tôi nghĩ nó có liên quan nhiều đến hai ngôn ngữ nằm ở hai phía gần đối diện của phổ thiết kế đặc biệt này. Tôi không muốn bạn bảo vệ tôi khỏi bản thân hoặc khỏi các nhà phát triển khác trong đội của tôi. Tôi muốn làm nhiều hơn nữa với rất ít mã và thực hiện tất cả theo những cách rất khác nhau (nhưng phù hợp với một tên miền nhất định) tùy thuộc vào tình huống. Hoàn toàn có sự đánh đổi cho cả hai và rất nhiều ngôn ngữ có xu hướng giảm nhiều hơn ở giữa.


Đồng ý, cảm ơn. Thật tuyệt khi trải qua nỗ lực bỏ phiếu mà không có lời giải thích.
Erik Reppen

2

Tôi nghĩ rằng một cách rút gọn cho tất cả những điều này là học đủ Lisp để làm một số việc bán hữu ích. Hầu hết các mô hình này bắt đầu như là cách sử dụng Lisp, vì vậy đó là cách đơn giản để thử mọi thứ.

Có một số "loại" ngôn ngữ xung quanh, nhưng những ngôn ngữ mới luôn có thể xuất hiện. Về cơ bản, mục đích của một ngôn ngữ là cho phép mã hóa các ý tưởng, khái niệm hoặc yêu cầu, càng trực tiếp càng tốt. Cuối cùng, có thể có những tình huống mà các mô hình hiện tại đang muốn, và một tình huống mới có thể cần thiết.

Một cách để xem xét là về cấu trúc bề mặt. Làm thế nào trực tiếp cho phép bạn mã hóa các ý tưởng một cách chính xác, để nếu bạn thay đổi suy nghĩ về những gì bạn muốn, việc thay đổi mã tương ứng cũng dễ dàng, ít có cơ hội để giới thiệu các lỗi.

Một cách khác để xem xét nó là về mặt cấu trúc điều khiển. Khi ngôn ngữ được thực thi (nếu có), thứ tự xảy ra là gì, để thực hiện những gì bạn muốn? Ví dụ là: thực hiện đơn giản, đệ quy, quay lui, xử lý song song. Một tôi (ho khiêm tốn) phát hiện ra là thực hiện khác biệt .

Một quan điểm hữu ích khác là bất cứ khi nào một cấu trúc dữ liệu được thiết kế, một ngôn ngữ được sinh ra. Dữ liệu được "thực thi" bởi các chương trình ứng dụng kết hợp với nó và thực hiện mọi việc, giống như một chương trình chỉ là một bó dữ liệu (như mã byte) được trình thông dịch sử dụng để thực hiện.


Mát mẻ. Tôi sẽ học LISP và được giác ngộ. Sôi động: D
sova

Tuy nhiên, nếu bạn nói rằng hành động sử dụng cấu trúc dữ liệu tạo ra một ngôn ngữ trung gian mới thì bạn cũng có thể lập luận một ngôn ngữ mới được sinh ra trong mọi thuật toán (tất cả các hoạt động nhất thiết phải được thực hiện trên cấu trúc dữ liệu) và với việc giảm, một ngôn ngữ mới được sinh ra trong mỗi dòng mã. Tôi nghĩ bạn có ý gì khác mặc dù tôi không chắc là tôi hiểu chưa?
sova

@sova: Đối với tôi, lý thuyết thông tin là một sự mặc khải tuyệt vời (cả Shannon và Kolmogorov). Đó là về cách các ý nghĩa được mã hóa và truyền qua các kênh, với các khái niệm về băng thông, phát hiện lỗi, mã hóa tối thiểu, tính ngẫu nhiên, v.v. Vì vậy, dữ liệu mã hóa thông tin và thuật toán là các kênh. Các chương trình mã hóa thông tin, và lập trình là một kênh. Vậy, thông tin nào được mã hóa? nó đến từ đâu và khi nào? nó sẽ đi đâu các nguồn lỗi (tiếng ồn) là gì? Làm thế nào để họ sửa chữa? Tôi thấy rằng một quan điểm hữu ích.
Mike Dunlavey

@sova: (còn tiếp) Bạn không cần phải thành thạo tất cả các môn toán. Đối với tôi, điều quan trọng là khuôn khổ mà nó mang lại cho tôi khi nghĩ về mọi thứ.
Mike Dunlavey

1

Tôi phải thêm rằng có các ngôn ngữ lập trình cho các ứng dụng cụ thể. Một ý tưởng xuất hiện là APT (Công cụ lập trình tự động) một ngôn ngữ được sử dụng trong sản xuất cho các công cụ máy móc.


Tôi nhớ cái đó Tôi thậm chí có thể sử dụng nó. Chàng trai, đó là công nghệ hiện đại. Bạn không cần phải tự hướng dẫn máy phay, chỉ cần nhấn nút khởi động. Và nếu có một lỗi, tất cả địa ngục sẽ vỡ ra.
Mike Dunlavey

Tôi đã làm việc trên các chương trình tạo gcode cho máy phay. Tôi thực sự đã nắm giữ và thấy kết quả của các lỗi lập trình, thường là của tôi.
David Thornley

Tôi đã dành 20 năm để cài đặt các bộ xử lý hậu kỳ trên các hệ thống.
Dave
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.