J'ai vu cette belle image ici . J'ai appris que tous les compilateurs qui prennent en charge le langage .net convertissent le code source au CIL
format. Désormais, Microsoft n'intègre jamais .NET
tout le système d'exploitation en écrivant un CLR pour tous les systèmes d'exploitation. Alors pourquoi garder un tel format de code intermédiaire et un CLR pour exécuter ce CIL. N'est-ce pas un casse-tête à gérer. Pourquoi Microsoft a-t-il choisi d'être comme ça?
EDIT Cette architecture a un prix. Cela réduira les performances, non? Java le fait pour maintenir l'indépendance de la plate-forme, pour quelle raison .NET le fait-il? Pourquoi ne pas garder un simple compilateur en C simple. De toute façon, il faudra également un compilateur pour convertir le code en CIL si j'ai besoin d'ajouter une nouvelle langue, la seule différence que cela ferait est la langue cible. Tat est tout.
Réponses:
Parce qu'ils n'ont besoin d'écrire qu'un seul compilateur pour C # vers CIL - ce qui est la partie difficile. Faire un interprète (ou plus souvent, un compilateur Just-In-Time) pour le CIL par plate-forme est relativement facile par rapport à l'écriture d'un compilateur de C # en (par plate-forme) de code exécutable.
Au-delà, le runtime peut gérer tout ce qui se compile en CIL. Si vous voulez un nouveau langage (comme F #), vous n'avez qu'à écrire un compilateur pour celui-ci et vous obtenez automatiquement tout le support de la plate-forme pour les choses que .NET prend en charge.
Oh, et je peux prendre une DLL .NET et l'exécuter sur Windows ou sur Linux via Mono sans recompilation (en supposant que toutes mes dépendances sont satisfaites).
Quant aux performances, c'est discutable. Il existe essentiellement des "pré-compilateurs" qui prennent le CIL et font des binaires natifs. D'autres soutiennent que les compilateurs juste à temps peuvent faire des optimisations que les compilateurs statiques ne peuvent tout simplement pas. D'après mon expérience, cela dépend beaucoup de ce que fait votre application et de la plate-forme sur laquelle vous l'exécutez (principalement la qualité du JITer sur cette plate-forme). Il est extrêmement rare pour moi de rencontrer un scénario où .NET n'était pas assez bon .
la source
readonly
champs. Les compilateurs traditionnels peuvent effectuer certaines de ces optimisations, mais uniquement lorsqu'ils peuvent être détectés par une analyse statique. En revanche, une gigue peut découvrir lors de l'exécution que (par exemple) une section de code ne fait aucun travail utile parce que les objets ou les variables qu'elle modifie ne sont référencés nulle part ailleurs. Je ne suis pas un expert de la gigue, mais c'est essentiellement une question de puissance de l'analyse dynamique vs statique..NET possède un langage intermédiaire (CIL / MSIL) et des implémentations spécifiques à la plate-forme d'un runtime indépendant de la plate-forme (CLR) pour la même raison que Java. Microsoft avait l'intention que C # soit en concurrence directe avec Java, et il le fait, sur les systèmes d'exploitation que Microsoft cible (le sien).
Les avantages, même si .NET n'est pris en charge que sur les plates-formes Windows (ou d'autres systèmes d'exploitation qui ont un travail similaire à .NET comme Mono / Linux), sont similaires à Java:
Pour des raisons antitrust, MS fait attention à ne pas être vu "interférer" trop fortement dans d'autres plates-formes majeures comme Android, Mac OSX / iOS et Linux; cependant, il dispose en effet d'équipes développant pour ces trois plates-formes. Il existe une version développée par MS pour Office pour OSX, il existe de nombreuses applications, y compris les applications Office Interop pour iOS et Android, Skype (maintenant un produit Microsoft) fonctionne sur Linux, et Microsoft a même été vu contribuer au noyau Linux (principalement dans un état d'esprit de virtualisation).
la source
Le système d'exploitation Windows est disponible pour différents types de CPU, aujourd'hui principalement x64, x86, Intel, ARM.
CIL / CLR est indépendant de cette plate-forme matérielle - ces différences sont "résumées" par l'environnement d'exécution IL. Par exemple, un assemblage .NET compilé pour "n'importe quel CPU" peut généralement être exécuté sur Win64 en tant que processus 64 bits et Win32 en tant que processus 32 bits, sans avoir besoin de fournir différents exécutables.
De plus, le CIL permet de stocker des métadonnées dans des assemblages, ce qui n'est pas facilement possible avec des DLL natives (il est possible, bien sûr, que MS ait fait cela auparavant avec des composants COM, mais cette technologie n'a jamais été aussi facile à gérer que les composants .NET). Cela rend la création de composants logiciels beaucoup plus simple et constitue le fondement de la réflexion / introspection dans tous les langages .NET.
la source