Có phải mọi ngôn ngữ được viết bằng C?


180

Đôi khi, trong khi lập trình bằng các ngôn ngữ khác nhau (C / C ++, C #), ý nghĩ này xuất hiện trong đầu tôi:

  • Là mỗi và mọi ngôn ngữ được viết bằng ngôn ngữ lập trình C?
  • Là ngôn ngữ C là mẹ / cha của tất cả các ngôn ngữ?
  • Có phải mỗi khái niệm ( OOP , v.v.) đều được thực hiện trong C?

Tôi có đi đúng hướng không?


58
@XLAnt: nhiều trình biên dịch C (thậm chí có thể là hầu hết) được viết bằng C.
Jörg W Mittag

32
@Neil: C ++ không biên dịch thành bất cứ thứ gì. C ++ là một ngôn ngữ. Ngôn ngữ không biên dịch, trình biên dịch làm.
Jörg W Mittag

12
@XLAnt: Tôi không nghĩ vậy. Nhưng trình biên dịch Oberon đầu tiên, ví dụ, được viết bằng Oberon và sau đó được dịch bằng tay (đó là một hình thức biên dịch, tôi đoán vậy) cho Fortran. Trình biên dịch này sau đó được biên dịch với trình biên dịch Fortran, trình biên dịch Oberon kết quả đã được sử dụng để biên dịch trình biên dịch Oberon và từ thời điểm đó, phiên bản trước của trình biên dịch đã được sử dụng để biên dịch phiên bản tiếp theo.
Jörg W Mittag

18
@Neil Nó không thực sự là mô phạm. Nó chính xác: một ngôn ngữ là một thông số kỹ thuật. Nó có thể được thực hiện như một trình biên dịch, như một trình thông dịch, kết hợp, v.v. Bạn có thể viết một trình biên dịch cho một ngôn ngữ, nhưng trình biên dịch không phải là ngôn ngữ. Tôi đoán vấn đề trở nên khó hiểu bởi vì có những ngôn ngữ không có thông số kỹ thuật được viết ở bất cứ đâu ngoại trừ việc thực hiện tham chiếu của nó. Nhưng ngay cả trong những trường hợp đó, tôi tranh luận ngôn ngữ (nghĩa là lý tưởng mà tác giả có trong tâm trí của anh ấy) khác với cách triển khai / trình biên dịch / trình thông dịch / v.v.
Andres F.

21
Downvoters: đây là một câu hỏi khá hợp lý với một câu trả lời rõ ràng. Câu trả lời là "không" không phải là lý do để downvote. Thay vào đó, hãy xem xét trả lời và giải thích.
Andres F.

Câu trả lời:


207

Không.

Các phương ngữ OCaml, Haskell, Lisp như Scheme và một số ngôn ngữ khác thường được sử dụng để phát triển các ngôn ngữ sở thích.

Nhiều ngôn ngữ được triển khai trong C vì đó là ngôn ngữ phổ biến và các công cụ viết trình biên dịch như trình tạo lexer-Parser (như yacc và bison) được hiểu rõ và gần như phổ biến.

Nhưng bản thân C ban đầu không thể được phát triển trong C khi nó được tạo lần đầu tiên. Trên thực tế, ban đầu nó được phát triển bằng ngôn ngữ B. Các ngôn ngữ trước đó (như Fortran) thường được khởi động bằng ngôn ngữ lắp ráp gốc hoặc thậm chí mã máy từ lâu trước khi C tồn tại.

Không liên quan, các mô hình ngôn ngữ như OOP nói chung là bất khả tri về ngôn ngữ. Ví dụ, mô hình chức năng đã được phát triển (bởi Alonzo Church) như là một nền tảng của toán học từ lâu trước khi bất kỳ ngôn ngữ lập trình nào từng tồn tại. Các mô hình lập trình thủ tục và cấu trúc ra đời từ công việc toán học của các nhà lý thuyết như John von Neumann. Định hướng đối tượng được phát triển bởi một số nỗ lực khác nhau và không liên quan , một số tính toán lambda (mô hình chức năng) và một số hệ thống lập trình động như SmallTalk tại Xerox PARC của Alan Kay.

C chỉ là một phần rất nhỏ của câu chuyện, hàng thập kỷ sau khi những ý tưởng này ra đời.


40
Mặc dù đúng là các trình biên dịch C đầu tiên rõ ràng không thể được viết bằng C, nhưng bây giờ chắc chắn là có thể.
đăng lại

17
@reirab Tích cực đúng. GCC được viết bằng C và được biên dịch theo cách sử dụng GCC .
Darkhogg

9
Tất nhiên, GCC hiện đang được viết lại bằng C ++, nhưng điều đó không quan trọng bằng thực tế là trình biên dịch C đầu tiên không thể được viết bằng C.
greyfade

10
@greyfade gcc đã không được C một thời gian. Nó không phải là "bây giờ được viết lại" mà là "đã được viết bằng C ++ trong hơn hai năm" (thậm chí nó còn cũ hơn thế, đó là khi sự hợp nhất xảy ra đã chuyển nó sang C ++).

13
@greyfade không phải là "C nhưng với các tính năng của C ++" theo định nghĩa của C ++?
KutuluMike

91

Là mỗi và mọi ngôn ngữ được viết bằng ngôn ngữ C?

Một ngôn ngữ là một tập hợp các quy tắc và hạn chế toán học trừu tượng ("nếu tôi viết điều này , điều đó xảy ra"). Nó không được viết trong bất cứ điều gì, thực sự.

Nó được chỉ định, thường là trong một hỗn hợp của một tập hợp con chính thức của tiếng Anh, ký hiệu toán học và có thể một số ngôn ngữ đặc tả chuyên ngành. Cú pháp thường được chỉ định trong một biến thể của EBNF hoặc ABNF .

Ví dụ, đây là thông số kỹ thuật của forbiểu thức từ Đặc tả ngôn ngữ ISO Ruby:

§11.5.2.3.4 forBiểu thức

Cú pháp

  • for-biểu thức for for-biến [không có dòng kết thúc ở đây] in biểu thức do-mệnh đề end
  • cho biến bên trái | nhiều bên trái

Ngữ nghĩa

Một biểu thức for được đánh giá như sau:

  1. Đánh giá biểu thức . Nếu việc đánh giá các biểu hiện bị chấm dứt bởi một đột phá thể hiện , tiếp theo thể hiện , hoặc thực hiện lại biểu hiện , hành vi này là không xác định. Nếu không, hãy Olà giá trị kết quả.
  2. Hãy Elà lệnh gọi phương thức chính của biểu thức chính biểu thức [không có đầu cuối dòng ở đây] .each do | khối thân-tham số-danh sách | khối end , trong đó giá trị của biểu thức chínhO, danh sách tham số khốifor- biến , thân khốicâu lệnh ghép của mệnh đề do .

    Đánh giá E; tuy nhiên, nếu một khối có thân khốicâu lệnh ghép của mệnh đề do của biểu thức for được gọi trong đánh giá này, các bước trong §11.3.3 ngoại trừ Bước c) và Bước e) 4) sẽ được thực hiện để đánh giá cuộc gọi này.

  3. Giá trị của biểu thức for là giá trị kết quả của lệnh gọi.

