Các lựa chọn thay thế hiện đại có thể biên dịch được cho C / C ++ [đã đóng]


38

Tôi đang xem xét viết một sản phẩm phần mềm mới. Hiệu suất sẽ rất quan trọng, vì vậy tôi cảnh giác khi sử dụng một ngôn ngữ hoặc ngôn ngữ hoặc một ngôn ngữ sử dụng một lớp mô phỏng (đọc java).

Điều này dẫn đến tôi nghĩ đến việc sử dụng C (hoặc C ++) tuy nhiên cả hai đều khá dài trong răng. Tôi đã không sử dụng trong một thời gian dài. Tôi đã hình dung trong 20 năm qua, một người nào đó có lẽ đã tạo ra thứ gì đó khá phổ biến, rất hay để viết mã và biên dịch.

C có gì thay thế hiện đại hơn để viết mã biên dịch hiệu năng cao?

Nếu C ++ là một con thú khác so với 15 năm trước, tôi sẽ xem xét nó, tôi đoán tôi đã có một giả định rằng nó có một số vấn đề cố hữu.

Song song hóa sẽ rất quan trọng, nhưng có lẽ không phải trên nhiều máy.


21
C ++ hiện đại khác hoàn toàn so với C. Nó tương đương với một thứ như Java hay C # so với C, ngoại trừ tính năng phá hủy xác định thay vì thu gom rác và cũng có hành vi không xác định do nó không chạy trong VM hoặc được quản lý môi trường. Thay thế khác của bạn là D, một ngôn ngữ tốt, nhưng vẫn còn rất non nớt về thư viện và hỗ trợ.
Charles Salvia

11
Bạn có thể giải thích về phần "hiệu suất sẽ là quan trọng" không? Tại sao nó sẽ quan trọng? Bạn đã đo được gì chưa?
JesperE

3
15 năm là một thuật ngữ máy tính và miễn là, những người như Ericsson đã sử dụng các ngôn ngữ chức năng như Erlang để hỗ trợ các ứng dụng phân tán, chịu lỗi, thời gian thực mềm, không dừng trong các hệ thống nhúng của họ! Đừng cho rằng chỉ C ++ mới có thể mang lại cho bạn hiệu suất mà bạn muốn, tốt hơn hết là bạn nên giải quyết nhiều phần cứng hơn và tiết kiệm cho mình rất nhiều thời gian thực hiện với ngôn ngữ khác.
Đánh dấu gian hàng

5
@JeremyFbler: nhưng bạn đang đặt câu hỏi dựa trên giả định sai, hiệu suất đó => biên dịch tĩnh.
vartec

4
Đối với những gì nó có giá trị, Haskell hiện đóng vai trò thay thế cho C ++ của tôi trong hầu hết các trường hợp.
Jon Purdy

Câu trả lời:


54

Có một ngôn ngữ đang được phát triển gọi là Ngôn ngữ lập trình Rust theo đuổi các mục tiêu tương tự như C ++, đáng chú ý là trừu tượng chi phí bằng không và kiểm soát tốt việc quản lý bộ nhớ. Điều đó nói rằng, nó có lẽ là ứng cử viên sắp tới đáng chú ý nhất mặc dù vẫn còn rất trẻ.

Ngoài Rust, thực sự không có bất kỳ lựa chọn thay thế phổ biến nào khác biên dịch thành mã gốc. Tất nhiên cũng có Delphi và D, nhưng chúng không nhanh, phổ biến hay được sử dụng. Ngôn ngữ Go của Google có thể là một ứng cử viên, nhưng nó vẫn còn rất trẻ và nhắm đến một miền khác.

Tuy nhiên, xin lưu ý rằng C # (giả sử nền tảng Microsoft) và Java có thể không chậm đến mức mặc dù chúng chạy trên một máy ảo; việc biên dịch mã đúng lúc có thể thực hiện một số tối ưu hóa mà trình biên dịch trước thời gian truyền thống không có khả năng áp dụng do thiếu thông tin về trạng thái và môi trường của chương trình.

