WinRT neden yönetilmez? [kapalı]


164

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?


56
Bu kötü bir çağrı , kapatmak kadar kötü. Şimdi referanslar ve kaynaklar konusunda ısrar ediyorsunuz, soruyu kapatarak bunu daha önce kestiniz. Şimdi , üzerinde çalışan programcılardan mükemmel kaynakları sildiniz .
Hans Passant

9
Bu pratik bir programlama sorusuna değinmediği için konu dışı seçtim. Sadece merak. Bu sorunun sonucu olarak hiçbir programcı kodunu değiştirmeyecektir.
Raymond Chen

17
@Kev Bu akıl yürütme ile, "Dünya gezegeni nasıl kuruldu?" bilim topluluğunda kesinlikle korkunç olurdu, çünkü çok fazla dini spekülasyon çekti. Bu soruya iyi cevaplar var - sadece çok fazla kötü cevap aldığı için bunun kötü bir soru olduğu anlamına gelmez. Gerçekten de, bu soruyu neden P.SE'ye taşımıyorsunuz?
Rei Miyasaka

22
@casperOne Pek çok geliştirici için meşru bir "beyaz tahta" sorusu - kararın muhtemelen teknik nedenlerini bilmek istiyoruz, böylece aynı mantığı başka bir yerde de uygulayabiliriz. Çöp toplayıcının profilini zor bulması mı? Alt düzey donanım soyutlamalarına daha kolay erişim sağladığı için mi? Teknik bir neden yoksa, bu sadece talihsiz bir durumdur - ancak sorunun kendisinin kalitesiyle hiçbir ilgisi yoktur.
Rei Miyasaka

7
Katılıyorum, @HansPassant; bu sorunun yeniden açılması ve geçerli olarak ele alınması gerekir. "Neden yönetilmiyor?" WinRT'nin temelleri açısından çok iyi bir soru.
Rob Perkins

Yanıtlar:


190

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


14
Derleyiciler hakkında bilmiyorum, ancak WinRT .NET projeksiyonunun CLR'de çok fazla iş yaptığından eminim. COM Interop kodunu yeniden kullanmış olabilirler, ancak farklılıklar da vardır (örneğin, IInspectablebir 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.
Pavel Minaev

5
Emin değilsiniz, fili görmezden geliyorsunuz. IInspectable, 1997'de takılmış olan IDispatch'in yerine geçmiştir. Microsoft için çalışıyorsunuz, burada bazı sırları vermekte çekinmeyin :)
Hans Passant

13
Dil projeksiyonlarını desteklemek için 3 dilde de çalışmalar yapıldı.
ReinstateMonica Larry Osterman

14
Şu anda 'WinRT için en iyi bağlama' aslında C # olduğunu iddia ediyorum. CLR bağlaması, oldukça hızlı COM birlikte çalışmasının ötesinde bile optimize edilmiştir ve geliştirici önizlemesindeki .NET dilleri, 'beklemede' olan her yerde bulunan zaman uyumsuz işlevler için mükemmel desteği zaten uygulamaktadır. Demoların birkaçında C # kodu C ++ örneklerinden çok daha fazlasını yaptı ve daha kolay çalıştı. Belki daha sonra C ++ bir async yardımcı uzantısı alır, ancak bu sürümde C ++ async korkunç görünüyordu. Ayrıca, çöp toplama CLR'sinden uzun süreli belleği, sorunlu C ++ uygulamasından daha az sızma olasılığınız daha düşüktür. C # FTW!
Govert

13
@Hans: 3. projeksiyon tüm CLR dilleri için (özellikle C # ve VB) CLR'dir. Ayrıca WinJS bir projeksiyon değil, bir dizi destek kütüphanesi. Projeksiyon doğrudan Chakra JS motoruna yerleştirilmiştir.
ReinstateMonica Larry Osterman

25

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/


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.