Tôi không biết nhiều về D, nhưng nhiều, rất nhiều lập trình viên C ++ mà tôi biết rất không thích nó và cá nhân tôi phải đồng ý - Tôi không thích giao diện của D và sẽ không xem xét kỹ hơn.
Để hiểu lý do tại sao D không tăng thêm lực kéo, bạn cần bắt đầu bằng cách hiểu điều gì thu hút mọi người đến với C ++. Trong một từ, lý do số một là kiểm soát. Khi bạn lập trình trong C ++, thì bạn có toàn quyền kiểm soát chương trình của mình. Bạn muốn thay thế thư viện tiêu chuẩn? Bạn có thể. Bạn muốn làm phôi con trỏ không an toàn? Bạn có thể. Bạn muốn vi phạm const-đúng? Bạn có thể. Bạn muốn thay thế bộ cấp phát bộ nhớ? Bạn có thể. Bạn muốn sao chép xung quanh bộ nhớ thô mà không quan tâm đến loại của nó? Nếu bạn thực sự muốn. Bạn muốn kế thừa từ nhiều triển khai? Đây là đám tang của bạn. Địa ngục, bạn thậm chí có thể có được các thư viện thu gom rác, như bộ sưu tập Boehm. Sau đó, bạn có các vấn đề như hiệu suất, theo sát kiểm soát - lập trình viên càng kiểm soát nhiều, anh ta càng có thể tối ưu hóa chương trình của mình.
Đây là một vài điều mà tôi đã thấy khi thực hiện một nghiên cứu nhỏ và nói chuyện với một vài người đã thử nó:
Phân cấp kiểu thống nhất. Người dùng C ++ rất hiếm khi sử dụng tính kế thừa, hầu hết các lập trình viên C ++ thích thành phần và các loại chỉ nên được liên kết thông qua kế thừa nếu có lý do rất chính đáng để làm như vậy. Khái niệm về Object vi phạm nguyên tắc này mạnh mẽ bằng cách liên kết mọi loại. Ngoài ra, nó vi phạm một trong những nguyên tắc cơ bản nhất của C ++ - bạn chỉ sử dụng những gì bạn muốn. Không được đưa ra lựa chọn về việc kế thừa từ Object và các chi phí đi kèm với nó, rất mạnh so với những gì C ++ đại diện cho ngôn ngữ trong việc giúp lập trình viên kiểm soát chương trình của mình.
Tôi đã nghe về các vấn đề với chức năng và đại biểu. Rõ ràng, D có cả hai chức năng và đại biểu là các loại chức năng có thể gọi được trong thời gian chạy và chúng không giống nhau nhưng chúng có thể hoán đổi cho nhau hoặc ... một cái gì đó? Bạn tôi đã có một vài vấn đề với họ. Đây chắc chắn là một sự hạ cấp từ C ++, vừa mới std::function
hoàn thành.
Sau đó, bạn đã có khả năng tương thích. D không tương thích đặc biệt với C ++. Ý tôi là, không có ngôn ngữ nào tương thích với C ++, hãy đối mặt với nó, ngoại trừ C ++ / CLI là một loại gian lận, nhưng như một rào cản gia nhập, nó phải được đề cập.
Sau đó, có một số điều khác. Ví dụ, chỉ cần đọc mục Wikipedia.
import std.metastrings;
pragma(msg, Format!("7! = %s", fact_7));
pragma(msg, Format!("9! = %s", fact_9));
printf
là một trong những chức năng không an toàn nhất từng được phát minh, trong cùng một gia đình với các vấn đề lớn như gets
từ thư viện C Standard cũ. Nếu bạn tìm kiếm nó trên Stack Overflow, bạn sẽ tìm thấy rất nhiều câu hỏi liên quan đến việc sử dụng sai. Về cơ bản, printf
là vi phạm DRY- bạn đang đưa ra loại trong chuỗi định dạng và sau đó cung cấp lại khi bạn đưa ra một đối số. Vi phạm DRY nếu bạn hiểu sai, thì điều rất tệ sẽ xảy ra - giả sử, nếu bạn thay đổi một typedef từ số nguyên 16 bit thành số 32 bit. Nó cũng không thể mở rộng được - hãy tưởng tượng điều gì sẽ xảy ra nếu mọi người phát minh ra các công cụ định dạng riêng của họ. Các iostream của C ++ có thể chậm và sự lựa chọn nhà điều hành của họ có thể không phải là tốt nhất và giao diện của họ có thể sử dụng công việc, nhưng về cơ bản chúng được đảm bảo an toàn và DRY không bị vi phạm và chúng có thể được mở rộng. Đây không phải là điều có thể nói printf
.
Không thừa kế nhiều. Đó không phải là cách của C ++. Các lập trình viên C ++ mong muốn có toàn quyền kiểm soát chương trình của họ và ngôn ngữ thực thi những gì bạn không thể thừa hưởng là vi phạm nguyên tắc đó. Ngoài ra, nó làm cho tính kế thừa (thậm chí nhiều hơn) trở nên dễ vỡ, bởi vì nếu bạn thay đổi một loại từ giao diện sang một lớp vì bạn muốn cung cấp một triển khai mặc định hoặc một cái gì đó, đột nhiên tất cả mã người dùng của bạn bị hỏng. Đó không phải là một điều tốt.
Một ví dụ khác là string
và wstring
. Trong C ++, thật khó khăn khi phải chuyển đổi giữa chúng và thư viện này có hỗ trợ Unicode không, và thư viện C cũ này chỉ sử dụng const char*
và phải viết các phiên bản khác nhau của cùng một chức năng tùy thuộc vào loại đối số chuỗi bạn muốn. Đáng chú ý, các tiêu đề Windows, ví dụ, có một số macro cực kỳ khó chịu để đối phó với vấn đề thường có thể can thiệp vào mã của riêng bạn. Thêm dstring
vào hỗn hợp sẽ chỉ làm cho mọi thứ tồi tệ hơn, vì bây giờ thay vì hai loại chuỗi, bạn phải quản lý ba. Có nhiều hơn một loại chuỗi sẽ làm tăng các cơn đau bảo trì và giới thiệu mã lặp đi lặp lại xử lý các chuỗi.
Scott Meyers viết:
D là một ngôn ngữ lập trình được xây dựng để giúp các lập trình viên giải quyết các thách thức của phát triển phần mềm hiện đại. Nó làm như vậy bằng cách thúc đẩy các mô-đun được kết nối với nhau thông qua các giao diện chính xác, liên kết các mô hình lập trình tích hợp chặt chẽ, cách ly luồng thực thi ngôn ngữ, an toàn kiểu mô-đun, mô hình bộ nhớ hiệu quả, v.v.
Cách ly luồng thực thi ngôn ngữ không phải là một cộng. Các lập trình viên C ++ mong đợi toàn quyền kiểm soát các chương trình của họ và ngôn ngữ buộc một thứ gì đó chắc chắn không phải là thứ mà bác sĩ đã yêu cầu.
Tôi cũng sẽ đề cập đến thao tác chuỗi thời gian biên dịch. D có khả năng diễn giải mã D tại thời gian biên dịch. Đây không phải là một điểm cộng. Hãy xem xét những cơn đau đầu dữ dội do bộ tiền xử lý tương đối hạn chế của C, được biết đến bởi tất cả các lập trình viên C ++ kỳ cựu, và sau đó tưởng tượng tính năng này sẽ bị lạm dụng đến mức nào. Khả năng tạo mã D tại thời gian biên dịch là rất tốt, nhưng nó phải là ngữ nghĩa , không phải cú pháp.
Ngoài ra, bạn có thể mong đợi một phản xạ nhất định. D có bộ sưu tập rác, mà các lập trình viên C ++ sẽ liên kết với các ngôn ngữ như Java và C # hoàn toàn trái ngược với nó trong các triết lý và sự tương đồng về cú pháp cũng sẽ khiến họ chú ý. Điều này không nhất thiết phải khách quan chính đáng, nhưng đó là điều chắc chắn cần lưu ý.
Về cơ bản, nó không cung cấp nhiều mà các lập trình viên C ++ không thể làm được. Có thể dễ dàng hơn để viết một siêu dữ liệu giai thừa trong D, nhưng chúng ta đã có thể viết các siêu dữ liệu giai thừa trong C ++. Có thể trong D bạn có thể viết một trình theo dõi thời gian biên dịch, nhưng dù sao thì không ai thực sự muốn làm điều đó. So với các vi phạm cơ bản của triết lý C ++, những gì bạn có thể làm trong D không đặc biệt đáng chú ý.
Ngay cả khi những điều này chỉ là vấn đề trên bề mặt, thì tôi khá chắc chắn rằng thực tế là trên bề mặt, D hoàn toàn không giống C ++ có lẽ là một lý do chính đáng mà nhiều lập trình viên C ++ không chuyển sang D. Có lẽ D cần phải tự làm một công việc quảng cáo tốt hơn.