Thành thật mà nói, cá nhân tôi sẽ không coi C là ứng cử viên nếu C ++ là một lựa chọn, chủ yếu vì thực tế là C ++ hiện đại an toàn hơn, hoạt động ở mức độ trừu tượng cao hơn, biểu cảm hơn và thực tế không mất hiệu năng so với C (trong một số trường hợp C ++ nhanh hơn đáng kể). Nói một cách đơn giản, C ++ cung cấp mọi thứ mà C cung cấp và hơn thế nữa. Hầu hết các chức năng C được coi là "không dùng nữa" và các lựa chọn thay thế tốt hơn, an toàn hơn, nhanh hơn và trực quan hơn được cung cấp bởi thư viện chuẩn C ++.


5
Tôi không nói rằng chức năng C là "không dùng nữa", theo nghĩa chính thức - chỉ là gần như không có lý do nào để sử dụng các chức năng thư viện C, con trỏ thô hoặc mảng C trong C ++.
Charles Salvia

20
+1 để nói chuyện với giả định 'biên dịch là bắt buộc đối với giả định hiệu suất'.
Telastyn

3
@gbjbaanb cố gắng biên dịch với Visual Studio và với MinGW trong Windows và chúc may mắn với điều đó: | cũng cố gắng thuyết phục một người cung cấp cho bạn một thư viện được biên dịch bằng một trong những công cụ này mà không biết gì về ABIs rằng anh ta sai và anh ta nên cung cấp cho bạn nguồn của thư viện đó hoặc tìm hiểu cách biên dịch lại và cung cấp thông số kỹ thuật phù hợp . sự kinh hoàng, đôi khi.
dùng827992

5
@paxRoman: bạn có thể viết các chương trình nhỏ bằng C ++ và viết chúng an toàn hơn bạn có thể trong C.
kevin cline

3
@JBRWilkinson Theo như tôi biết, mức độ phổ biến của Objective-C không tồn tại bên ngoài nền tảng của Apple.
zxcdw

19

Ngoài ra còn có Ada , mà biên dịch mã nguồn gốc, và là di động trên nền tảng khác nhau trong giới hạn của thư viện tiêu chuẩn của nó. Ngôn ngữ này vẫn còn sống và tốt, với bản cập nhật tiêu chuẩn ngôn ngữ gần đây nhất hiện đang được thực hiện (được gọi là Ada 2012).

Tóm tắt nhanh cho những người không quen thuộc với Ada:

  • Đánh máy mạnh
  • Hỗ trợ tích hợp cho đồng thời
  • Hướng đối tượng hoặc thủ tục, tùy thuộc vào yêu cầu của bạn
  • Được hỗ trợ bởi GNU toolchain (GCC chứa Ada frontend)
  • Cũng tuyệt vời để phát triển phần mềm, tức là khi bạn cần giao tiếp trực tiếp với phần cứng
  • Hỗ trợ lập trình chung (gói chung, thủ tục, chức năng)
  • Các tính năng hỗ trợ phát triển phần mềm quy mô lớn (gói, gói con, biên dịch riêng biệt, phân biệt nghiêm ngặt giữa đặc tả và triển khai)

1
Không đề cập đến Nhiệm vụ Ada (Song song!)
NWS

6
+1: Tôi đã cố gắng học một số Ada và tôi nghĩ đó là một ngôn ngữ rất mạnh mẽ và sạch sẽ. Thật đáng tiếc rằng không có nhiều công việc như các ngôn ngữ lập trình khác.
Giorgio

3
Được đề cập tốt, tôi đang tìm kiếm một cái gì đó 'hiện đại' hơn nhưng tôi đã quên mất Ada
Jeremy French

4
@Jeremy Tiếng Pháp: Bạn đang tìm kiếm những tính năng nào trong ngôn ngữ 'hiện đại' hơn mà Ada không cung cấp?
Giorgio

17

Nếu C ++ là một con thú khác so với 15 năm trước, tôi sẽ xem xét nó, tôi đoán tôi đã có một giả định rằng nó có một số vấn đề cố hữu.

15 năm trước, không có tiêu chuẩn C ++. Cuốn thứ hai đã được xuất bản năm ngoái. Các thực tiễn tốt nhất của C ++ đã thay đổi rất nhiều trong 5 năm sau khi công bố tiêu chuẩn 98, và chúng đang thay đổi một lần nữa với việc công bố 11.


12

Tại sao mọi người luôn khăng khăng tìm kiếm ngôn ngữ mới?

