Windows 8 introduce WinRT, che è come .NET ma non gestito. Perché non è gestito? È un problema di prestazioni? Significa che la garbage collection non è adatta per le API di livello inferiore?
Windows 8 introduce WinRT, che è come .NET ma non gestito. Perché non è gestito? È un problema di prestazioni? Significa che la garbage collection non è adatta per le API di livello inferiore?
Risposte:
WinRT è un sostituto per l'antico Winapi basato su C. È un API che deve essere utilizzabile in molti ambienti di runtime. 20 anni fa, un API era relativamente facile da interagire. Da allora, COM è diventata la colla universale nell'ultima metà degli anni '90. Praticamente qualsiasi runtime di lingua di uso comune in Windows supporta COM.
Un garbage collector è un dettaglio dell'implementazione del runtime della lingua. Il collector per .NET è molto diverso dal collector per Javascript, ad esempio. Gli oggetti nativi creati in entrambi devono rispettare le regole molto rigide del collezionista. Il che a sua volta significa che avrebbero dovuto creare versioni di WinRT specifiche per ogni linguaggio di runtime. Ciò non funzionerà, nemmeno un'azienda grande come Microsoft non può permettersi di creare e supportare una versione specifica di WinRT per ogni lingua. Né è necessario, dato che queste lingue supportano già COM.
Al momento, la migliore associazione per WinRT è C ++ poiché COM funziona in modo più efficiente con la gestione esplicita della memoria. Con ampio aiuto dalle nuove estensioni del compilatore C ++ che lo rendono automatico, molto simile a _com_ptr_t di una volta con sintassi simile a C ++ / CLI per evitarlo. Il legame con le lingue gestite è relativamente semplice poiché il CLR ha già un eccellente supporto per l'interoperabilità COM. WinRT ha anche adottato il formato dei metadati di .NET. Dopo tutto, ad oggi non è stato fatto alcun lavoro sui compilatori gestiti.
EDIT: Larry Osterman, un noto programmatore e blogger Microsoft, ha lasciato un commento piuttosto buono in una risposta ora cancellata. Lo citerò qui per preservarlo:
WinRT non è gestito perché il sistema operativo non è gestito. E progettando WinRT nel modo in cui è stato progettato, ottiene la capacità di essere espresso in molte lingue diverse, non solo in C ++, C # e JS. Ad esempio, ho potuto facilmente vedere una serie di moduli Perl che implementano le API WinRT che funzionano sul desktop. Se lo avessimo implementato in .Net, sarebbe stato estremamente difficile
IInspectable
ti permette di fare cose come interrogare un oggetto per il suo tipo di classe attuale o l'elenco di tutte le interfacce supportate, e con i file winmd puoi proiettare i metadati WinRT per tutto ciò in Reflection ). E i file winmd non sono immediatamente utilizzabili come assembly di interoperabilità, CLR deve gestirli in modo speciale.
WinRT non è gestito perché è destinato a sostituire Win32, l'API accessibile per sviluppatori di livello più basso per Windows. Un'API non gestita è ancora la più potenzialmente performante che può essere esposta allo sviluppatore e il ragionamento afferma che sarà sempre possibile racchiudervi un'API gestita, che è esattamente ciò che fanno le "proiezioni".
Significa anche che gli sviluppatori C ++ possono usare WinRT senza saltare attraverso i cerchi introdotti da C ++ / CLI (vedi http://www2.research.att.com/~bs/bs_faq.html#CppCLI ) Significa comunque che dovrai comunque devi studiare COM se vuoi usare WinRT.
La vera domanda è "perché è necessario COM? perché Microsoft ha dovuto inventarlo? ' Perché il semplice C ++ senza tutte le funzionalità aggiunte di COM è inadeguato per il vero lavoro OOP e le affermazioni di Stroustrup sul C ++ che ti danno "portabilità" sono molto disingenuose alla luce della realtà lavorativa. Vedi http://webmechs.com/webpress/2011/11/c-versus-objective-c-as-api-substrate/