Tại sao WinRT không được quản lý? [đóng cửa]


164

Windows 8 giới thiệu WinRT, giống như .NET nhưng không được quản lý. Tại sao nó không được quản lý? Đây có phải là một vấn đề hiệu suất? Có nghĩa là bộ sưu tập rác không phù hợp với các API cấp thấp hơn?


56
Đây là một cuộc gọi xấu , cũng tệ như đóng nó. Bây giờ bạn nhấn mạnh vào các tài liệu tham khảo và các nguồn, bạn đã cắt nó trước đó bằng cách đóng câu hỏi. Bây giờ bạn đã xóa các nguồn tuyệt vời, từ các lập trình viên làm việc trên nó.
Hans Passant

9
Tôi đã bỏ phiếu là lạc đề vì điều này không giải quyết một câu hỏi lập trình thực tế. Đó chỉ là sự tò mò. Không có lập trình viên sẽ thay đổi mã của họ là kết quả của câu hỏi này.
Raymond Chen

17
@Kev Bằng lý do đó, những câu hỏi như "Trái đất được hình thành như thế nào?" sẽ là hoàn toàn khủng khiếp trong cộng đồng khoa học bởi vì nó thu hút rất nhiều suy đoán tôn giáo. Có những câu trả lời hay cho câu hỏi này - chỉ vì nó thu hút rất nhiều câu trả lời xấu không có nghĩa đó là một câu hỏi tồi. Thực sự, tại sao không chuyển câu hỏi này sang P.SE?
Rei Miyasaka

22
@casperOne Đó là một câu hỏi "bảng trắng" hợp pháp cho nhiều nhà phát triển - chúng tôi muốn biết lý do kỹ thuật có lẽ cho quyết định này, để chúng tôi có thể áp dụng lý do tương tự ở nơi khác. Có phải vì người thu gom rác khó lập hồ sơ? Có phải vì nó cho phép truy cập dễ dàng hơn đến trừu tượng phần cứng cấp thấp hơn? Nếu không có lý do kỹ thuật, thì điều đó thật đáng tiếc - nhưng điều đó hoàn toàn không liên quan gì đến chất lượng của câu hỏi.
Rei Miyasaka

7
Tôi đồng ý, với @HansPassant; câu hỏi này cần được mở lại và coi là hợp lệ. "Tại sao nó không được quản lý?" là một câu hỏi rất hay liên quan đến các nguyên tắc cơ bản của WinRT.
Rob Perkins

Câu trả lời:


190

WinRT là sự thay thế cho Winapi dựa trên C lâu đời. Nó là một api phải có thể sử dụng được trong nhiều môi trường thời gian chạy. Trở lại 20 năm trước, một api C tương đối dễ dàng để tương tác. Điều đó đã chuyển từ đó, COM trở thành chất keo phổ quát trong nửa cuối thập niên 1990. Thực tế, bất kỳ thời gian chạy ngôn ngữ nào được sử dụng phổ biến trong Windows đều hỗ trợ COM.

Một trình thu gom rác là một chi tiết thực hiện thời gian chạy ngôn ngữ. Ví dụ, trình thu thập cho .NET rất khác với trình thu thập cho Javascript. Các đối tượng bản địa được tạo trong một trong hai phải tuân thủ các quy tắc rất nghiêm ngặt của người sưu tầm. Điều đó có nghĩa là họ sẽ phải tạo các phiên bản WinRT dành riêng cho từng thời gian chạy ngôn ngữ. Điều đó sẽ không xảy ra, ngay cả một công ty lớn như Microsoft không thể đủ khả năng để tạo và hỗ trợ một phiên bản WinRT cụ thể cho mọi ràng buộc ngôn ngữ. Cũng không cần thiết, vì các ngôn ngữ này đã hỗ trợ COM.

Ngay bây giờ, ràng buộc tốt nhất cho WinRT là C ++ vì COM hoạt động hiệu quả hơn với quản lý bộ nhớ rõ ràng. Với sự trợ giúp dồi dào từ các phần mở rộng trình biên dịch C ++ mới giúp nó tự động, rất giống với _com_ptr_t cũ với cú pháp giống như C ++ / CLI để tránh điều đó. Liên kết với các ngôn ngữ được quản lý tương đối đơn giản vì CLR đã có hỗ trợ tương tác COM tuyệt vời. WinRT cũng áp dụng định dạng siêu dữ liệu của .NET. Afaik, không có công việc nào được thực hiện trên các trình biên dịch được quản lý như ngày nay.

