2011-01-23 12 views
6

Có rất nhiều thư viện lớp C++ mã nguồn mở hoặc thương mại như MFC, ATL, SmartWin ++, QT. nhưng không ai trong số họ có thiết kế và kiến ​​trúc và độ tinh khiết của thư viện lớp .NET framework. Điều gì về ý tưởng triển khai thư viện C++ giống như thư viện lớp .NET framework và cung cấp cho các nhà phát triển một loạt các tính năng và dĩ nhiên thư viện sẽ không được quản lý và sẽ bao gồm các lệnh win32 API và COMCó lãng phí thời gian để phát triển thư viện C++ không được quản lý giống như thư viện lớp .NET framework trong thiết kế và kiến ​​trúc không?

+8

Đúng, đó là một sự lãng phí thời gian. Tốt hơn là phát triển một thư viện C++ với thiết kế tốt hơn và sạch hơn .NET framework. C++ là một ngôn ngữ mạnh mẽ hơn nhiều, và thiết kế .NET hiện tại (và C++ của MFC, QT) giống như thiết kế C-with-classes. – ybungalobill

+6

"tinh khiết"? Xin chào zealot ngôn ngữ. – Puppy

+0

Ngoài ra bạn có thể thử haxe –

Trả lời

4

Câu hỏi thú vị. Nhưng tôi tin rằng nó sẽ là một sự lãng phí thời gian hay không tối ưu để tái tạo. NET BCL (thư viện lớp cơ sở) cho C++ không được quản lý. Tại sao vậy?

  1. Ngôn ngữ C++ hoàn toàn khác với ngôn ngữ .NET. Điều này có nghĩa là nếu bạn viết lại BCL cho C++, bạn sẽ cố gắng sử dụng C++ tốt nhất. Điều này có lẽ sẽ cho kết quả trong một thiết kế khung khá khác nhau:

    • IDisposableClose phương pháp này sẽ không cần thiết, vì C++ cung cấp giải phóng tất định của các phiên bản và teardown của các đối tượng; một cái gì đó giống như using khối, nhưng chung chung hơn nhiều. (Các khái niệm C++ liên quan là phạm vi, lưu trữ tự động, RAII, và các lớp con trỏ thông minh.) Đó là, một C++ BCL có tiềm năng cho một thiết kế thanh lịch hơn nhiều về mặt này.

    • Mẫu C++ hoàn toàn khác với các bản đồ .NET. C++ cũng không có các đại biểu hoặc sự kiện (mặc dù bạn có thể bắt chước chúng). Sự phản chiếu và kiểu thời gian chạy và tạo mã cũng sẽ không hoạt động dễ dàng với C++. Cuối cùng, C++ (trước C++ 0x) không hỗ trợ các hàm lambda. Điều này có nghĩa rằng các bổ sung hiện đại hơn cho BCL có lẽ sẽ phải trông khá khác trong C++.

  2. Có những thứ trong BCL đã trở nên lỗi thời hoặc nếu bạn thiết kế BCL ngày hôm nay, nó sẽ diễn ra hoàn toàn khác. Hãy lấy System.Reflection. Phần này của BCL được xây dựng trước khi generics được giới thiệu. Nếu nó đã được viết lại từ đầu ngày hôm nay, rất có thể là sự phản chiếu đó sẽ tận dụng ưu thế của generics và do đó loại an toàn hơn.

  3. Như bạn thấy, phiên bản C++ mới của BCL rất có thể sẽ kết thúc khá khác với .NET BCL dựa trên; vì vậy bạn nên tự hỏi nếu nó thậm chí còn cần thiết để cơ sở như một thư viện mới trên .NET BCL ở tất cả. Bạn thậm chí cần phải có một khuôn khổ duy nhất, hoặc cuối cùng là dễ dàng hơn để phát triển các thư viện riêng biệt? Một cho mạng, một cho các kiểu dữ liệu trừu tượng, một cho GUI, một cho phản ánh, vv

    • Thư viện riêng có bất lợi mà chúng có thể không có thiết kế API nhất quán. Do đó, trải nghiệm với một thư viện không giúp bạn học được một API khác.

    • Do đó, các thư viện riêng biệt có thể dễ bảo trì hơn. Người ta có thể duy trì thư viện phản chiếu mà không cần phải hòa hợp từng hành động của một người với các nhà bảo trì thư viện GUI.

    • Thư viện riêng biệt có lợi thế là bạn có thể trao đổi thư viện này cho người khác nếu bạn tìm thấy một thay thế sạch hơn, nhanh hơn hoặc tốt hơn.

  4. Thậm chí nếu ai đó đã viết một ++ phiên bản C của BCL - nó sẽ mất nguồn lực nhiều để duy trì như một thư viện trong thời gian dài, thậm chí nhiều hơn như vậy khi bạn xem xét rằng nó phải là nền tảng độc lập. Microsoft có khả năng này và các tài nguyên này. Bạn cũng vậy chứ?

