Có một ngôn ngữ giữa C và C ++?


18

Tôi thực sự thích bản chất đơn giản và minh bạch của C: khi tôi viết mã C, tôi cảm thấy không bị cản trở bởi "sự trừu tượng bị rò rỉ" và hầu như luôn có thể đoán được một cách thông minh về tổ hợp tôi đang sản xuất. Tôi cũng thích cú pháp đơn giản, quen thuộc cho C.

Tuy nhiên, C không có những hình tượng trưng đơn giản, hữu ích mà C ++ cung cấp như các lớp, xử lý phi chuỗi đơn giản hóa, v.v. Tôi biết rằng tất cả đều có thể thực hiện trong C bằng cách sử dụng các bảng nhảy và tương tự, nhưng đôi khi hơi khó hiểu và không an toàn cho nhiều loại vì nhiều lý do.

Mặc dù vậy, tôi không phải là người hâm mộ quá tập trung vào các đối tượng trong C ++ và tôi rất ngại người điều hành 'mới' và những thứ tương tự. C ++ dường như chỉ có quá nhiều trục trặc, ví dụ, được sử dụng làm ngôn ngữ lập trình hệ thống.

Có tồn tại một ngôn ngữ nằm giữa C và C ++ trên quy mô của các widget và hình tượng trưng không?

Tuyên bố miễn trừ trách nhiệm: Tôi muốn nói đây hoàn toàn là một câu hỏi thực tế. Tôi không có ý định chọc giận bạn vì tôi không chia sẻ quan điểm của bạn rằng C {, ++} đủ tốt để làm bất cứ điều gì tôi dự định.


10
Bạn nói rằng câu hỏi của bạn là "hoàn toàn thực tế", nhưng bạn đang giảm giá c ++ vì nó "dường như" có quá nhiều trục trặc. Những trục trặc này là gì và chúng có phải là lý do hợp lệ để giảm giá c ++ không?
whatsisname

2
'Quy mô của các vật dụng và hình tượng trưng' là gì? Nếu bạn muốn câu trả lời thực sự cho một câu hỏi "hoàn toàn thực tế", bạn nên tránh các số liệu vô nghĩa.
Caleb

2
Và một vài điều bạn nói về C ++ phản bội một số thông tin sai lệch. newchủ yếu là một tăng cường-up malloccó thể cũng chăm sóc khởi tạo bộ nhớ cho bạn. Với "vị trí mới" và operator new, bạn có thể quyết định cách thức và nơi phân bổ bộ nhớ. Và như để nhấn mạnh đối tượng: Một vài dòng trên bạn nói rằng bạn coi các lớp là "hình tượng trưng đơn giản, hữu ích". Làm cho tâm trí của bạn!

25
Sử dụng C+ Diclaimer: Xin lỗi, tôi không thể t resist. Itlà ngày 1 tháng 4;)
knut

2
Điều này nghe có vẻ rất khủng khiếp giống như giả thuyết liên tục, và có lẽ với cùng một câu trả lời. ( vi.wikipedia.org/wiki/Continuum_hypothesis )
John Smith

Câu trả lời:


29

Đây có thể là những droid bạn đang tìm kiếm ...

Đi - http://golang.org/

D - http://dlang.org/

Rust - http://rust-lang.org/


5
@dtech: D có GC vô nghĩa / "Mọi thứ thừa hưởng từ Object" / Giá trị phải hút crappery. Tôi đã có C # cho điều đó và nó thực sự có các công cụ tốt. Đi, tôi thừa nhận rằng bộ nhớ của tôi về lý do tại sao tôi loại bỏ nó là hơi mơ hồ, nhưng khi tôi nhớ lại, nó cắt giảm một số tính năng rất hữu ích.
DeadMG

4
-1 cho "những gì C ++ nên có". C ++ là chính nó và nếu bạn không thể xử lý nó, đó phần lớn là vấn đề của bạn. Bạn có thể đối phó với nó bằng cách sử dụng một ngôn ngữ phù hợp với bạn hơn, nhưng điều đó không có nghĩa là C ++ nên giống như ngôn ngữ đó.
back2dos

7
@DeadMG Trên D, bạn đã đưa ra 2 tuyên bố có ý nghĩa: GC là bắt buộc và mọi thứ phải là một đối tượng. Cả hai đều sai. Nó khiến tôi nghĩ rằng kết luận của bạn dựa trên sự thiếu hiểu biết hơn là kiến ​​thức thực tế. Tôi phải đồng ý với CodexArcanum.
deadalnix

