Mengapa WinRT tidak dikelola? [Tutup]

164

Windows 8 memperkenalkan WinRT, yang seperti .NET tetapi tidak dikelola. Mengapa tidak dikelola? Apakah ini masalah kinerja? Apakah ini berarti pengumpulan sampah tidak cocok untuk API tingkat rendah?

pengguna380719
sumber
56
Ini adalah panggilan yang buruk , sama buruknya dengan menutupnya. Anda sekarang bersikeras pada referensi dan sumber, Anda memotongnya lebih awal dengan menutup pertanyaan. Sekarang Anda menghapus sumber yang sangat baik, dari pemrogram yang bekerja di sana.
Hans Passant
9
Saya memilih keluar topik karena ini tidak membahas pertanyaan pemrograman praktis. Itu hanya rasa ingin tahu. Tidak ada programmer yang akan mengubah kode mereka sebagai hasil dari pertanyaan ini.
Raymond Chen
17
@Kev Dengan alasan itu, pertanyaan seperti "bagaimana planet Bumi terbentuk?" akan benar-benar mengerikan di komunitas sains karena menarik banyak spekulasi agama. Ada jawaban yang bagus untuk pertanyaan ini - hanya karena itu menarik banyak jawaban buruk tidak berarti itu pertanyaan yang buruk. Sungguh, mengapa tidak hanya memindahkan pertanyaan ini ke P.SE?
Rei Miyasaka
22
@casperOne Ini adalah pertanyaan "papan tulis" yang sah untuk banyak pengembang - kami ingin mengetahui alasan teknis yang mungkin untuk keputusan tersebut, sehingga kami dapat menerapkan alasan yang sama di tempat lain. Apakah karena pengumpul sampah sulit diprofilkan? Apakah karena memberikan akses yang lebih mudah ke abstraksi perangkat keras tingkat bawah? Jika tidak ada alasan teknis, maka itu sangat disayangkan - tetapi itu tidak ada hubungannya sama sekali dengan kualitas pertanyaan itu sendiri.
Rei Miyasaka
7
Saya setuju, dengan @HansPassant; pertanyaan ini perlu dibuka kembali dan diperlakukan sebagai valid. "Kenapa itu tidak dikelola?" adalah pertanyaan yang sangat bagus sehubungan dengan fundamental WinRT.
Rob Perkins

Jawaban:

190

WinRT adalah pengganti Winapi kuno berbasis C. Ini adalah api yang harus dapat digunakan di banyak lingkungan runtime. Kembali 20 tahun yang lalu, api C relatif mudah untuk berinteraksi. Yang telah bergerak sejak saat itu, COM menjadi perekat universal pada paruh terakhir tahun 1990-an. Praktis setiap runtime bahasa yang umum digunakan di Windows mendukung COM.

Pengumpul sampah adalah detail implementasi runtime bahasa. Kolektor untuk .NET sangat berbeda dari kolektor untuk Javascript misalnya. Benda-benda asli yang dibuat di kedua harus mematuhi aturan yang sangat ketat dari kolektor. Yang pada gilirannya berarti bahwa mereka harus membuat versi WinRT yang spesifik untuk setiap runtime bahasa. Itu tidak akan berhasil, bahkan perusahaan sebesar Microsoft tidak mampu untuk membuat dan mendukung versi WinRT khusus untuk setiap bahasa yang mengikat. Juga tidak perlu, mengingat bahwa bahasa-bahasa ini sudah mendukung COM.

Saat ini, pengikatan terbaik untuk WinRT adalah C ++ karena COM bekerja lebih efisien dengan manajemen memori eksplisit. Dengan bantuan yang cukup dari ekstensi kompiler C ++ baru yang membuatnya otomatis, sangat mirip dengan _com_ptr_t lama dengan sintaks seperti C ++ / CLI untuk menghindarinya. Mengikat ke bahasa yang dikelola relatif sederhana karena CLR sudah memiliki dukungan interop COM yang sangat baik. WinRT juga mengadopsi format metadata .NET. Afaik, tidak ada pekerjaan yang dilakukan pada kompiler yang dikelola sampai hari ini.

EDIT: Larry Osterman, seorang programmer dan blogger Microsoft yang terkenal, meninggalkan komentar yang agak bagus dalam jawaban yang sekarang dihapus. Saya akan mengutipnya di sini untuk melestarikannya:

