Tại sao một số ngôn ngữ lập trình phổ biến bị ảnh hưởng bởi C? [đóng cửa]


23

10 ngôn ngữ lập trình hàng đầu, theo chỉ số TIOBE dường như bị ảnh hưởng nặng nề bởi C:

1. Java

Ngôn ngữ xuất phát phần lớn cú pháp của nó từ C và C ++ nhưng có mô hình đối tượng đơn giản hơn và ít phương tiện cấp thấp hơn. - wikipedia.org

2. C

C là một trong những ngôn ngữ lập trình được sử dụng rộng rãi nhất mọi thời đại và có rất ít kiến ​​trúc máy tính mà trình biên dịch C không tồn tại. - wikipedia.org

3. C #

Trong quá trình phát triển .NET Framework, các thư viện lớp ban đầu được viết bằng hệ thống trình biên dịch mã được quản lý có tên Simple Managed C (SMC). Vào tháng 1 năm 1999, Anders Hejlsberg đã thành lập một nhóm để xây dựng một ngôn ngữ mới vào thời điểm đó có tên là Cool, viết tắt của "Ngôn ngữ hướng đối tượng giống như C". - wikipedia.org

4. C ++

Nó được phát triển bởi Bjarne Stroustrup bắt đầu từ năm 1979 tại Bell Labs như một sự cải tiến cho ngôn ngữ C. - wikipedia.org

5. Mục tiêu-C

Objective-C là ngôn ngữ lập trình hướng đối tượng, phản chiếu, thêm thông điệp kiểu Smalltalk vào ngôn ngữ lập trình C. - wikipedia.org

6. PHP

Ông viết lại các tập lệnh này dưới dạng nhị phân Ngôn ngữ lập trình chung (CGI) của ngôn ngữ lập trình C, mở rộng chúng để thêm khả năng làm việc với các biểu mẫu Web và để giao tiếp với cơ sở dữ liệu và gọi triển khai này là "Trình thông dịch trang chủ / biểu mẫu cá nhân" hoặc PHP / FI. - wikipedia.org

8. Con trăn

Python được hình thành vào cuối những năm 1980 và việc triển khai nó được bắt đầu vào tháng 12 năm 1989 bởi Guido van Rossum tại CWI ở Hà Lan với tư cách là người kế thừa ngôn ngữ lập trình ABC (lấy cảm hứng từ SETL) có khả năng xử lý ngoại lệ và giao tiếp với hệ điều hành Amoeba. - wikipedia.org

ABC (ngôn ngữ lập trình) Các nhà thiết kế của nó tuyên bố rằng các chương trình ABC thường có kích thước bằng một phần tư kích thước của các chương trình Pascal hoặc C tương đương và dễ đọc hơn. - wikipedia.org

9. Perl

Perl mượn các tính năng từ các ngôn ngữ lập trình khác bao gồm C, shell script (sh), AWK và sed. - wikipedia.org

10. JavaScript

JavaScript sử dụng cú pháp bị ảnh hưởng bởi C. - wikipedia.org

Dường như hầu hết trong số họ mượn cú pháp của họ từ C và / hoặc bị ảnh hưởng nặng nề theo một số cách khác, ít nhất là trong sự khởi đầu của họ. Tại sao?


15
Có cú pháp như c không giống như dựa trên c.
Oded

15
Ngoài ra, TIOBE là một chỉ số rác.
DeadMG

3
Thay vào đó, tôi có thể hỏi tại sao ngôn ngữ lập trình dựa trên C phổ biến hơn không?
Manoj R

3
@YannisRizos Cứu cánh tuyệt vời của câu hỏi! Nó thực sự là một câu hỏi tuyệt vời bây giờ.
maple_shaft

16
Bởi vì C là hậu duệ của ALGOL, và ALGOL là để bảo vệ các phòng thí nghiệm mệnh lệnh có quy mô khối, những gì Áp-ra-ham dành cho các Kitô hữu, Do Thái và Hồi giáo.
Ingo

Câu trả lời:


40