EDIT: Larry Osterman, một lập trình viên và blogger nổi tiếng của Microsoft, đã để lại một bình luận khá tốt trong một câu trả lời hiện đã bị xóa. Tôi sẽ trích dẫn nó ở đây để bảo tồn nó:

WinRT không được quản lý vì HĐH không được quản lý. Và bằng cách thiết kế WinRT theo cách nó được thiết kế, nó có khả năng được thể hiện bằng nhiều ngôn ngữ khác nhau, không chỉ C ++, C # và JS. Chẳng hạn, tôi có thể dễ dàng thấy một tập các mô-đun Perl triển khai API WinRT hoạt động trên máy tính để bàn. Nếu chúng tôi đã triển khai nó trong .Net, điều đó sẽ vô cùng khó khăn


14
Tôi không biết về trình biên dịch, nhưng tôi khá chắc chắn rằng trình chiếu WinRT .NET đã thực hiện rất nhiều công việc trên CLR. Họ có thể đã sử dụng lại mã COM Interop, nhưng cũng có những khác biệt (ví dụ: IInspectablecho phép bạn thực hiện những việc như truy vấn một đối tượng cho loại lớp thực tế của nó hoặc danh sách tất cả các giao diện được hỗ trợ và với các tệp winmd, người ta có thể chiếu siêu dữ liệu WinRT cho tất cả những điều đó vào Reflection ). Và các tệp winmd cũng không thể sử dụng được ngay lập tức như các hội đồng interop, CLR phải xử lý chúng một cách đặc biệt.
Pavel Minaev

5
Không chắc chắn, bạn đang bỏ qua con voi. IInspectable là một sự thay thế cho IDispatch đã bị mắc kẹt vào năm 1997. Bạn làm việc cho Microsoft, hãy thoải mái đưa ra một số bí mật ở đây :)
Hans Passant

13
Đã có công việc được thực hiện bằng cả 3 ngôn ngữ để hỗ trợ cho các dự đoán ngôn ngữ.
Tái lậpMonica Larry Osterman

13
Tôi khẳng định rằng ngay bây giờ 'ràng buộc tốt nhất cho WinRT' thực sự là C #. Liên kết CLR được tối ưu hóa thậm chí vượt ra ngoài giao diện COM khá nhanh và các ngôn ngữ .NET trong bản xem trước dev đã triển khai hỗ trợ tuyệt vời cho các chức năng async phổ biến với 'await'. Trong một vài bản demo, mã C # đã làm được nhiều hơn so với các mẫu C ++ và hoạt động dễ dàng hơn. Có thể sau này C ++ sẽ nhận được một phần mở rộng trợ giúp async, nhưng trong phiên bản này, C ++ async trông rất tệ. Và bạn ít có khả năng rò rỉ bộ nhớ dài hạn từ rác thu thập CLR so với việc triển khai C ++ có vấn đề theo chu kỳ. C # FTW!
Govert

13
@Hans: Phép chiếu thứ 3 là CLR cho tất cả các ngôn ngữ CLR (chủ yếu là C # và VB). Ngoài ra WinJS không phải là một phép chiếu, nó là một tập hợp các thư viện hỗ trợ. Phép chiếu được tích hợp trực tiếp vào công cụ Chakra JS.
Tái lậpMonica Larry Osterman

25

WinRT không được quản lý vì dự định thay thế Win32 - API nhà phát triển cấp thấp nhất có thể truy cập cho Windows. API không được quản lý vẫn là API có khả năng hoạt động tốt nhất có thể được tiếp xúc với nhà phát triển và lý do là sẽ luôn có thể bọc API được quản lý lên trên đó, đó chính xác là những gì 'dự đoán' làm.

Điều đó cũng có nghĩa là các nhà phát triển C ++ có thể sử dụng WinRT mà không cần phải nhảy qua các vòng mà C ++ / CLI giới thiệu (xem http://www2.research.att.com/~bs/bs_faq.html#CppCLI ) Điều đó có nghĩa là bạn vẫn sẽ phải học COM nếu bạn muốn sử dụng WinRT.

Câu hỏi thực sự là 'tại sao COM lại cần thiết? Tại sao Microsoft phải phát minh ra nó? ' Bởi vì C ++ đơn giản mà không có tất cả các tiện ích bổ sung của COM là không đủ cho công việc OOP thực sự và các tuyên bố về C ++ của Stroustrup mang lại cho bạn 'tính di động' rất không phù hợp với thực tế làm việc. Xem http://webmechs.com/webpress/2011/11/c-versus-objective-c-as-api-substrate/


Liên kết được cập nhật cho những suy nghĩ của Bjarne về C ++ / CLI: stroustrup.com/bs_faq.html#CppCLI
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.