WinRT tidak dikelola karena OS tidak dikelola. Dan dengan mendesain WinRT seperti yang dirancang, ia memperoleh kemampuan untuk diekspresikan dalam banyak bahasa yang berbeda, tidak hanya C ++, C # dan JS. Sebagai contoh, saya dapat dengan mudah melihat satu set modul Perl yang mengimplementasikan API WinRT yang bekerja pada desktop. Jika kami menerapkannya di .Net, itu akan sangat sulit

Hans Passant
sumber
14
Saya tidak tahu tentang kompiler, tetapi saya cukup yakin bahwa WinRT .NET proyeksi memiliki banyak pekerjaan yang dilakukan pada CLR. Mereka mungkin telah menggunakan kembali kode COM Interop, tetapi ada perbedaan juga (misalnya IInspectablememungkinkan Anda melakukan hal-hal seperti permintaan objek untuk jenis kelas aktual atau daftar semua antarmuka yang didukung, dan dengan file winmd, seseorang dapat memproyeksikan metadata WinRT untuk semua yang menjadi Refleksi ). Dan file winmd tidak segera dapat digunakan sebagai majelis interop, CLR harus menanganinya secara khusus.
Pavel Minaev
5
Tidak yakin, Anda mengabaikan gajah. IInspectable adalah pengganti IDispatch yang macet pada tahun 1997. Anda bekerja untuk Microsoft, jangan ragu untuk memberikan beberapa rahasia di sini :)
Hans Passant
13
Ada pekerjaan yang dilakukan dalam ketiga bahasa untuk mendukung proyeksi bahasa.
ReinstateMonica Larry Osterman
13
Saya akan mengklaim bahwa saat ini 'pengikatan terbaik untuk WinRT' sebenarnya adalah C #. Pengikatan CLR dioptimalkan bahkan di luar COM interop yang cukup cepat, dan bahasa .NET di pratinjau dev telah menerapkan dukungan yang sangat baik untuk fungsi-fungsi async yang ada di mana-mana dengan 'menunggu'. Dalam beberapa demo kode C # melakukan lebih banyak daripada sampel C ++, dan bekerja lebih mudah. Mungkin nanti C ++ akan mendapatkan ekstensi pembantu async, tetapi dalam versi ini C ++ async tampak mengerikan. Dan Anda cenderung bocor memori jangka panjang dari pengumpulan sampah CLR dari implementasi C ++ yang bermasalah-siklus. C # FTW!
Gubernur
13
@Hans: Proyeksi ke-3 adalah CLR untuk semua bahasa CLR (terutama C # dan VB). WinJS juga bukan proyeksi, ini adalah set pustaka dukungan. Proyeksi ini langsung dibangun ke dalam mesin Chakra JS.
ReinstateMonica Larry Osterman
25

WinRT tidak dikelola karena dimaksudkan untuk menjadi pengganti Win32 - API tingkat rendah yang dapat diakses pengembang untuk Windows. API yang tidak dikelola masih merupakan yang paling berpotensi berkinerja yang dapat diekspos kepada pengembang dan alasannya adalah bahwa akan selalu memungkinkan untuk membungkus API yang dikelola di atasnya, yang tepat seperti yang dilakukan oleh 'proyeksi'.

Ini juga berarti bahwa pengembang C ++ dapat menggunakan WinRT tanpa melompati lingkaran yang diperkenalkan C ++ / CLI (lihat http://www2.research.att.com/~bs/bs_faq.html#CppCLI ) Namun itu berarti bahwa Anda masih akan tetap harus belajar COM jika Anda ingin menggunakan WinRT.

Pertanyaan sebenarnya adalah 'mengapa COM perlu? mengapa Microsoft harus menciptakannya? ' Karena C ++ polos tanpa semua fasilitas tambahan COM tidak memadai untuk pekerjaan OOP nyata dan klaim Stroustrup tentang C ++ memberi Anda 'portabilitas' sangat tidak jujur ​​mengingat kenyataan kerja. Lihat http://webmechs.com/webpress/2011/11/c-versus-objective-c-as-api-substrate/

Andz
sumber
Tautan yang diperbarui untuk pemikiran Bjarne tentang C ++ / CLI: stroustrup.com/bs_faq.html#CppCLI