Tại sao không có ngôn ngữ nhanh hơn, tốt hơn so với C xuất hiện? [đóng cửa]


147

Với tất cả các ngôn ngữ "hiện đại" mới hiện nay, làm thế nào mà C vẫn được coi là nhanh nhất và "gần với máy" nhất? Tôi thực sự không tin vào việc chỉ có một cách chính xác để làm mọi việc và C đã tồn tại trong một thời gian rất dài (kể từ những năm 60!). Chúng ta có thực sự không nghĩ ra thứ gì hay hơn thứ được viết cách đây gần 50 năm không?

Tôi biết rằng các ngôn ngữ hiện đại ở cấp độ cao hơn và đảm nhiệm một số nhiệm vụ nhất định như thu gom rác và phân bổ bộ nhớ và sử dụng các thư viện, v.v. Tôi chỉ hỏi tại sao chưa bao giờ có một lựa chọn thứ hai thực sự cho C.

Có thể là C hoàn hảo đến mức không thể có cách vận hành máy tính nào khác (áp dụng cho nhà phát triển sang một bên)?

EDIT Hãy nhìn xem, tôi không cố gắng gõ C hay bất kỳ ngôn ngữ yêu thích nào của bạn. Tôi tự hỏi tại sao C lại trở thành tiêu chuẩn và tại sao các lựa chọn thay thế khác không bao giờ xuất hiện và C chỉ "được chấp nhận".


44
C ++ rất nhanh và hiệu quả hơn nhiều để viết. <3
GManNickG

6
Ừm, bạn không quên c ++ à?

23
Tôi cho rằng lắp ráp là nhanh nhất và "gần nhất" với máy.

27
Tại sao tất cả các chuyển động để đóng cửa? Tôi thực sự tò mò ... Tôi không cố bắt đầu những cuộc chiến nảy lửa hay bất cứ điều gì
Jason

15
lại đóng cửa? Sau khi được mở lại bởi jeff atwood? Tại sao bạn có thể muốn đóng cái này?
Jason

Câu trả lời:


164

C là một ngôn ngữ rất đơn giản, và vì điều này, cùng với tuổi thọ của nó, đó là nhanh và tối ưu hóa. Nó cũng được hỗ trợ rộng rãi, liên quan đến môi trường nhúng, bộ vi xử lý, v.v.

Thật khó để đánh bại một ngôn ngữ thực sự đơn giản và nhanh chóng. Điều duy nhất để cải thiện một ngôn ngữ như thế là khả năng sử dụng: giảm thời gian cần thiết để tạo mã chung, tương tự và làm cho việc mô hình hóa trừu tượng dễ dàng hơn.

Đây là lúc C ++ xuất hiện. C ++ có thể nhanh như C. Điều này là, C ++ là một ngôn ngữ phức tạp hơn nhiều, có nghĩa là nó chắc chắn làm tăng năng suất; miễn là mọi người biết cách sử dụng nó. C ++ và C gần như không còn là ngôn ngữ nữa.

Bây giờ, D là một bước tiến lên. Khả năng tương tự cho mã nhanh, bộ sưu tập rác tùy chọn, v.v., nhưng nó không bao giờ bị bắt. Hy vọng rằng điều đó sẽ thay đổi, vì nó làm giảm những gì gây ra cho C ++: khả năng tương thích ngược với C.

Vì vậy, để trả lời câu hỏi của bạn, "tốt hơn" là một điều khó đánh giá. Xét về độ đơn giản và tốc độ, C có lẽ gần với điều tốt nhất chúng ta có thể làm. Về năng suất so với sự đơn giản, C ++ có lẽ là tốt nhất chúng ta có thể làm, mặc dù ý kiến ​​đó thay đổi nhiều hơn. Cuối cùng, về mặt ngôn ngữ xác thực và sạch sẽ, với tốc độ và sự đơn giản của C, D chiến thắng bối cảnh này.


31
Theo "Đơn giản", bạn có nghĩa là "đơn giản từ trình biên dịch POV, không phải POV lập trình viên". C đơn giản vì về cơ bản nó lắp ráp với các câu lệnh và biểu thức. Cách Python không đơn giản.
Marius

15
Nhưng để làm rõ, đơn giản cho trình biên dịch không có nghĩa là đơn giản để nhận. Có lẽ không đơn giản để thực hiện các ý tưởng phức tạp trong.
GManNickG

