Windows 8, .NET gibi ama yönetilmeyen WinRT'yi tanıttı. Neden yönetilmiyor? Bir performans sorunu mu? Çöp toplamanın daha düşük seviyeli API'ler için uygun olmadığı anlamına mı geliyor?
Windows 8, .NET gibi ama yönetilmeyen WinRT'yi tanıttı. Neden yönetilmiyor? Bir performans sorunu mu? Çöp toplamanın daha düşük seviyeli API'ler için uygun olmadığı anlamına mı geliyor?
Yanıtlar:
WinRT bir olan yedek asırlık C tabanlı WINAPI için. Birçok çalışma zamanı ortamında kullanılabilmesi gereken bir API'dir. 20 yıl önce, bir C api ile birlikte çalışmak nispeten kolaydı. O zamandan beri bu devam etti, COM 1990'ların son yarısında evrensel yapıştırıcı oldu. Windows'da yaygın olarak kullanılan herhangi bir dil çalışma zamanı, COM'u destekler.
Çöp toplayıcı bir dil çalışma zamanı uygulama ayrıntısıdır. .NET için toplayıcı, örneğin Javascript için toplayıcıdan çok farklıdır. Her ikisinde de oluşturulan yerel nesneler, toplayıcının çok katı kurallarına uymalıdır. Bu da, her dil çalışma zamanına özgü WinRT sürümleri oluşturmak zorunda kalacakları anlamına gelir. Microsoft böyle büyük bir şirket bile her dil bağlaması için belirli bir WinRT sürümü oluşturmayı ve desteklemeyi göze alamaz. Bu dillerin zaten COM'u desteklediği göz önüne alındığında, gerekli de değildir.
Şu anda, COM açık bellek yönetimi ile daha verimli çalıştığı için WinRT için en iyi bağlama C ++. Otomatik hale getiren yeni C ++ derleyici uzantılarının geniş yardımı ile, önlemek için C ++ / CLI benzeri sözdizimi ile eski _com_ptr_t'e çok benzer. CLR zaten mükemmel COM birlikte çalışma desteğine sahip olduğundan yönetilen dillere bağlanmak nispeten basittir. WinRT ayrıca .NET'in meta veri biçimini de benimsedi. Afaik, bugünden itibaren yönetilen derleyiciler üzerinde hiç çalışma yapılmadı.
DÜZENLEME: Tanınmış bir Microsoft programcısı ve blog yazarı olan Larry Osterman, şimdi silinmiş bir cevapta oldukça iyi bir yorum bıraktı. Bunu korumak için burada teklif edeceğim:
İşletim sistemi yönetilmediğinden WinRT yönetilmez. Ve WinRT'yi tasarlandığı şekilde tasarlayarak, sadece C ++, C # ve JS değil, birçok farklı dilde ifade edilebilme yeteneği kazanır. Örneğin, masaüstünde çalışan WinRT API'lerini uygulayan bir dizi Perl modülünü kolayca görebiliyordum. Eğer .Net içine uygulasaydık, bu son derece zor olurdu
IInspectable
bir nesneyi gerçek sınıf türü veya desteklenen tüm arabirimlerin listesi için sorgulama gibi şeyler yapmanızı sağlar ve winmd dosyalarıyla WinRT meta verilerini tüm yansımalara yansıtabilir ). Winmd dosyaları birlikte çalışma derlemeleri olarak hemen kullanılamaz, CLR'nin bunları özel olarak işlemesi gerekir.
WinRT, Windows için geliştiricinin erişebileceği en düşük düzeydeki API olan Win32'nin yerini alması amaçlandığı için yönetilmez. Yönetilmeyen bir API hala geliştiriciye maruz kalabilecek en potansiyel performansa sahip olan ve akıl yürütme, yönetilen bir API'yi üstüne her zaman mümkün olacak şekilde devam ediyor, bu da tam olarak 'projeksiyonlar'.
Ayrıca, C ++ geliştiricilerinin, C ++ / CLI'nin getirdiği çembere atlamadan WinRT'yi kullanabileceği anlamına gelir (bkz. Http://www2.research.att.com/~bs/bs_faq.html#CppCLI ) Yine de WinRT kullanmak istiyorsanız COM okumak zorunda.
Asıl soru şudur: 'COM neden gereklidir? Microsoft neden icat etmek zorunda kaldı? ' Çünkü COM'un tüm ek olanaklarına sahip olmayan düz C ++, gerçek OOP çalışması için yetersizdir ve Stroustrup'un size 'taşınabilirlik' sağlayan C ++ iddiaları, çalışma gerçeği ışığında çok çok isteksizdir. Bkz. Http://webmechs.com/webpress/2011/11/c-versus-objective-c-as-api-substrate/