5
@deadalnix: Về mặt kỹ thuật, bạn có thể chọn không sử dụng GC. Nhưng vì bạn không có cách nào để biết hoặc kiểm soát các chức năng thư viện hoặc các tính năng ngôn ngữ sử dụng GC, nên thực tế không có cách nào để tạo ra một chương trình không sử dụng nó. Và bạn không thể tạo một lớp không kế thừa từ Object. Và các structgiá trị của chúng được so sánh nghiêm túc so với các giá trị C ++ - chẳng hạn như không có sự kế thừa, không có tham chiếu giá trị, vì vậy không thể tạo ra thứ gì đó đơn giản như một lớp chuỗi giá trị trong D có hiệu quả tương đương với C ++. Đó là những sự thật về ngôn ngữ D.
DeadMG

5
@DeadMG: Tạo các cấu trúc không có sự kế thừa là một tính năng , không phải là "gimping". Đó là điều họ đã đúng, một điều mà hầu hết mọi ngôn ngữ OO trong lịch sử không có tên là "C ++" đều đúng (bao gồm Simula, ngôn ngữ OO gốc) và C ++ đã sai rất nhiều. Kế thừa và các loại giá trị không trộn lẫn. Nó phá vỡ danh tính đối tượng, nó phá vỡ Liskov Thay thế, nó phá vỡ toàn bộ mô hình OO.
Mason Wheeler

19

Có khá nhiều ngôn ngữ (ví dụ: Java, Go, D, Objective-C) gần như song song với C ++ hoặc cố gắng khắc phục các sự cố mà các tác giả đã thấy với C ++.

Ít nhất IMO, tuy nhiên, tất cả chúng đều hoạt động kém hơn C ++ cho hầu hết các mục đích thực tế.

Thật không may, dựa trên sở thích rõ ràng của bạn để biết mã lắp ráp nào sẽ được tạo ra, có lẽ chúng ta có thể loại trừ Objective C và Java ngay lập tức.

Về mặt lý thuyết, tôi coi Go là điều thú vị nhất trong số này - nó có một số ý tưởng thực sự độc đáo và cách tiếp cận thú vị để giải quyết các vấn đề giúp một số loại mã dễ dàng hơn nhiều. Thật không may, các trình biên dịch hiện tại không tạo ra mã rất tốt và đã không có nhiều cải tiến về vấn đề đó trong vài năm qua.

Điều đó khá nhiều khiến D là người duy nhất có cơ hội. Nó có lẽ giống với C ++ (trong số này), nhưng cũng ít có khả năng nhất (IMO) để khắc phục những gì bạn dường như coi là có vấn đề.

Điều đó để lại một cách tiếp cận rõ ràng: sử dụng C ++, nhưng chỉ sử dụng những phần bạn muốn và tránh những phần bạn không thích.


13
+1 cho "sử dụng C ++ và tránh những phần bạn không thích". Và tôi sẽ đề nghị với OP tìm hiểu thêm về C ++, mọi người thường từ chối mọi thứ chỉ vì họ không biết rõ về chúng.
Doc Brown

1
@DocBrown Có lẽ vì không dễ để biết C ++ đủ tốt.
Malcolm

3
@Malcolm: dĩ nhiên khó học sâu C ++ hiện đại. Nhưng mặt khác, hoàn toàn không có lý do gì để "ngượng ngùng với người điều hành mới", điều đó nghe có vẻ mê tín đối với tôi.
Doc Brown

3
@Malcolm: Có lẽ vì khái niệm này rất đơn giản . Tôi có cần một chuỗi ký tự UTF-32 hoặc một chuỗi ký tự UTF-16 không? Chà, đó là một câu hỏi khá dễ trả lời, giả sử rằng bạn biết những điều cơ bản của mã hóa chuỗi wtf. Và vô số các tính năng cứng? Chúng tồn tại vì một lý do . Ví dụ, tổng quát của Java. Chúng thật thảm hại so với các mẫu. Chắc chắn, có ít thứ để học, nhưng điều đó đơn giản là vì chúng không hữu dụng lắm. Nó giống như gọi bất cứ điều gì phức tạp hơn Brainfuck khó khăn.
DeadMG

3
@Malcolm: Điều đó không đúng chút nào. Mức độ phổ biến bị ảnh hưởng bởi 99999 điều ngoài việc ngôn ngữ có tốt / hữu ích hay không.
DeadMG

16

Tuy nhiên, C không có những hình tượng trưng đơn giản, hữu ích mà C ++ cung cấp như các lớp, xử lý phi chuỗi đơn giản hóa, v.v. Tôi biết rằng tất cả đều có thể thực hiện trong C bằng cách sử dụng các bảng nhảy và tương tự, nhưng đôi khi hơi khó hiểu và không an toàn cho nhiều loại vì nhiều lý do.