16
Với giá trị của nó, OCaml tạo ra mã gốc được tối ưu hóa cao nhanh như C và C ++, và bản thân mã cũng tuyệt vời như Python. Với một chút đánh bóng, tôi nghĩ OCaml có thể khớp hoặc đánh bại C là ngôn ngữ được lựa chọn khi bạn cần viết mã cho tốc độ tối đa và dấu chân bộ nhớ tối thiểu. Objective-C cũng làm rất tốt, mặc dù không phải lúc nào cũng nhanh như C, nhưng nó có được toàn bộ điều "C với các đối tượng" theo cách mà C ++ không bao giờ có thể và sẽ không bao giờ.
Juliet

2
Đồng ý với @ Thorbjørn, khả năng tương thích ngược với C là lý do tại sao C ++ bị bắt và D thì không. Nếu chúng tôi sẵn sàng từ bỏ điều đó, không có lý do gì để giải quyết cho sự cải thiện gia tăng đó là D. Chúng tôi có thể tìm kiếm những ngôn ngữ tốt hơn hoàn toàn ngoài gia đình C. Như @Juliet nói, OCaml có thể là một ứng cử viên sáng suốt về hiệu suất. Nhưng một số ngôn ngữ khác cũng vậy, nếu các nhà văn biên dịch đã dành nhiều thời gian cho chúng như họ có trên C hoặc C ++. Dù sao, câu trả lời tốt, và +1 từ tôi.
jalf

5
@Ferruccio: Có, nhưng mọi ngôn ngữ đều có thể liên kết đến thư viện C. Vì vậy, nếu chúng tôi sẵn sàng giải quyết vấn đề đó, thay vì khả năng tương thích mã nguồn thực tế, như C ++ (ít nhiều) cung cấp, thì chúng tôi cũng có thể chọn một ngôn ngữ hoàn toàn khác, như Haskell hoặc Python. Lý do C ++ bị bắt không phải là nó có thể liên kết với các thư viện C. Đó là nó có thể biên dịch mã C.
jalf

64

Có nhanh hơn ngôn ngữ C.

Có các ngôn ngữ nhanh hơn C. Ví dụ như Fortran như đã đề cập đang hoạt động rất tốt vì nó có các quy tắc ngôn ngữ bí danh hạn chế hơn nhiều.

Ngoài ra còn có lắp ráp thử nghiệm như các ngôn ngữ đang tấn công C ở mặt trước nơi nó được sử dụng làm ngôn ngữ xác nhận cấp cao để tạo trình biên dịch. Bạn đã từng nghe về C-- hay Janus chưa? Nhưng hai người đó đã bị giết bởi dự án LLVM.

Tôi đặt cược rằng APL hoặc các ngôn ngữ toán học khác sẽ thổi C ra khỏi nước trong các miền ứng dụng đặc biệt khi chúng được xây dựng để hỗ trợ cho các đơn vị xử lý Vector. Đây là điều không thể đối với C (và các bạn: KHÔNG! Các thư viện được tối ưu hóa đặc biệt với liên kết C không liên quan gì đến C như một ngôn ngữ).

Ngoài ra, các nhà sản xuất CPU đã loại bỏ tất cả nội dung giúp người viết trình biên dịch bằng các ngôn ngữ khác - hãy nhớ mã trình biên dịch số học được gắn thẻ để thực hiện LISP trên SPARC nhanh? Cuốn theo chiều gió.

Và nếu bạn đi từ điểm chuẩn vi mô để phát triển ứng dụng thì sẽ có ngôn ngữ nhanh hơn để phát triển ứng dụng. Ví dụ cá nhân của tôi ở đây luôn là SmartEiffel. Nó nhắm mục tiêu C nhưng đang sử dụng tối ưu hóa hệ thống toàn cầu, giúp C nhanh hơn phát triển ứng dụng trong thế giới thực.

Trong miền này, ngay cả một sự trừu tượng đơn giản hoặc mức độ thấp có thể giết chết toàn bộ hiệu suất ngôn ngữ. Bởi vì C không cung cấp sự trừu tượng cao, hầu hết mọi người nói rằng đó là một vấn đề lập trình nhưng thực tế không phải vậy. Ví dụ nhìn vào sự thiếu sót của thuốc generic. Trong C, bạn sẽ kết thúc với việc triển khai chậm như hàm thư viện "qsort" có thể được viết nhanh hơn với cường độ chung (trong đó chức năng gọi để so sánh khóa được loại bỏ).