C ++:

  • Là ngôn ngữ số 4 của TIOBE, nhưng vượt qua mọi đối thủ nếu kết hợp với C
  • Có rất nhiều khung
  • Rất dễ mã hóa
  • Rất dễ điều chỉnh
  • Rất biểu diễn
  • Rất an toàn
  • Có một sự hỗ trợ công nghiệp rất tốt
  • Là nền tảng chéo
  • Không cần thêm VM / Framework / triển khai lộn xộn nếu được thực hiện đúng
  • Sẽ dễ dàng cho bạn một công việc
  • Có tất cả những thứ cần thiết để xây dựng .so / đậm để khởi chạy trên các hệ thống rất cũ
  • Dễ dàng khắc phục sự cố
  • Rât đăt
  • Rất năng động
  • và nhiều thứ thú vị khác

Nhược điểm duy nhất của C ++ là bạn phải học một chút. Đó là nó.

So sánh với các ngôn ngữ khác là một hoặc nhiều:

  • Được hỗ trợ hẹp (OCML, Fortran, ...)
  • Chậm (Java, Javascript)
  • Thử nghiệm (Silverlight)
  • Một mục tiêu di động (.NET 1/2/3/4/5? Cái nào là mục tiêu cuối cùng bây giờ?)
  • Nền tảng bị khóa (.NET)
  • Có khung hỗ trợ kém (Fortran)
  • Có cộng đồng nhỏ (bất cứ điều gì ngoài top 10)
  • Là cơn ác mộng để khắc phục sự cố (Bất cứ điều gì với các khái niệm và công cụ chống lừa đảo cấp cao)
  • Cần 500MB tiền đặt trước trên máy khách hàng (JVM / .NETVM)

IMHO, càng ít ngôn ngữ chúng tôi sẽ sử dụng và hỗ trợ, tình hình sẽ càng tốt hơn.

Điều này gây ra các cải tiến tự động về khung cho ngôn ngữ, hỗ trợ, tài liệu, ủy ban tiêu chuẩn hóa, sách tốt hơn, kiến ​​thức hơn, phần mềm hỗ trợ dễ dàng hơn, mô hình tốt hơn, chu kỳ hỗ trợ ngôn ngữ dài hơn và mã kỹ năng được viết bằng ngôn ngữ.

Tôi biết mọi người sẽ đánh giá thấp điều này, nhưng thực sự nghĩ về nó.


71
Xin lỗi, C ++ rất dễ viết mã trong, thật sai lầm, xin lỗi. Đó là một ngôn ngữ cực kỳ khó học và ngay cả khi bạn sử dụng các thành ngữ và con trỏ eschew hiện đại, bạn sẽ phải đối mặt với hàng tấn trình biên dịch khó hiểu và lỗi thời gian chạy trước khi hiểu rõ về nó. Và ngay cả sau khi bạn đã thành thạo nó, cú pháp vẫn xuất hiện khá thường xuyên. Safe C ++ thường sử dụng một mớ hỗn độn các mẫu lồng nhau tạo ra số lượng lớn mã soạn sẵn.
Konrad Rudolph

20
Rất biểu cảm và rất năng động không giống như các đặc điểm C ++ điển hình, so với các ngôn ngữ động.
vartec

29
@gbjbaanbvà khó học hơn một chút, một lần nữa, lại lố bịch. Lấy làm tiếc. Tôi đã lập trình tất cả các ngôn ngữ đó trong nhiều năm, tôi rõ ràng thích C ++ (và thực hiện lập trình nghiêm túc nhất trong đó) nhưng nói rằng nó dễ dàng chỉ là hoàn toàn sai lệch. Và tôi không nói về công cụ siêu lập trình ưa thích, tôi đang nói về các lỗi trình biên dịch được tạo ra bởi mã run-of-the-mill, gây ra bởi ẩn tên, ADL, constcác vấn đề chính xác và những thứ tương tự. Bất cứ ai đã đọc C ++ hiệu quả (như Coder tuyên bố là có) và cho rằng C ++ rất dễ bị mất kết nối về mặt tinh thần.
Konrad Rudolph

