Le CIL était initialement connu sous le nom de Microsoft Intermediate Language (MSIL) lors des versions bêta des langages .NET. Suite à la standardisation du C# et de l'interface de ligne de commande (CLI), le bytecode est désormais officiellement appelé CIL. Les définitions de virus de Windows Defender continuent de désigner les binaires compilés avec CIL par le terme MSIL.
langages de programmation en ligne de commande (CLI) , le code source est traduit en code CIL plutôt qu'en code objet spécifique à une plateforme ou un processeur . Le CIL est un jeu d'instructions indépendant du processeur et de la plateforme, exécutable dans tout environnement prenant en charge l'infrastructure de langage commune (CLI), comme le runtime .NET sous Windows ou le runtime Mono multiplateforme . En théorie, cela élimine la nécessité de distribuer différents fichiers exécutables pour différentes plateformes et types de processeurs. Le code CIL est vérifié pour sa sécurité à l'exécution, offrant ainsi une sécurité et une fiabilité supérieures aux fichiers exécutables compilés nativement.Le processus d'exécution se déroule comme suit :
- Le code source est converti en bytecode CIL et un assembly CLI est créé.
- Lors de l'exécution d'un script CIL, son code est traité par le compilateur JIT de l'environnement d'exécution afin de générer du code natif. La compilation anticipée (AOT) peut également être utilisée, ce qui élimine cette étape, mais au détriment de la portabilité du fichier exécutable.
- Le processeur de l'ordinateur exécute le code natif.
Instructions
- Charger et stocker
- Arithmétique
- Conversion de type
- Création et manipulation d'objets
- Gestion de la pile d'opérandes (push / pop)
- Transfert de contrôle (ramification)
- Appel de méthode et retour
- Levée d'exceptions
- Concurrence basée sur la surveillance
- Manipulation des pointeurs de données et de fonctions nécessaire pour le code C++/CLI et le code C# non sécurisé
Modèle informatique
Le langage intermédiaire commun est orienté objet et basé sur une pile , ce qui signifie que les paramètres et les résultats des instructions sont conservés sur une seule pile au lieu d'être stockés dans plusieurs registres ou autres emplacements mémoire, comme dans la plupart des langages de programmation .
Code qui additionne deux nombres en langage assembleur x86 , où eax et edx spécifient deux registres à usage général différents :
Les métadonnées peuvent prendre la forme d' attributs . Ces attributs sont personnalisables par extension de la Attributeclasse. Cette fonctionnalité puissante permet au créateur de la classe de l'enrichir d'informations supplémentaires que les utilisateurs pourront exploiter de diverses manières pertinentes, selon le domaine d'application.
Exemple
Voici un programme basique « Hello, World! » écrit en assembleur CIL. Il affichera la chaîne de caractères « Hello, world! ».
Le code suivant est plus complexe en termes de nombre d'opcodes.
Ce code peut également être comparé au code correspondant dans l'article sur le bytecode Java .
Génération
Un assemblage CIL et des instructions sont générés soit par un compilateur, soit par un utilitaire appelé IL Assembler ( ILAsm ) qui est fourni avec l'environnement d'exécution.
Le CIL assemblé peut également être désassemblé en code source à l'aide de l'outil IL Disassembler (ILDASM). D'autres outils, tels que .NET Reflector , permettent de décompiler le CIL en un langage de haut niveau (par exemple , C# ou Visual Basic ). Cette caractéristique rend le CIL particulièrement vulnérable à la rétro-ingénierie, tout comme le bytecode Java . Cependant, certains outils permettent d'obfusquer le code, le rendant ainsi difficilement lisible tout en restant exécutable.
Exécution
Compilation juste à temps
La compilation à la volée (JIT) consiste à transformer le bytecode en code immédiatement exécutable par le processeur. Cette conversion est effectuée progressivement pendant l'exécution du programme. La compilation JIT offre une optimisation spécifique à l'environnement et une vérification du code assembleur. Pour ce faire, le compilateur JIT examine les métadonnées assembleur afin de détecter tout accès illégal et de traiter les violations de manière appropriée.
Compilation anticipée
Les environnements d'exécution compatibles avec l'interface de ligne de commande (CLI) offrent également la possibilité d'effectuer une compilation anticipée (AOT) d'un assemblage afin d'accélérer son exécution en supprimant le processus JIT lors de l'exécution.
Dans le framework .NET, un outil dédié, le générateur d'images natives (NGEN), effectue la compilation AOT. CoreRT propose une approche différente pour la compilation AOT : il permet de compiler du code .NET Core en un seul exécutable, sans dépendance à un environnement d'exécution. Mono prend également en charge la compilation AOT.
Instructions de pointeur - C++/CLI
Une différence notable par rapport au bytecode de Java est que le CIL est livré avec des instructions Revenez a l index pour explorer davantage de pages sur l histoire, la science, la culture, la geographie et la societe en francais.
Plus d articles de Worldlex Wiki