Article de reference

Langue intermédiaire commune

Le Common Intermediate Language ( CIL ), anciennement appelé Microsoft Intermediate Language ( MSIL ) ou Intermediate Language ( IL ) , est le jeu d'instructions binaires de lan...

de langage intermédiaire défini dans la spécification Common Language Infrastructure (CLI) . Les instructions CIL sont exécutées par un environnement d'exécution compatible CIL, tel que le Common Language Runtime ( CLR). Les langages ciblant le CLI sont compilés en CIL. Le CIL est un bytecode orienté objet et basé sur la pile . Les environnements d'exécution compilent généralement les instructions CIL en code natif à la volée .

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 :

  1. Le code source est converti en bytecode CIL et un assembly CLI est créé.
  2. 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.
  3. Le processeur de l'ordinateur exécute le code natif.

Instructions

des instructions pour les groupes de tâches suivants :

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 :

langage intermédiaire (LI), où 0 est eax et 1 est edx :

méthode doit (à quelques exceptions près) appartenir à une classe. C'est également le cas de cette méthode statique :

constructeur et des membres d'instance . La classe suivante possède un ensemble de méthodes représentant les actions d'un objet Voiture.

infrastructure de langage commune (CLI) enregistre des informations sur les classes compilées sous forme de métadonnées . À l'instar de la bibliothèque de types du modèle objet composant ( COM ) , elle permet aux applications de prendre en charge et de découvrir les interfaces, les classes, les types, les méthodes et les champs de l'assembly. La lecture de ces métadonnées fait partie de la programmation réflexive .

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! ».

Hello , world ! " call void [ mscorlib ] System.Console :: WriteLine ( string ) ret }

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 .

machine virtuelle (VM). Lors de la compilation, les méthodes sont stockées dans des tables et les instructions sous forme d'octets dans le code assembleur, qui est un exécutable portable (PE).

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

Plus d articles de Worldlex Wiki

Revenez a l index pour explorer davantage de pages sur l histoire, la science, la culture, la geographie et la societe en francais.

Explorer l index