Chỉ cần so sánh một cuộc gọi qsort trên một mảng intabyte với một triển khai viết tay tốt đang sử dụng truy cập mảng và toán tử dựng sẵn '<'.


9
Nhận xét rất tốt. Điều quan trọng là phải nhận ra rằng một số khía cạnh của thông số ngôn ngữ C (như quy tắc bí danh con trỏ) làm cho không thể tạo mã máy thực sự tối ưu. Là một nhà lắp ráp cấp cao, C không phải là "nhanh nhất", mà chỉ là "khá nhanh".

1
Cảm ơn tôi đã quên đề cập đến việc không thể trả lại nhiều giá trị kết quả. Một khía cạnh cấp thấp khác mà tôi thiếu cứng khi sử dụng nó như là trình biên dịch cấp cao.

5
Modern C, được viết đúng, có thể mã hóa các giả định răng cưa giống như bất kỳ ngôn ngữ nào khác, cho phép trình biên dịch thực hiện các tối ưu hóa tương tự. Đây là một tính năng quan trọng của ngôn ngữ mà nó cũng cho phép lập trình viên không thực hiện các yêu cầu đó khi chúng không được áp dụng. Điểm khác của bạn là tại chỗ, vì vậy +1.
Stephen Canon

1
@Rascher: Đúng vậy và ở đó bạn thấy ảnh hưởng của C đối với các nhà thiết kế CPU luôn chỉ định CPU ABI. Và nhiều giá trị trả về là thứ không xuất hiện ngay cả khi số lượng thanh ghi không phải là vấn đề (SPARC, PowerPC, Itanium)

13
Bí danh con trỏ trong C đã được xử lý bằng restrictC99 (10 năm trước!).

35

Câu hỏi hay. Tôi nghĩ ngôn ngữ thành công bằng cách tìm một thị trường ngách. Điều quan trọng cần lưu ý là có rất nhiều ngôn ngữ mới tốt hơn C trong các hốc của họ.

  • C đã từng được sử dụng rộng rãi như một ngôn ngữ ứng dụng và trong miền đó, nó đã dần mất đi nền tảng của C ++, Java và gần đây là tất cả các loại ngôn ngữ khác (đặc biệt là các ngôn ngữ động).

  • C từng là ngôn ngữ để viết mã máy chủ. Web đã đẩy một loạt các ngôn ngữ đáng kinh ngạc vào không gian đó - Perl, Java, Python, VBScript, VB.NET, Ruby, C # - và các trường hợp mà C tạo ra bất kỳ ý nghĩa nào cho mã máy chủ hiện nay rất ít.

  • C đã được sử dụng cho điện toán khoa học, nhưng nó phải đối mặt với sự cạnh tranh từ các ngôn ngữ dành riêng cho tên miền như Matlab và Mathematica, cũng như các thư viện như SciPy . Rất nhiều người viết mã trong phân khúc này không phải là lập trình viên bởi thương mại và C không phù hợp với họ.

Nhưng thích hợp của C là mã hệ thống. Hệ điều hành hạt nhân. Tài xế. Thư viện thời gian chạy. Nó được thiết lập trong không gian đó đến nỗi ngay cả C ++ cũng thay thế nó khá chậm.

C đã giành lại được vào những năm 1970 vì UNIX, vì các ngôn ngữ cạnh tranh quá hạn chế hoặc quá chậm và vì mã C được coi là di động hợp lý (nói dối, thậm chí sau đó). Nhưng những lợi thế lớn nhất của nó ngày nay không liên quan, và chủ yếu xuất phát từ hàng thập kỷ thống trị thị trường ngách của nó. Có các công cụ tốt cho C: tối ưu hóa trình biên dịch, trình gỡ lỗi kernel, phân tích tĩnh hiệu quả để tìm lỗi trong mã trình điều khiển, v.v. Hầu như mọi nền tảng chính đều định nghĩa C ABI và thường là ngôn ngữ chung cho các thư viện. Có một nhóm lập trình viên biết cách viết mã C - và những người biết vấn đề và cạm bẫy của C là gì.

Về lâu dài, thị trường ngách này sẽ không biến mất; và C có một số vấn đề. Nhưng nó vẫn sẽ cực kỳ khó khăn cho bất kỳ người mới nào để cạnh tranh.


9
C vẫn được sử dụng rộng rãi cho mã máy chủ. Không chỉ có Web, hầu hết các máy chủ DNS, email, v.v đều được viết bằng C. Ngay cả đối với Web, Apache cũng ở C.