Mặc dù vậy, tôi không phải là người hâm mộ quá tập trung vào các đối tượng trong C ++ và tôi rất ngại người điều hành 'mới' và những thứ tương tự.

Xin lỗi, bạn thân, báo động mâu thuẫn. Xử lý phi dây yêu cầu new . Đó là một điều cần thiết cơ bản. Bạn không thể có std::stringmà không có new. Và hơn nữa, new/ deletechính xác tương đương với malloc/ freenhưng an toàn hơn , bởi vì nó đảm bảo việc xây dựng và phá hủy chính xác các đối tượng heap (hoàn toàn cần thiết!) Và sử dụng xử lý ngoại lệ thay vì NULLtrả lại, và do đó vượt trội hơn mọi thời trang có thể tưởng tượng được. Trong C ++ 11, rất có thể viết newhàm kiểu riêng của bạn , bởi vì chuyển tiếp hoàn hảo cho phép bạn xử lý bất kỳ hàm tạo nào thuộc bất kỳ loại nào. Nếu bạn ngại ngùng với súng new, thì tôi khuyên bạn đơn giản là không thực sự biết bạn đang làm gì.

Ồ, vâng, và con trỏ thông minh làm cho nó để bạn không bao giờ phải thực sự đối phó với bất kỳ điều này.

Hơn nữa, trong C ++ không có sự nhấn mạnh quá mức. Bạn không phải sử dụng bất kỳ đối tượng nào bạn không muốn. Bạn có thể lập trình chức năng với lambdas và bất cứ lúc nào bạn muốn. Không ai bắt buộc bạn sử dụng tính kế thừa và các hàm ảo - thực tế, nhiều chương trình C ++ tốt hiếm khi thể hiện tính kế thừa. Mẫu là kỹ thuật trừu tượng mạnh mẽ hơn và hữu ích hơn. Đây không phải là Java.


1
Tôi đồng ý. Sử dụng C ++ theo cách bạn muốn sẽ tốt hơn nhiều so với tìm kiếm một giải pháp thay thế (có thể kém hơn)
dtech

1
Tôi không nghĩ rằng lambdas là đủ để lập trình chức năng. Tôi cũng mong đợi có một toán tử thành phần chức năng, currying, và như vậy. Xem thêm stackoverflow.com/questions/1981400/feftal-programming-in-c . Đối với tôi cảm giác giống như làm OOP trong C ...
Giorgio

@Giorgio: Câu trả lời của câu hỏi đó chỉ cần nói "Thật khó!". Họ không đưa ra bất kỳ bằng chứng nào cho thấy nó thực sự khó khăn . Tại sao bạn muốn một toán tử riêng cho thành phần chức năng? f(g(x))dường như chỉ làm việc tốt cho tôi Và tôi cũng tin rằng currying có thể được thực hiện như một thư viện nói chung trong C ++ 11.
DeadMG

1
@DeadMG: Một toán tử thành phần chức năng là một khái niệm cơ bản, được thiết lập khá tốt trong lập trình chức năng. Tôi hy vọng sẽ tìm thấy nó trong một ngôn ngữ hỗ trợ FP. Tôi thấy rất thuận tiện (ngắn gọn) để định nghĩa một hàm phức tạp là thành phần của các hàm khác (ví dụ như bạn làm với các đường ống trong Unix) mà không sử dụng các biến: k = h. g. f
Giorgio

1
@Giorgio: std::bindhỗ trợ những thứ như vậy.
DeadMG

4

C gần như là một tập hợp con của C ++, vì vậy bạn chỉ có thể sử dụng các phần của C ++ mà bạn thích và bỏ qua phần còn lại. Thậm chí có thể viết C hợp lệ cũng là C ++ hợp lệ.

Bạn sẽ không viết C ++ thành ngữ, nhưng đó là về "giữa" như nó được.

Ngoài ra, bạn có thể kiểm tra các ngôn ngữ khác cố gắng mở rộng C theo hướng mạnh hơn, đặc biệt là D và Objective-C.

Và cuối cùng, tùy thuộc vào bản chất của dự án, bạn có thể thực hiện một cách tiếp cận đa âm: chia dự án của bạn thành các mô-đun và chọn ngôn ngữ phù hợp nhất cho từng phần. Nhược điểm của việc này là bạn cần phải có các ngôn ngữ để làm việc cùng nhau, điều này có thể là quá nhiều công việc để có giá trị nỗ lực.


Thật vậy, làm việc trong các ngành như phát triển game console, nơi chúng tôi thực sự muốn "một ngôn ngữ ở giữa C và C ++", đó chính xác là những gì chúng tôi đã làm. Chúng tôi đã sử dụng một tập hợp con của chức năng C ++, với một số thứ vượt quá giới hạn hoặc nhiều khả năng là ngoài giới hạn trong các vòng lặp quan trọng về hiệu năng.
Carson63000