Việc thu hút một thư viện tuyệt vời cho mọi thứ thực sự là sự nhất quán của một API và thực tế là "mọi người" sẽ sử dụng nó. Nhưng tôi nghĩ ngay cả khi bạn đã viết C++ BCL như vậy, bạn sẽ thấy khó tiếp cận gần như mọi lập trình C++ và thuyết phục họ vào thư viện đó.

+0

"cũng không có đại biểu", tr1 :: chức năng cơ bản là một đại biểu. và nó đã có sẵn trong tăng trong khoảng 10 năm rồi. Tăng lambdas cũng có thể được sử dụng như lambdas. C++ đủ mạnh để thực hiện nó trong chính ngôn ngữ, mặc dù cú pháp có thể không đẹp như vậy ... Đồng ý với mọi thứ khác. – ybungalobill

+0

@ybungalobill: Cảm ơn phản hồi. Tôi không chắc chắn về hiện trạng. Tôi biết rằng các đại biểu có khả năng nhất * có thể * được "bắt chước" trong C++. Ngoài ra, nó sẽ là khá quan trọng mà các loại đại biểu có thể được suy ra bởi trình biên dịch từ một chức năng nhất định.'Tr1 :: function' có hoạt động tốt trong khía cạnh này không? – stakx

+1

@staks: IMO không có bắt chước, nó chỉ là cách C++ để thực hiện điều này. Tôi không chắc chắn tôi hiểu đầy đủ những gì bạn có nghĩa là "suy ra", nhưng tôi đoán rằng có: 'void g (string); void f (function ); ... f (g) '. – ybungalobill

0

Tôi giả sử: Bạn thích C++ vì lý do hiệu suất. Bạn thích .NET vì lý do năng suất. Bạn có thể thử, nhưng cuối cùng bạn sẽ lưu ý rằng C++ sẽ không cung cấp các cấu trúc ngôn ngữ có thể bằng ngôn ngữ được quản lý (các tính năng như đại biểu, giao diện gốc, phương sai, biểu thức lambda, LINQ, v.v.), bạn có thể bắt chước nhưng nó sẽ không trông sạch như bạn thấy trong C# (bạn sẽ cần bộ tiền xử lý xấu xí định nghĩa, và nhận mã khó hiểu, những thứ sẽ không giúp tái cấu trúc mã và các nhiệm vụ mantainance khác).

Bạn có thể kiểm tra 2 lựa chọn:

  • Việc thay thế sử dụng D (a new language). D được lấy cảm hứng từ hiệu năng C++ và năng suất Java hoặc .NET. Trình biên dịch D nhắm mục tiêu đến mã nguồn gốc, KHÔNG phải tập lệnh Virtual Machine. Nhưng bạn cần gỡ bỏ nhiều công cụ biên tập, như Intellisense của Visual Studio và thư viện lớp chuẩn đã được phát triển.

  • Hoặc bạn có thể sử dụng AOT (Ahead of time compilation) hoặc NGEN (Native Image Generation). Để biên dịch .NET bytecode thành mã gốc. Nhưng nó có một số hạn chế.

Trong cả hai trường hợp, bạn sẽ có ngôn ngữ hiện đại được suy nghĩ về năng suất và hiệu suất tốt hơn nền tảng .NET nguyên bản mà không tốn chi phí thực hiện C++ BCL của riêng bạn.

Các vấn đề liên quan