@bortzmeyer: Apache khá cũ. Tôi không nói rằng nó không hữu ích hoặc đã được áp dụng, nó chỉ được tạo ra khi C là nó và không có nhiều lựa chọn thay thế tốt.
Macke

1
Tôi tò mò về lý do tại sao bạn coi C "không phù hợp" cho máy tính khoa học. Python được thừa nhận là dễ chịu hơn khi làm việc, nhưng tôi đã thấy C là một sự thay thế vững chắc khi cần mã nhanh hơn và nhiều lựa chọn thay thế có thể (C ++) không mang lại số tiền lớn hơn cho bảng, không giống như các khía cạnh khác của lập trình .
Fomite

1
Ngoài ra, số lượng nội dung trong SciPy / NumPy, v.v. được viết bằng C đã giúp ích cho việc biết.
Fomite

1
@EpiGrad Có lẽ C là một sự thay thế vững chắc cho bạn. Nhưng C có một đường cong học tập siêu dốc, đặc biệt là đối với những người không có nền tảng về mã hóa. Đặc biệt, đôi khi nó gặp sự cố và nếu bạn không phải là lập trình viên, bạn có rất ít hy vọng tìm ra nó. Mathematica làm cho một số lượng lớn những thứ dễ viết hơn và bạn kết thúc với ít mã hơn theo hệ số hàng trăm. Và nó không sụp đổ.
Jason Orendorff

25

Diễn giải một nhận xét rất hay: Không có nhiều cách khác nhau để làm cho ngôn ngữ nhanh và "gần với máy" - C đã làm tốt điều đó và hầu như không có chỗ để cải thiện điều đó.

Câu trả lời gốc:

Nhanh để thực hiện hay nhanh để viết công cụ trong?

Ngôn ngữ không nhanh hoặc chậm để thực thi, thực hiện cụ thể là. Một sự chậm trễ chỉ có thể được coi là nhanh hơn so với những người khác khi nó bằng cách nào đó làm cho việc triển khai nhanh dễ dàng hơn . Lúc nào cũng vậy, điều đó có nghĩa là "gần với máy". Nhưng với việc máy móc ngày càng nhanh hơn theo cấp số nhân, điều đó đã dần dần trở nên ít thú vị hơn theo thời gian. Thay vào đó, sự dễ dàng và tốc độ phát triển và tính di động đã trở nên quan trọng hơn nhiều, vì vậy "tốt hơn" đã trở thành có nghĩa là "tránh xa máy móc" . Khá nhiều nỗ lực trong thiết kế ngôn ngữ đã đi vào hướng đó trong 5 thập kỷ qua.

Vì vậy, có bạn: gần máy hơn và ngôn ngữ nhanh hơn C tồn tại; Họ là những người đến trước C : Assembler, Fortran. Có lẽ một số người quên.


@michael - nhưng vẫn có một thị trường cho lập trình siêu nhanh, siêu nhanh, đặc biệt là sự tấn công của tất cả các thiết bị di động này ... tại sao C vẫn là lựa chọn tốt nhất cho một số thiết bị này, ví dụ, tại sao không có thiết bị khác ngôn ngữ ở cấp độ đó, như .NET-vs-Python-esque?
Jason

5
Lisp. Ngủ gật nhưng không quên! :)

2
@Jason: Câu hỏi là, bạn cần bao nhiêu bộ lắp ráp di động? C nổi tiếng và rất khó để viết một ngôn ngữ với việc thực hiện nhanh hơn, vậy tại sao phải bận tâm? Nói một cách phù hợp, không có yêu cầu, không có thị trường, không có động lực.

4
@ Michael, xin lỗi vì đã bình luận về câu trả lời của bạn. Lý do có nhiều hơn trong địa hình của python / ruby ​​/ java, v.v. là một khi bạn ngừng cố gắng sử dụng ngôn ngữ hiệu quả nhất có thể, bạn sẽ có nhiều tùy chọn hơn về các tính năng ưu tiên và mọi cách tiếp cận có thể mang lại một ngôn ngữ mới. Có rất ít cách để viết ngôn ngữ nhanh nhất có thể.

1
-1 cho "và hầu như không có chỗ để cải thiện điều đó" - có rất nhiều chỗ để cải thiện C / C ++ mà không ảnh hưởng đến hiệu suất.
BlueRaja - Daniel Pflughoeft