Đây là một ví dụ khác với quy tắc tuân thủ kiểu của Scala:

Loại đa hình [a 1 >: L 1 <: U 1 , Sọ, a n >: L n <: U n ] T phù hợp với loại đa hình [a1>: L ′ 1 <: U ′ 1 , Lôi, a n >: L n <: U ′ n ] T ′ if, giả sử L ′ 1 <: a 1 <: U ′ 1 , Câu , L ′ n <: a n <: U′n ai có T <: T 'L i <: L' iU ' i<: U i cho i ∈ {1, Mạnh, n} .


Là ngôn ngữ C mẹ / cha của tất cả các ngôn ngữ?

Không có nó không phải là. C còn khá trẻ. Có rất nhiều ngôn ngữ cũ. Vì du hành thời gian là không thể, nên C đơn giản là không thể có bất kỳ ảnh hưởng nào đến những ngôn ngữ cũ đó.

  • Plankalkül (1943)
  • Mã tốc độ (1953)
  • Pháo đài (1954)
  • IPL (1956)
  • Lisp (1958)
  • Algol (1958)
  • COBOL (1959)
  • CÔNG VIỆC (1960)
  • APL (1962)
  • SIMULA (1962)
  • SNOBOL (1962)
  • CPL (1963)
  • CƠ BẢN (1964)
  • PL / I (1964)
  • Game nhập vai (1964)
  • BCPL (1966)
  • ISWIM (1966)
  • MUMPS (1967)
  • Forth (1968)
  • LOGO (1968)
  • REFAL (1968)
  • B (1969)
  • BLISS (1970)
  • Pascal (1971)
  • KRL (1971)
  • Smalltalk (1972)