13
@gbjbaanb Tôi là lập trình viên C ++. Một lần nữa, tôi không nghĩ C ++ là dễ dàng. Và chủ đề bình luận này cũng có một số cau mày từ trò chuyện C ++. Vì vậy, nó không phải là điều đó. Và sự khác biệt giữa gotchas C ++ và gotchas ngôn ngữ khác là nếu bạn không biết về chúng trong các ngôn ngữ khác, có lẽ bạn sẽ ổn. Trong C ++, bạn nướng bánh mì. Và ngay cả khi bạn biết về chúng, bạn vẫn có thể nhận được một số trang màn hình lỗi biên dịch cho một lỗi duy nhất (đã xảy ra với tôi ngày hôm nay). Và mặc dù lỗi rất đơn giản để sửa (một lỗi đánh máy), nhưng cần có thời gian để phân tích tất cả những điều đó.
Konrad Rudolph

6
Khi nào một ngôn ngữ phổ biến bao giờ là tốt? PHP rất phổ biến và không có người nghiêm túc nào nghĩ rằng đó là một ngôn ngữ "tốt", ngay cả đối với lĩnh vực của nó. Điều "tốt" duy nhất về các ngôn ngữ phổ biến là có rất nhiều thư viện để làm cho các miền nhất định dễ lập trình hơn. Bản thân C ++ cũng đầy sự thất vọng.
weberc2

11

C / C ++ khá dài trong răng .... đây là một điều tốt . Nó ngụ ý rằng chúng được thiết kế đủ tốt (ahem) mà chúng vẫn rất hữu dụng, nhiều người sử dụng chúng cho các công việc hàng ngày, và bạn sẽ thấy một khối lượng lớn các nhà phát triển là những chuyên gia trong đó. Trưởng thành là một cái gì đó để được trân trọng.

Nếu bạn dành tất cả thời gian để tìm kiếm một cái gì đó mới, chỉ vì nó mới và do đó phải tốt hơn bằng cách nào đó, bạn sẽ thất vọng rất nhiều. Điều này áp dụng cho ngôn ngữ phần mềm, hệ thống GUI (ghi chú, Microsoft và Gnome) và những người yêu thích (lưu ý, các cô gái trẻ :))

Bây giờ phải thừa nhận, nếu kinh nghiệm về C ++ của bạn đã 20 tuổi, khi mã C ++ thường được mã hóa như C, thì có lẽ đã đến lúc đánh giá lại ngôn ngữ, tất cả các tính năng có trong ngày chưa bao giờ được sử dụng đều được sử dụng ngày nay nhiều hơn, và một vài nỗ lực tiêu chuẩn hóa đã mở rộng ngôn ngữ một chút để làm cho nó xuất hiện khác nhiều so với những phát triển kiểu C cũ. Không phải C cũng tệ - đó là một ngôn ngữ hoàn hảo cho nhiều loại nhiệm vụ mã hóa!


16
Tôi nghĩ rằng C và C ++ minh họa cho nhận xét của Hoare về thiết kế phần mềm: hoặc làm cho nó trở nên đơn giản, rõ ràng là không có thiếu sót, hoặc làm cho nó quá phức tạp, không có thiếu sót rõ ràng.
TMN

1
Làm thế nào các lỗ hổng bảo mật lặp đi lặp lại do một số dạng bộ đệm khai thác một "điều tốt", bất kể ngôn ngữ cũ hay cố thủ là bao nhiêu? Và, điều này có thực sự khác với việc tiếp tục tranh cãi về một cuộc hôn nhân đã được thiết lập sau khi lạm dụng nhiều lần?
dùng2864740

@ user2864740 những gì bạn đề nghị là ly hôn vì vợ đã già và bạn muốn một mô hình mới, thú vị ... Tôi nói bạn gắn bó với những gì bạn có bởi vì bạn biết những điều sai trái và những điều kỳ quặc. Có bao nhiêu ngôn ngữ mới, thú vị, giải quyết các vấn đề như tràn bộ đệm và sau đó hóa ra có các cách tràn bộ đệm tinh tế? Vì vậy, những gì tốt hơn - tràn mà bạn có thể tránh bằng cách không lười biếng hoặc sử dụng đúng cấu trúc, hoặc cái mà bạn rơi vào vì bạn không biết là có?
gbjbaanb