3

Chỉ cần đưa ra một câu trả lời hoang dã, vượt trội: nếu ngôn ngữ bạn muốn không tồn tại, tại sao bạn không tự tạo ra một ngôn ngữ? Có rất nhiều công cụ phát triển ngôn ngữ mạnh mẽ ngoài kia, ngay dưới các bản dựng cũ của (F) Lex và Yacc / Bison. Vì bạn đã biết C, bạn chỉ cần "trình biên dịch" để xuất mã C, sau đó bạn sử dụng chuỗi công cụ hiện có của mình.

Điều này có thể vừa đơn giản vừa mạnh mẽ hơn bạn nghĩ. Bắt đầu với trình phân tích cú pháp / lexer cho C, sau đó thêm các tính năng bổ sung mà bạn cho là quan trọng. Nếu các bảng nhảy gây khó chịu khi viết bằng tay, hãy tìm ra một cấu trúc để thể hiện sự trừu tượng và để cho trình thông dịch của bạn viết chúng cho bạn. Về cơ bản, đây chỉ là một siêu lập trình tiền xử lý cấp cao hơn, sử dụng các công cụ bên ngoài để thực hiện siêu lập trình. Bạn sẽ luôn biết chính xác phần lắp ráp cuối cùng sẽ như thế nào kể từ khi bạn biết C và bạn biết phần mở rộng ngôn ngữ của C sẽ mở rộng thành gì.

Rõ ràng có một số hạn chế về hiệu quả của việc này mà không cần phải làm thêm. Thêm một hệ thống kiểu tĩnh đầy đủ có thể phức tạp hơn bạn muốn vào, nhưng đó là một tùy chọn bạn có thể khám phá nếu bạn thấy bạn có sở thích về nó. Các tiện ích mở rộng DSL của bạn mạnh mẽ và phức tạp như bạn có thời gian và năng lượng để tạo ra chúng, và ai biết được, có thể một ngày nào đó, ngôn ngữ mở rộng của bạn sẽ trở thành "C ++ tiếp theo".


2

Bạn chưa nói những gì các tính năng C ++ gây phiền nhiễu cho bạn. dù sao bạn cũng có thể thử Objective-C. Nó nhấn mạnh vào Hướng đối tượng thay vì Thư viện chuẩn trên C ++.


2
imho Objective-C là một nỗ lực ít ỏi để giới thiệu các lớp vào C và kém hơn về nhiều mặt đối với C ++. Hơn nữa, nó rất ít được sử dụng bên ngoài Mac OS X / iOS.
dtech

1
@dtech: Thật thú vị, một đồng nghiệp cũ của tôi, người không phải là một người hâm mộ Mac (đúng hơn là một anh chàng Debian / Linux) đã bị thuyết phục rằng Objective-C là một phần mở rộng OO của C sạch hơn nhiều so với C ++. Tôi chưa bao giờ thử Objective-C, vì vậy tôi không có ý kiến ​​gì về việc này.
Giorgio

1
@dtech: Sau đó, tôi khiêm tốn đề nghị bạn xem xét lại ý kiến ​​của mình;) Objective-C là về định hướng đối tượng, và sau đó C ++ thực hiện công việc tốt hơn nhiều vì nó giới thiệu thông điệp. Mặc dù tôi đồng ý rằng ngôn ngữ này kém hơn C ++ về nhiều mặt, nhưng nó cũng vượt trội hơn nhiều so với các cách khác.
back2dos

@Giorgio Tôi đồng ý với đồng nghiệp của bạn, mặc dù Obj-C cũng có một số giới hạn (có thể một số trong số này đã biến mất với Obj-C 2.0), ví dụ: tôi muốn có quá tải "phương thức" (bộ chọn) - tôi muốn chức năng nạp chồng một chiếc Fortran trong C ...
ShinTakezou

2

Thế giới nhúng được chỉ định Embedded C ++ , có thể là thứ bạn đang tìm kiếm. Họ loại bỏ những thứ như nhiều thừa kế và như vậy. Theo như tôi biết, nó đã chết khá nhiều.


0

Bạn có thể thấy sự so sánh chuyên sâu này của C ++, Objective-C, Java và C # hữu ích. Cá nhân tôi nghĩ rằng C # sạch hơn rất nhiều so với C ++. Tôi đã chuyển một số hàm C (số / tính toán) sang C # trước đây mà không cần quá nhiều thay đổi do sự giống nhau của kiểu cú pháp và kiểu dữ liệu số.

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.