Với sự phát triển của UNIX vào những năm 1970, ngôn ngữ lập trình hệ thống tiêu chuẩn C của nó nhanh chóng trở thành ngôn ngữ chung của thế giới lập trình. Trong một thời gian dài, C thực tế là bắt buộc đối với mọi lập trình viên. Như vậy, việc C đã ảnh hưởng đến hầu hết mọi ngôn ngữ lập trình xuất hiện sau nó bằng cách này hay cách khác hầu như không đáng ngạc nhiên, vì hai lý do:

  • Khi thiết kế một ngôn ngữ mới, sẽ hợp lý khi dựa vào cú pháp của nó, nếu có thể, trên một ngôn ngữ hiện có phổ biến có thể được thừa nhận là kiến ​​thức phổ biến.
  • Một ngôn ngữ mới có nhiều khả năng thành công hơn nếu đường cong học tập nông cạn và một cú pháp giống với ngôn ngữ đã biết thường dễ học hơn (trừ khi nó hoạt động hoàn toàn khác nhau mặc dù có sự tương đồng rõ ràng). Vì vậy, các ngôn ngữ mượn cú pháp từ C thường đạt được lực kéo nhanh hơn các ngôn ngữ không sử dụng.

Nhưng các ngôn ngữ khác tồn tại, và chúng vẫn còn, một số trong số chúng thậm chí còn có trước C - có họ LISP (CL, Clojure và Scheme là phương ngữ hiện đại phổ biến nhất), gia đình ML (với một số phương ngữ hiện đại), có cả một đội quân Các phương ngữ BASIC (VB.NET và VBA là các triển khai hiện đại), có Pascal và họ hàng của nó (Delphi là ngôn ngữ nổi tiếng nhất) và nhiều ngôn ngữ 'lẻ bóng' có ảnh hưởng từ nhiều ngôn ngữ khác và tự phát minh ra một vài điều; ví dụ bao gồm Go, Python, Lua, Haskell (và tiền thân của nó, Miranda), Prolog và Erlang. Mặc dù không có ngôn ngữ nào trong số này (ngoại trừ Python) nằm trong top 10 của bạn, nhiều ngôn ngữ trong số đó có cơ sở người dùng ổn định và cộng đồng tích cực; Họ chắc chắn sẽ không biến mất.

Ngoài ra, cần lưu ý rằng mức độ ảnh hưởng của C trong các ngôn ngữ này khác nhau rất nhiều, từ các ngôn ngữ tương thích gần như 100% C C ++ và Objective-C, cho đến Python (cố tình từ bỏ nhiều tính năng cú pháp của C). Và đó chỉ là cú pháp: về mặt ngữ nghĩa, hầu hết các ngôn ngữ trong danh sách đó không có nhiều điểm chung với C. Phần lớn áp đảo có quản lý bộ nhớ được tích hợp vào ngôn ngữ, và do đó, sao chép ngữ nghĩa, truyền đối số, v.v. , rất khác nhau. JavaScript, ví dụ, có ảnh hưởng ngữ nghĩa mạnh mẽ từ Scheme, trong khi cú pháp của nó được thiết kế để giống với Java (từ đó, dựa trên cú pháp bit và mảnh của nó trên C, nhưng không phải là ngữ nghĩa của nó). Các khác biệt khác (ngoại trừ C ++ và Objective-C, hầu hết tương thích ngược với C) bao gồm xử lý lỗi, quy tắc phạm vi,#include) và thực tế là nhiều ngôn ngữ trong số này là 'ảo hóa', nghĩa là chúng chạy trên trình thông dịch, trình biên dịch JIT hoặc máy ảo.

Nhân tiện, Python có ảnh hưởng C, nhưng chắc chắn nó không "dựa trên" C. Cả cú pháp và ngữ nghĩa khác nhau hoàn toàn so với C, và điều này là do thiết kế. Python chỉ mượn các tính năng từ C trong đó các lựa chọn thay thế khác cũng "tốt" (theo "Zen of Python" - nhập import thisvào trình thông dịch python).