Tất cả những thứ tồn tại trước khi C thậm chí được phát minh. Và nhiều người khác không có ảnh hưởng của C trong họ, ngay cả sau khi nó tồn tại. Họ ngôn ngữ PASCAL (ALGOL-58, ALGOL-60, ALGOL-X, ALGOL-W, PASCAL, Modula-2, Oberon, Oberon-2, Active Oberon, Hợp phần Pascal) là một dòng hoàn toàn riêng biệt. Cả gia đình Lisp (LISP, Franz Lisp, InterLisp, MacLisp, Scheme, Flavours, LOOPS, CommonLoops, Dylan, CommonLisp, Arc, Clojure, Vợt, v.v.) cũng không liên quan. Các ngôn ngữ chức năng (ISWIM, KRL, Miranda, ML, SML, CAML, OCaml, F #, Haskell, Gofer, Clean) và toàn bộ gia đình được gõ phụ thuộc (Agda, Coq, GURU, Idris) càng xa C càng tốt. Điều tương tự cũng đúng với gia đình Smalltalk (Smalltalk, Self, Drameak, Us, Korz), gia đình lập trình logic (PLANNER, Prolog, Mercury), SQL và nhiều người khác.

Mỗi khái niệm (OOP, v.v.) đều được thực hiện bằng ngôn ngữ C?

Các ngôn ngữ đầu tiên có khái niệm OO là Simula (1960) và Smalltalk (1972), nhưng các hệ thống hướng đối tượng đã được xây dựng từ năm 1953 (không gọi chúng là như vậy). Một lần nữa, đó là rất lâu trước khi C tồn tại, vì vậy OO không thể có bất kỳ mối quan hệ nào với C.



2
@leftaroundabout: Đó là một blogpost tuyệt vời, một trong những mục yêu thích của tôi trong nhiều năm.
Jörg W Mittag

1
@FrancisDavey: Cảm ơn. Tôi bắt đầu biên soạn danh sách từ bộ nhớ, sau đó tôi đã thêm những ngày tôi không nhớ bằng cách tìm chúng trên Wikipedia. Sau đó, tôi tìm thấy dòng thời gian của các ngôn ngữ trên Wikipedia và chọn thêm một vài ngôn ngữ từ đó. Vì bài báo về BCPL trích dẫn năm 1966, nhưng dòng thời gian trích dẫn năm 1967, tôi đã không nhận thấy rằng tôi đã thêm BCPL. Tôi sẽ xóa bản sao.
Jörg W Mittag

1
Trong danh sách của bạn, không phải "htroF" đánh vần ngược sao?
chux

2
Du hành thời gian là không thể thực hiện được - Đây là một yêu sách rất gây tranh cãi. Tất nhiên, không làm mất giá trị của câu trả lời này.
Konrad Rudolph

50

Hầu hết cốt lõi của nhiều ngôn ngữ quan trọng được viết bằng C, nhưng mọi thứ đang thay đổi:

  • việc triển khai tham chiếu của Python ( CPython ) được viết bằng C (nhưng có các triển khai khác được viết bằng các ngôn ngữ khác, ví dụ Jython / Java, PyPy / Python, IronPython / C # ...)
  • PHP Zend Engine được viết bằng C
  • trình biên dịch Java đầu tiên được phát triển bởi Sun microsystems đã được viết bằng C, nhưng bây giờ các thư viện lớp luôn được viết bằng Java (vì chúng dự định được chạy bằng chính Java VM). Một số thư viện sử dụng JNI (Giao diện gốc Java) có thể được viết một phần bằng nhiều ngôn ngữ khác, vì chúng được sử dụng BÊN NGOÀI JVM.

    Sun / Oracle VM được viết bằng C ++. BEA / Weblogic / Oracle VM được viết bằng C. Nhưng có JVM được viết bằng Java, Lisp, SmallTalk (IBM) ...

  • Perl được triển khai như một trình thông dịch cốt lõi, được viết bằng C, cùng với một bộ lớn các mô-đun, được viết bằng Perl và C (nhưng Pugs , một trình biên dịch và trình thông dịch cho ngôn ngữ lập trình Perl 6, được viết bằng Haskell)
  • trình thông dịch chính thức của Ruby, thường được gọi là Trình thông dịch Ruby hoặc MRI của Matz, được viết bằng C và sử dụng máy ảo riêng của Ruby (nhưng có JRuby, một triển khai Java chạy trên máy ảo Java; Rubinius, C ++ máy ảo bytecode sử dụng LLVM để biên dịch thành mã máy khi chạy ...)
  • khoảng 50% R được viết bằng C
  • và, tất nhiên, C là (đã) được viết bằng C ! (nhưng trình biên dịch C đầu tiên, được nhắm mục tiêu đến PDP-11, là sự pha trộn giữa B và trình biên dịch).

Có nhiều lý do tại sao C thường được chọn: hiệu suất, tính di động, kinh nghiệm.

Điều cuối cùng có lẽ là quan trọng nhất: Python được bắt đầu vào năm 1991, PHP vào năm 1994/1995, Perl năm 1988, Ruby vào năm 1995. Trong những năm đó Java mới được phát hành và C ++ chưa được chuẩn hóa tốt.


Hơi liên quan:


5
Từ quan điểm của trình biên dịch / thực hiện phiên dịch, C đã / là một điểm tham chiếu. Ngoài ra, nó đã ảnh hưởng trực tiếp hoặc gián tiếp đến nhiều ngôn ngữ sau này (ít nhất là về mặt cú pháp).
manlio

2
khá sớm, bạn sẽ có thể nói rằng C # đã được viết bằng C #! (loại)
DLeh

1
Hầu hết Mono (bao gồm trình biên dịch C # và nhiều / hầu hết thư viện lớp cơ sở .NET) được viết bằng C #.
Charlie Kilian

3
Câu trả lời cho câu hỏi "C có phải là mẹ / cha của tất cả các ngôn ngữ không?" là "không", vì vậy tôi không nghĩ sẽ hữu ích khi cung cấp nhiều ví dụ được viết bằng C. Các ví dụ phản tác dụng sẽ giúp ích, nhưng các lựa chọn của bạn vẫn xuất phát từ C. Ví dụ: ngay cả khi Java, Python, v.v. Hiện đang tự lưu trữ, chúng vẫn được bootstraged từ C, vì vậy chúng giống như "cháu" của C. Các ngôn ngữ như LISP, FORTRAN, ML và (tất nhiên) là mã ví dụ thực sự, vì C không bao giờ tham gia vào sáng tạo của họ.
Warbo

2
Tất nhiên, nguyện vọng cho nhiều ngôn ngữ là được thực hiện càng nhiều càng tốt. Tuy nhiên, có vẻ như hầu hết các ngôn ngữ phụ thuộc vào C vì hầu hết các ngôn ngữ cần có khả năng gọi C là hữu ích; phần lớn các API hệ điều hành hiện đại và các thư viện hữu ích có xu hướng có các ràng buộc C. Bạn cũng phải cẩn thận về những gì bạn có nghĩa là "viết bằng". Việc triển khai ngôn ngữ thường có nhiều phần: ít nhất là trình biên dịch và hệ thống thời gian chạy. Các hệ thống thời gian chạy thường được viết bằng C để giao diện tốt hơn với HĐH.
Bút danh

10

Không, một số ngôn ngữ có từ trước C. Và nhiều ngôn ngữ được triển khai độc lập với C, ví dụ: xem http://en.wikipedia.org/wiki/Lisp_%28programming_lingu%29


2
Có nhiều triển khai Java, hầu hết được viết bằng Java. Việc triển khai GNU của Objective-C được viết bằng C (hoặc C ++, họ đã thay đổi gần đây, tôi tin), việc triển khai LLVM được viết bằng C ++ và đã từng có một trình thông dịch được viết bằng C #. Có nhiều triển khai Python, một được viết bằng RPython, một bằng Java, một bằng C # và một bằng C. PHP có sáu triển khai chính, hai bằng Java, hai bằng C #, một bằng C và một bằng C ++.
Jörg W Mittag

1
Không. Các nhà thiết kế ngôn ngữ chắc chắn bị ảnh hưởng bởi các ngôn ngữ khác, nhưng họ có thể chọn bỏ qua những ảnh hưởng đó nếu họ muốn.
Jörg W Mittag

2
Về bản chất, các ngôn ngữ @FaizanRabbani là các khái niệm và lựa chọn về mô hình, mô hình và sự thỏa hiệp - rất thường là "ngôn ngữ được tạo / điều chỉnh từ các ngôn ngữ khác" nhưng hoàn toàn không liên quan đến ngôn ngữ thực hiện của trình biên dịch; ngôn ngữ X có thể được bắt nguồn từ ngôn ngữ Y nhưng được thực hiện bằng C hoặc một cái gì đó hoàn toàn khác - và đó thường là trường hợp. Và trong trường hợp này, 'tổ tiên khái niệm' rất quan trọng nhưng ngôn ngữ trình biên dịch chỉ là một sắc thái kỹ thuật hầu như không liên quan có thể thay đổi theo thời gian.
Peteris

3
Đó là liên kết cuối cùng nếu có giá trị đáng ngờ - quá nhiều sai lầm trong đó để thực sự nghiêm túc.
không xác định

4
@SebastianGodelet: HotSpot không phải là một triển khai ngôn ngữ Java. Đó là một triển khai của ngôn ngữ mã byte JVM. Đó là hai ngôn ngữ hoàn toàn khác nhau. Các triển khai ngôn ngữ Java được sử dụng rộng rãi nhất là javactừ Oracle JDK / OpenJDK được viết bởi Martin Oderky (của Scala fame) bằng 100% Java, Trình biên dịch Eclipse, được viết bằng Java 100% (xuất phát từ trình biên dịch Jike của IBM ), trình biên dịch từ J9 của IBM, cũng bắt nguồn từ Jike và 100% Java. AFAIK, trình biên dịch Java duy nhất được sử dụng rộng rãi không được viết bằng Java là GCJ
Jörg W Mittag

4

Tôi sẽ bình luận nếu tôi có thể, nhưng tôi không thể ở đây:

Một trong những lý do C có vẻ phổ biến là vì nó là một trong những ngôn ngữ sớm nhất được phát triển và một lượng lớn ngôn ngữ hiện đại dựa trên cấu trúc của nó (Java, Go, PHP, Perl, v.v.) - làm cho nó có vẻ như nó nhiều nơi hơn nó là.

Một lý do khác bị lãng quên là vào năm 1973 Unix đã được viết lại bằng C và nhiều cuộc gọi hệ thống của Unix cũng có sẵn dưới dạng các chương trình / chức năng C, khiến hai cái này có tính liên kết cao. Vì Unix là một phần mạnh mẽ trong sự phát triển của lập trình hiện đại nói chung, C đã bị kéo theo sự bỉ ổi với nó.

Đã nói tất cả, câu trả lời cho câu hỏi của bạn là "Không". C dựa trên một ngôn ngữ gọi là ALGOL và có rất nhiều đối thủ cạnh tranh với cả ALGOL (FORTRAN, Lisp, COBOL) và C (không ai nghĩ đến). Lập trình hướng đối tượng, được cho là sự thay đổi mô hình lớn nhất trong thiết kế lập trình, không bắt nguồn từ C - mặc dù C ++ là ngôn ngữ OOP rất phổ biến (nó xuất hiện đầu tiên trong Lisp hoặc Simula 67, tùy thuộc vào người bạn hỏi). Vào thời điểm OOP xuất hiện, C là ngôn ngữ phổ biến đến mức không cần phải là ngôn ngữ đầu tiên - nó phổ biến đến mức "mở rộng" C ++, có thể nói, cũng trở thành một trong những ngôn ngữ OOP chính. Nó vẫn được sử dụng hiện đại chủ yếu nhờ các tính năng kiểm soát bộ nhớ mạnh mẽ của nó (bạn có thể trực tiếp phân bổ và phân bổ bộ nhớ mà cấu trúc của bạn tạo ra), cho phép nó tạo các chương trình trên ngân sách bộ nhớ chặt chẽ (nghĩ các trò chơi video) và trình biên dịch được tối ưu hóa cao của nó (rõ ràng phụ thuộc vào trình biên dịch). Phải thừa nhận rằng, ngay cả những tính năng này cũng đang mất dần khi trình biên dịch Java JIT và các trình quản lý bộ nhớ trong ngôn ngữ trở nên tiên tiến hơn.


1
điều này dường như không cung cấp bất cứ điều gì đáng kể qua các điểm được đưa ra và giải thích trong các câu trả lời trước, đặc biệt là trong câu hỏi hàng đầu , ngoại trừ một câu hỏi nghi ngờ rằng "C dựa trên một ngôn ngữ gọi là ALGOL"
gnat

4
Cơ sở của C trong ALGOL hầu như không có vấn đề ... Xem cm.bell-labs.com/who/dmr/chist.html , en.wikipedia.org/wiki/C_%28programming_lingu%29 )
WannabeCoder 22/12/14

những câu chuyện thực tế là nhiều phức tạp và thú vị hơn đó; Tôi muốn nói rằng cách mọi thứ được trình bày ở đây hầu như không hữu ích cho độc giả
gnat

3

Rõ ràng là không. Làm thế nào trình biên dịch C đầu tiên có thể được viết bằng C nếu C không tồn tại trước đó? Đây không phải là vấn đề gà và trứng.

Có nhiều cách để viết trình biên dịch đầu tiên của ngôn ngữ được gọi là bootstrapping

Hơn nữa, hầu hết các trình biên dịch đều cố gắng tự lưu trữ hoặc tự biên dịch ngôn ngữ của nó, chủ yếu để quảng bá ngôn ngữ và chính trình biên dịch


12
Trình biên dịch Oberon đầu tiên được viết bằng Oberon. Điều đó hoàn toàn tốt, miễn là bạn là giáo sư và có rất nhiều sinh viên sẽ dịch tay trình biên dịch cho bạn (mà giáo sư Wirth đã có).
Jörg W Mittag

@Jorg đã được đề cập trong bài viết bootstrapping được liên kết ở trên vì vậy tôi không bận tâm viết điều đó bởi vì câu hỏi này là về C và không có trình biên dịch C nào được viết theo cách đó
phuclv

14
@ JörgWMittag - trình biên dịch Oberon tự động đầu tiên được viết bằng Oberon. Trình biên dịch Oberon thực tế đầu tiên là một nhóm các sinh viên.
nnnnnn

4
@nnnnnn: Tôi sẽ coi "nhóm sinh viên" này là một thông dịch viên, không phải là trình biên dịch.
Paŭlo Ebermann

4
@ Paŭlo Ebermann Để thêm một yếu tố con người khác: "máy tính" ban đầu là một chức danh công việc .
chux

2

Dưới đây là danh sách một số ngôn ngữ lập trình không được viết bằng C, bên cạnh các ngôn ngữ được triển khai trong:

  • Haskell - Haskell
  • Idris - Haskell
  • Adga - Haskell
  • Đụng độ - Haskell
  • PureScript - Haskell
  • Elm - Haskell
  • Thủy ngân - Thủy ngân
  • Rust - Rust (ban đầu là OCaml)
  • Đi - đi
  • Pha lê - Pha lê
  • OCaml - OCaml
  • Frege - Frege + Java
  • Haxe - OCaml + Haxe
  • Scala - Scala
  • Futhark - Haskell
  • ATS - ATS

Các ngôn ngữ tốt nhất để triển khai trình biên dịch có lẽ sẽ ở khá xa C. Các ngôn ngữ chức năng cung cấp cho bạn những thứ như sơ đồ đệ quy và trình kết hợp trình phân tích cú pháp đơn âm (miễn là bạn có máy đánh chữ), khiến chúng đặc biệt phù hợp với công việc biên dịch.

Thứ hai, để giải quyết câu hỏi của bạn là liệu C có phải là "mẹ / cha của tất cả các ngôn ngữ lập trình" - không thực sự. C là một ngôn ngữ được thiết kế tốt vào thời điểm nó xuất hiện, và không nghi ngờ gì đã ảnh hưởng đến các nhà thiết kế ngôn ngữ, những người sau đó đã tiếp tục làm những việc rất khác nhau. Nhưng vào cuối ngày, Haskell rời khỏi C về mọi mặt có thể. C đã 45 tuổi và không có gì đáng ngạc nhiên khi chúng tôi đã học được cách làm tốt hơn trong thời gian này.

Cuối cùng, để trả lời câu hỏi thứ ba của bạn, đơn giản là C không thực hiện "tất cả các khái niệm". Cụ thể, cố gắng thực hiện một số khái niệm nâng cao từ lập trình chức năng (chẳng hạn như biến thái, hoặc, thần cấm, từ đồng nghĩa) trong C sẽ rất khó khăn. Tôi không đặc biệt quen thuộc với lập trình hướng đối tượng, nhưng tôi thực sự biết rằng một số ngôn ngữ hướng đối tượng có kiểu tổng.


C chưa bao giờ là "một ngôn ngữ được thiết kế cực kỳ tốt." Các mụn cóc mà chúng ta thấy trên đó ngày nay được biết đến là mụn cóc ngay từ đầu. Nhưng, nó đủ tốt để trở thành ngôn ngữ bản địa của hệ điều hành Unix thân thiện với nhà phát triển và sau khi Bell Labs đẩy Unix ra khỏi các trường đại học, C / Unix trở thành ngôn ngữ / HĐH yêu thích cho một thế hệ chuyên gia máy tính.
Solomon chậm

Tái bút: Không có nhiều ý tưởng ban đầu trong C. Nếu bạn đang tìm kiếm mẹ / cha của tất cả các ngôn ngữ lập trình thủ tục, có cấu trúc khối, bạn có thể muốn xem ALGOL .
Solomon chậm

Lisp Macros tốt hơn nhiều so với C, và ALGOL và Smalltalk có các khối, đóng và các hàm lồng nhau để giúp tổ chức mã. Thật vậy, Lisp có thể đã được sử dụng như một bộ xử lý Macro cho trình biên dịch mã và tạo mã ngắn hơn và nhanh hơn (xử lý các biểu thức S) tùy chỉnh so với C. Simula xuất hiện trước khi C có tính đa hình. Lisp, APL và Smalltalk có "shell" có đầy đủ chức năng (cùng mã giữa shell và chương trình) không giống như "sh" vs "C" của Unix cho phép mã hóa và biên dịch được xen kẽ. Con trỏ dễ dàng hơn trong Lisp (rplaca / rplacd).
aoeu256

Ưu điểm lớn nhất của C là việc xây dựng "trình biên dịch" cho C dễ dàng hơn và do đó nó có thể lây lan dễ dàng hơn ... giống như virus, và nhờ các lập trình viên C hiện đại không có manh mối về cách xây dựng chương trình theo mô đun (tính biến đổi làm tổn thương tính mô đun), không có khái niệm về trạng từ / tổ hợp / chức năng bậc cao [viết thủ công các vòng lặp của bạn mỗi lần] và CPU của chúng tôi bị giới hạn bởi nút cổ chai "von neumann" vì hệ điều hành của chúng tôi được viết bằng C vì vậy chúng tôi cần CPU để chạy mã C để tương thích ngược.
aoeu256

1

Ngôn ngữ lập trình là thông số kỹ thuật (không phải phần mềm!) Thường được viết bằng một số tài liệu tiếng Anh (với một số hình thức hóa, ví dụ EBNF cho hầu hết các cú pháp; đôi khi ngữ nghĩa của chúng cũng được chính thức hóa một phần).

Ví dụ, C11 được xác định bởi n1570 (mà bạn nên đọc). Một số phương ngữ của Đề án được xác định bởi R5RS (mà bạn cũng nên đọc, nó được viết rất tốt).

Ngôn ngữ lập trình có thể được thực hiện bởi một số phần mềm. Đôi khi phần mềm đó là một trình biên dịch được viết bằng chính ngôn ngữ lập trình. Đọc về trình biên dịch bootstrapping .

Người ta có thể viết một trình biên dịch trong chính ngôn ngữ lập trình được biên dịch. Nếu ngôn ngữ XX đó hoàn toàn mới, bạn cần thực hiện một bước tạm thời bao gồm viết một trình thông dịch hoặc trình biên dịch tối thiểu của một tập hợp con của ngôn ngữ đó bằng một số ngôn ngữ thực hiện khác (có thể là C), và sau đó bạn có thể loại bỏ trình biên dịch tạm thời đó hoặc trình thông dịch (không cần phải "tốt", chỉ đủ để biên dịch trình biên dịch khác). Khi bạn biên dịch trình biên dịch XX được viết bằng XX, bạn có thể vứt bỏ trình biên dịch tạm thời của mình.

Thông thường (nhưng không phải luôn luôn) hệ thống thời gian chạy được viết một phần bằng C (đặc biệt là trình thu gom rác ).

Lưu ý rằng bone là trình biên dịch Scheme và thời gian chạy hoàn toàn được viết bằng chính nó (và bạn có thể tìm thấy nhiều ví dụ khác về việc triển khai bootstrapping hoàn toàn).

BTW thuận tiện khi sử dụng C làm ngôn ngữ đích của trình biên dịch .

Ngày nay, rất nhiều ngôn ngữ lập trình triển khai là phần mềm miễn phí hoặc nguồn mở . Hãy nghiên cứu (và có lẽ đóng góp cho) mã nguồn của họ!

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.