21

Fortran nhanh hơn C đối với các tác vụ số do cách xử lý các tham chiếu bộ nhớ (Con trỏ C khó tối ưu hóa hơn). Các thư viện số nặng ở cơ sở của những thứ như Matlab và Numpy vẫn được viết bằng Fortran.

Mặt khác, C ++ có thể nhanh như C, nhưng có nhiều tính năng lập trình nâng cao hơn. Đó là một ngôn ngữ mới hơn nhiều, từ giữa những năm 80.


1
Và C ++ vẫn đang được cập nhật.
GManNickG

5
@GMan: C. cũng vậy


3
Chỉnh sửa cho tôi nếu tôi sai, nhưng restrictcon trỏ C99 có cùng ngữ nghĩa bí danh là Fortran không? Và có gì khác làm cho bất kỳ sự khác biệt?

9
Tôi nghĩ rằng ý tưởng rằng Fortran nhanh hơn C có phần hoang đường, tùy thuộc vào những gì được mã hóa và ai đang thực hiện nó. Lý do các thư viện số nặng ở Fortran không phải vì Fortran nhanh hơn, mà vì các thói quen ban đầu được mã hóa ở Fortran và rất ít người có thần kinh hoặc cần phải viết lại. Một số ít các bậc thầy toán học viết và bác sĩ thú y các thuật toán này rất vui ở Fortran và thấy không cần phải thay đổi, đặc biệt là khi họ tưởng tượng Fortran nhanh hơn.
Mike Dunlavey

16

Cái quái gì thế, tôi sẽ kêu gọi với 0,02 đô la của tôi.

Trong nhiều trường hợp, có một sự khác biệt thực sự hoặc cảm nhận giữa các ngôn ngữ "hệ thống" và ngôn ngữ cấp cao hơn. Tôi sẽ bỏ qua hầu hết các ngôn ngữ "cấp cao hơn", vì không ai (ít nhất là không nhiều) sẽ lập luận rằng đối với nhiều tác vụ, các ngôn ngữ như Python, Ruby, v.v ... đơn giản hơn để làm việc.

C được thiết kế để trở thành ngôn ngữ hệ thống, có nghĩa là nó được thiết kế là ngôn ngữ mà hệ điều hành Unix được viết. Như vậy, nó được thiết kế đơn giản, mạnh mẽ và nhanh chóng. Một ngôn ngữ đơn giản tăng sức mạnh bằng cách có nghĩa là những người không lập trình hệ thống thường coi nguy hiểm: con trỏ, quản lý bộ nhớ thủ công, v.v. Như đã đề cập, C khá đơn giản. K & R là cuốn sách nhỏ nhất trên kệ lập trình của tôi cho đến nay (không tính Tài liệu tham khảo bỏ túi của O'Reilly) và nó chỉ "lớn hơn" một chút so với Tài liệu tham khảo Ruby Pocket của tôi. C khá mạnh. Nếu bạn cần nói chuyện với phần cứng, hãy kiểm tra thủ công và xoay vòng với bộ nhớ, vv C có khả năng.

Tuy nhiên, từ quan điểm của một lập trình viên, C không đơn giản như vậy. Tốc độ và sức mạnh đi kèm với giá quản lý bộ nhớ thủ công và không có nhiều hỗ trợ OOP được tích hợp trong ngôn ngữ. C ++ (không phải ngôn ngữ yêu thích của tôi) đơn giản hơn nhiều từ góc độ của lập trình viên, nhưng đơn giản hơn nhiều so với quan điểm của nhà soạn nhạc. Objective-C (có thể là ngôn ngữ yêu thích của tôi) có cùng sự đánh đổi, với một chút nghiêng về hướng giữ cho ngôn ngữ đơn giản (ví dụ, bộ sưu tập rác là một người mới đến Objective-C). Nhưng vì thế giới điện toán như nhiều người trong chúng ta biết nó được viết bằng C, nên các ngôn ngữ mới hơn, phức tạp hơn nhưng "dễ dàng" hơn để có được sự chấp nhận rộng rãi.

Trong một số trường hợp, đặc biệt là khi "tiêu chuẩn" hiện tại "đủ tốt" như C, đơn giản là không có nhiều động lực cho thứ gì đó "tốt hơn" (C ++, Objective-C, D, v.v.) để đạt được lực kéo, khi có thậm chí là đủ khuyến khích để tạo ra một cái gì đó "tốt hơn".

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.