Đối với tương lai của lập trình; dự đoán khác nhau. Ảnh hưởng của C sẽ không còn nữa, nhưng những phát triển gần đây về phần cứng (máy đa lõi trở nên phổ biến, GPU mạnh mẽ, CPU không còn là nút cổ chai hiệu năng điển hình, kết nối mạng đáng tin cậy nhanh, v.v.) đòi hỏi các cách tiếp cận hoàn toàn khác nhau để lập trình nói chung. Bất cứ ai đã từng viết một ứng dụng phân tán đa luồng bằng ngôn ngữ mệnh lệnh đều có thể nói rằng nó cực kỳ khó, trong khi các ngôn ngữ như Haskell có các tính năng loại bỏ hầu hết các vấn đề điển hình và đưa ra cách tiếp cận trừu tượng và có cấu trúc hơn để xử lý song song, phân tán và xử lý song song (độ tinh khiết là một khái niệm quan trọng trong bối cảnh này). Các ngôn ngữ lập trình mới hơn (ví dụ C # hoặc D) đã bao gồm nhiều tính năng để hỗ trợ thành ngữ như vậy. Trong bất kỳ trường hợp nào,


Câu trả lời hay, nhưng "CPU không còn là nút cổ chai hiệu năng điển hình"? Theo kinh nghiệm của tôi, vấn đề hiệu năng rất nhiều - CPU, IO, bạn đặt tên cho nó. Nếu không, profiler sẽ không cần thiết, mặc dù chúng không hiệu quả lắm.
Mike Dunlavey

6
@MikeDunlavey: Thông thường, các tắc nghẽn mà tôi gặp phải là do I / O, mạng, hiệu suất bộ đệm CPU, thông lượng bus và giao tiếp (không hiệu quả). Trước đây, CPU gần như không thể tránh khỏi nút cổ chai; Điều này không còn đúng nữa.
tdammers

1

Điều này rất giống như hỏi tại sao tiếng Anh là ngôn ngữ chính ở Mỹ. Tại sao không phải tiếng Tây Ban Nha hay tiếng Pháp? Họ kiểm soát nhiều lãnh thổ Hoa Kỳ hơn các thuộc địa của Anh. Tại sao không phải là Hà Lan? Thủ đô đầu tiên của Hoa Kỳ là ở một thuộc địa cũ của Hà Lan. Tôi không chắc có thể có "câu trả lời" cho vấn đề này.

Tuy nhiên, dòng thời gian "Lịch sử ngôn ngữ máy tính" ( http://www.levenez.com/lang/ ) cung cấp tất cả câu trả lời có thể có.


6
Bởi vì Vương quốc Anh từ 1600-1880 đại khái là cường quốc công nghiệp và tài chính hàng đầu của thế giới, tiếp theo là Hoa Kỳ từ năm 1880-Hiện tại (<- gây tranh cãi). Nó trở thành ngôn ngữ của kinh doanh quốc tế và được nói trôi chảy bởi hơn 2 tỷ người trên toàn thế giới. Điều đó và không ai muốn nói tiếng Tây Ban Nha hoặc tiếng Hà Lan :)
maple_shaft

6
@maple_shaft - "không ai muốn nói tiếng Tây Ban Nha"?! ... Bạn có biết nó được nói ở bao nhiêu nước không? vi.wikipedia.org/wiki/Sp Biến_lingu
Rook

12
@ S.Lott: Ý bạn là phần mà Đế quốc Anh là đế chế lớn nhất từng tồn tại và chiếm 25% toàn bộ bề mặt thế giới? Đó là loại "không mạnh mẽ"?
DeadMG

3
@DeadMG: Tôi không nói về thế giới. Tôi đang nói về Hoa Kỳ vào những năm 1700, nơi người Pháp đã bao vây người Anh vào một khu vực nhỏ dọc theo bờ biển. Tôi chỉ nói về việc người Anh mất các cuộc giao chiến quân sự trong nhà hát này. Người Pháp rõ ràng kiểm soát hầu hết những gì đã trở thành ông Mỹ. Chưa. Mỹ lên tiếng nói tiếng Anh. Không phải tiếng Pháp. Phân tích tương tự áp dụng cho C. Đó là một lịch sử phức tạp với nhiều yếu tố ảnh hưởng. Không có câu trả lời tầm thường.
S.Lott

4
@ S.Lott Người Pháp không thắng trong mọi cuộc chạm trán. Chỉ cần nhìn vào Bắc Mỹ họ đã giành được đa số; nhưng thua 4 trong 5 trận đánh lớn ở NA trong thời gian 1559/60 dẫn đến thất bại nặng nề trong nhà hát. Các vụ bắt giữ Pháo đài Ticonderoga và Niagara, Đồng bằng của Áp-ra-ham và trận Restigouche đều là những chiến thắng của Anh. Bằng cách cắt đứt nguồn cung / tăng cường, sau đó đã làm cho chiến thắng của Pháp tại Sainte-Foy không liên quan.
Dan Neely

0

Nếu bạn tạo một ngôn ngữ lập trình mới, việc có một cú pháp tương tự với các ngôn ngữ hiện có phổ biến sẽ giúp việc học của người dùng mới của bạn dễ dàng hơn. Đặc biệt là nếu nhiều khái niệm tương tự giữa các ngôn ngữ.

Ngoài ra tôi nghĩ rằng cú pháp kiểu C tương đối dễ đọc. Để so sánh với Pascal, sử dụng các ký hiệu "{" và "}" cho các khối mã dễ đọc hơn "bắt đầu" và "kết thúc", rất giống với mã định danh. Python thậm chí còn dễ đọc hơn, nhưng bao gồm cả khoảng trắng trong cú pháp sẽ mở ra một loạt vấn đề mới với việc chỉnh sửa. Một ví dụ khác: Lisp và JavaScript chia sẻ một vài ý tưởng, nhưng khi điều tương tự được viết theo cú pháp kiểu C, nó ít tối nghĩa hơn.

Tôi chắc chắn nhiều người sẽ không đồng ý với đoạn thứ hai, bởi vì mọi người đều có ngôn ngữ yêu thích của riêng họ, nhưng tôi nghĩ rằng sự phổ biến của cú pháp kiểu C là một phần trùng hợp lịch sử, nhưng một phần cũng cho thấy các tác giả của C đã làm tốt quyết định.


-1

Các ngôn ngữ lập trình phát triển theo thời gian giống như các ngôn ngữ tự nhiên, với một số ngôn ngữ cũ ảnh hưởng đến sự tiến hóa đó theo cách mạnh mẽ hơn các ngôn ngữ khác, trong khi các ngôn ngữ khác mờ dần và tầm ảnh hưởng của chúng khó theo dõi hơn ở cấp độ bề mặt, đó là cú pháp.

Ảnh hưởng của C đến từ nhiều nguồn - đó là mức độ thấp, phổ biến, có sự ủng hộ trong cả vòng tròn Unix và Microsoft. Đây cũng là vấn đề sống còn của vấn đề mạnh nhất - dễ dàng nhận thấy cú pháp giống C ngắn gọn có sức hấp dẫn hơn cú pháp xuất phát từ Algol của Pascal và các đối thủ cạnh tranh khác của C trong những năm 1970 và 1980. Do đó, nó được chấp nhận rộng rãi bởi các ngôn ngữ đi sau nó.

Với sự phát triển hiện tại về tầm quan trọng của lập trình đa luồng và các ngôn ngữ chức năng đặc biệt phù hợp với nó, tôi muốn nói rằng chúng ta sẽ thấy ảnh hưởng của chúng tăng lên trong tương lai. Case in point: Python, thậm chí đã tạo danh sách đó trong bài đăng câu hỏi.

Một cái nhìn thời gian tốt đẹp của lịch sử ngôn ngữ để suy ngẫm


Bạn đã hiểu sai. Cả PASCAL và C đều là hậu duệ của ALGOL.
Ingo

Đúng, nhưng chính Algol là hậu duệ của Fortran và chọn một số cấu trúc mà tôi đã đề cập ở đó (chương trình, kết thúc, chương trình con so với dấu ngoặc c). Tuy nhiên, những gì tôi có trong tâm trí thực tế là cú pháp giống Algol. Đã chỉnh sửa.
Scrwtp

Cú pháp giống C của terse có sức hấp dẫn hơn sau đó kéo dài cú pháp có nguồn gốc Algol của Pascal và các đối thủ khác của C trong thập niên 70 và 80 +1 cho điều đó. bắt đầu lập trình viên là con người quá kết thúc bắt đầu những người tin rằng thật thuận tiện khi ánh xạ các dấu chấm câu thành các từ như bắt đầu thua trận chiến của họ để kết thúc câu chuyện
gnat

Tôi không thấy bằng chứng nào cho thấy cú pháp C ít tối nghĩa, ngoại trừ theo nghĩa là hầu hết các nhà phát triển đều biết C hoặc một loại ngôn ngữ liên quan đến C, và do đó nó trông quen thuộc hơn. AFAICT, C đã chiến thắng Pascal vì cấu trúc của nó và thực tế là việc triển khai không phải tự tạo liên kết chứ không phải cú pháp.
David Thornley

@ David-Từ những gì tôi nhớ, một trong những lý do C chiến thắng các ngôn ngữ khác là vì sự dễ dàng truy cập bộ nhớ trong C (ví dụ: con trỏ). Tôi biết bây giờ họ đang bối rối, nhưng trở lại khi RAM 1 KB có rất nhiều bộ nhớ, đó là một tính năng rất mạnh mẽ của ngôn ngữ. Tôi biết các ngôn ngữ khác được cung cấp con trỏ như các tính năng, nhưng không có ngôn ngữ nào dễ dàng như C.
Dunk

-3

Hầu hết các ngôn ngữ bạn liệt kê hầu như không liên quan gì đến C ngoài những điểm tương đồng cú pháp không liên quan. Hai dẫn xuất C thực tế duy nhất là Objective-C và C ++.


Nếu chúng ta không xem xét cú pháp, thì sự khác biệt duy nhất giữa bất kỳ ngôn ngữ nào là sự sẵn có của các cấu trúc ngôn ngữ chung (vòng lặp, điều kiện, biến, trừu tượng của các ngôn ngữ này như các lớp và bao đóng, v.v.) và tất cả chúng đều tương đương với hành vi của máy mã. Tất cả các ngôn ngữ cấp thấp tương tự nhau và tất cả các ngôn ngữ cấp cao đều cực kỳ giống nhau tại thời điểm đó.
maple_shaft

2
Bạn không nên nghĩ về một ngôn ngữ như chức năng của nó, nhưng cách nó truyền đạt hành vi ứng dụng. Mã nguồn của bạn là cấp độ tài liệu thấp nhất của bạn và một mã ghi mã nguồn cho mọi ngườiKHÔNG cho máy móc . Nếu chúng ta viết mã nghiêm ngặt cho máy móc thì tất cả chúng ta sẽ được mã hóa trong lắp ráp.
maple_shaft

1
@maple_shaft: Hoàn toàn đúng! Tôi đã được yêu cầu trong một cuộc phỏng vấn để giải thích sự khác biệt giữa ngôn ngữ máy (trình biên dịch) và ngôn ngữ lập trình. Câu trả lời của tôi là: "Ngôn ngữ máy dành cho máy móc, ngôn ngữ lập trình dành cho lập trình viên".
Treb

1
@maple_shaft: Cú pháp không liên quan đến giao tiếp với mọi người . Nếu tôi thay thế một từ tiếng Anh bằng một cách viết khác, tiếng Anh vẫn sẽ là cùng một ngôn ngữ. Hình thức cú pháp là không liên quan, những gì giao tiếp là ngữ nghĩa ngôn ngữ.
DeadMG

3
@DeadMG: Nhưng câu hỏi là về cú pháp. Bạn có thể coi những điểm tương đồng cú pháp là không liên quan, nhưng người đặt câu hỏi muốn biết tại sao những điểm tương đồng không liên quan này tồn tại .
Nicol Bolas
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.