@gbjbaanb Không, tôi chưa bao giờ nói thế. Tôi đã vẽ một simile đặc biệt là thiệt hại do không cải thiện bối cảnh của tình huống. Tôi thường khá lý trí và không thiên về "fanboi" lựa chọn các chủ đề hoặc công cụ xu hướng (đây chỉ là bản chất của tôi). Hơn nữa, C và C ++ là các ngôn ngữ khác nhau; Tuy nhiên, cả hai đều được biện minh cho cùng một lý do. Và đó vấn đề với như vậy.
dùng2864740 ngày

8

Tiêu chuẩn hiện tại của C ++ là C ++ 11 , được xuất bản vào năm 2011. Vì vậy, nó không phải là tiêu chuẩn 20 năm tuổi. Và đã có rất nhiều tiêu chuẩn ở giữa. Mỗi người trong số họ giới thiệu nhiều cải tiến hiệu suất.

Trình biên dịch cũng đã được cải tiến liên tục. Họ tốt hơn nhiều trong việc tối ưu hóa, hơn trước đây.

Các định dạng thực thi cũng đã được cải thiện, 20 năm trước bạn đã có a.out , bây giờ bạn có ELF .

Nhìn chung, đề xuất rằng C ++ không thay đổi trong 20 năm không thể là sự thật.

Ngoài ra, hãy nhớ rằng C và C ++ là những ngôn ngữ rất khác nhau.


2
Giả định của tôi là thứ gì đó được hình thành lần đầu tiên cách đây 20 năm sẽ có những hạn chế về kiến ​​trúc vốn có, chỉ có thể được cải thiện với một bản trống. Tôi nghĩ rằng giả định này có thể đã sai.
Jeremy Pháp

4
@JeremyFbler: Giống như kiến ​​trúc x86?
TMN

2
@TMN là chứng minh hay bác bỏ giả định của tôi?
Jeremy Pháp

6
Kiến trúc x86 ban đầu là một sự thỏa hiệp khó chịu giữa khả năng tương thích ngược với 8080 và một bộ tính năng để cạnh tranh với 68000 và NS32032. Bộ nhớ được phân đoạn (với các con trỏ "xa" và "gần"), chỉ có 4 thanh ghi mục đích chung, mã hóa lệnh có độ dài thay đổi, hơn 50 hương vị của lệnh JMP, một bus hệ thống ba trạng thái đa kênh ... Và ngày nay, cũng vậy thiết kế cơ bản đang trở nên mạnh mẽ hơn bao giờ hết, sau khi nhiều thiết kế đá phiến "ưu việt" (Alpha, MIPS, PowerPC) không thể thay thế nó.
TMN

1
@JeremyFbler không, giả định của bạn không sai, ít nhất là trong trường hợp của C ++. Các tính năng của C ++ 11 chắc chắn rất hữu ích; tuy nhiên, tại thời điểm này, họ chỉ là những thứ tào lao hơn trên đống rác. Họ cố gắng xây dựng các tính năng của các ngôn ngữ hiện đại, nhưng để đối phó với mớ hỗn độn C ++ hiện có, họ phải có ngoại lệ và những ngoại lệ đó sẽ có ngoại lệ, v.v.
weberc2

6

Tôi không phải là một chuyên gia lớn về ngôn ngữ này, nhưng tôi nghĩ OCaml có thể là một lựa chọn thú vị để xem xét.

OCaml là một ngôn ngữ được biên dịch, chức năng / hướng đối tượng. Để so sánh hiệu suất với C ++, hãy xem C ++ so với OCaml: Ray tracer so sánh . Tất nhiên, đây là một ví dụ rất cụ thể và người ta nên thử nghiệm rộng hơn để có cảm giác tốt hơn về hiệu suất của OCaml.


Downvoter có thể cho một gợi ý về cách cải thiện câu trả lời này không? Cảm ơn.
Giorgio

3

