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?
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?
Jawaban:
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
IInspectable
memungkinkan 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.
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/