Phụ thuộc vào những gì sản phẩm của bạn sẽ làm. Nếu hiệu suất thực sự quan trọng, thì ngôn ngữ được lựa chọn vẫnFORTRAN . Tôi cũng sẽ không loại trừ Java - nó được sử dụng trong nhiều ứng dụng giao dịch tài chính khối lượng lớn. Erlang đáng để xem nếu miền vấn đề của bạn yêu cầu đồng thời cao. Objective-C rất tuyệt, mặc dù tôi không biết nó được hỗ trợ tốt như thế nào ngoài hệ sinh thái Apple (ngoài trình biên dịch và thời gian chạy cơ bản). Tôi cũng đã nghe những điều tốt về hiệu suất của Haskell, nhưng tôi không chắc đó là hiệu suất tuyệt đối hay chỉ là hiệu suất so với các ngôn ngữ chức năng khác.


2
mọi công việc tài chính mà tôi đã xem đều muốn các nhà phát triển C / C ++, không phải Java. Từ kinh nghiệm với Java, tôi không thể thấy bất kỳ hiệu năng cao nào trừ khi bạn ném hàng loạt phần cứng vào nó.
gbjbaanb

Có rất nhiều hệ thống giao dịch Java đang hoạt động trên Phố Wall và tại các ngân hàng đầu tư khác nhau ở Hoa Kỳ và Vương quốc Anh. Nó cũng được sử dụng khá nhiều tại Sàn giao dịch Chicago Mercantile.
TMN

3

Khi bạn nói dự án của bạn nhạy cảm với hiệu năng, bạn có nghĩa là mỗi dòng mã của nó? Hoặc, giống như bình thường, có một tỷ lệ nhỏ hơn là hiệu suất quan trọng trong khi phần còn lại là hoạt động bình thường của mã doanh nghiệp?

Sau khi bạn trả lời điều đó, rủi ro lớn hơn cho dự án của bạn là gì: rằng kết quả cuối cùng quá chậm, hoặc bạn không bao giờ hoàn thành nó ngay từ đầu?

Giả sử bạn trả lời câu hỏi thứ hai cho cả hai, bạn nên phát triển bằng ngôn ngữ cấp cao hơn hỗ trợ interop gốc (Python, Ruby, .Net Family đều có điều này). Đầu tiên, kết thúc dự án. Sau đó hồ sơ, tối ưu hóa, rửa sạch, lặp lại. Chỉ sau đó, hãy xem xét yêu cầu phân khúc lựa chọn ứng dụng của bạn trong mã gốc và tích hợp mã gốc đó với sản phẩm hoàn chỉnh của bạn.


Khi đã là Java, bạn không thể cứu vãn nó nếu quá chậm.
Coder

6
@Coder Java có FFI (JNI) cho phép bạn 'phá hoại' bằng ngôn ngữ bạn chọn. Vì vậy, nếu bạn đã thiết kế các giao diện tốt, bạn có thể thay thế một triển khai Java bằng một giao diện gốc. Nền tảng Java được suy nghĩ tốt.
K.Steff

1

Vala tương tự như Java và C #, biên dịch thành mã gốc (hoặc mã nguồn C nếu bạn thích) và rất nhanh . Nó yêu cầu GLib cho các bit hướng đối tượng của nó và được viết bởi các tin tặc Linux cho các tin tặc Linux, vì vậy nếu tên miền của bạn là Windows thì có thể không tốt lắm.


1

Objective-C là hiện đại, được biên dịch thay thế cho C và C ++ thẳng. Nó có cả quản lý bộ nhớ xác định và thu thập rác và thời gian chạy OO truyền thông điệp đã được tối ưu hóa cho hiệu suất.

Nó có sẵn thông qua GCC và CLang và có các thư viện ứng dụng như GNUStep và Cocotron hoạt động trên nhiều nền tảng khác nhau.

Nếu bạn đang làm công việc hiệu suất cao, tôi sẽ giả sử đó là công việc phân chia số hoặc công việc phân chia khác thay vì UI, vì vậy điều đó có nghĩa là bạn có thể thực hiện UI bằng bất kỳ ngôn ngữ nào dễ nhất đối với bạn, ví dụ: HTML thông qua một máy chủ http nhỏ.


0

Tôi chưa bao giờ sử dụng nó, nhưng một người bạn của Cython đã cho phép bạn sử dụng các nguyên hàm kiểu C trong việc thực hiện các phần quan trọng của mã trong khi vẫn giữ cú pháp python chung và có thể tận dụng tối đa các cấu trúc cấp cao hơn của pythons để giảm sự phát triển thời gian ở mọi nơi khác

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.