CIL de Microsoft, diagramme par Scriptol.fr

CIL - Common Intermediate Language

CIL (Langage Intermédiaire Commun) est un bytecode, c'est le langage portable de la plateforme .NET dans lequel sont compilés les codes sources écrits dans les langages de haut niveau. Son fonctionnement est basé sur une pile et il est exécuté par une machine virtuelle.

On l'appelle aussi IL ou MSIL (MicroSoft Intermediate Language) qui était son nom initial avant la standardisation de la CLI (Common Language Infrastructure) dont il fait partie et avec laquelle on ne doit pas le confondre.

Le code source de haut niveau (C#, Basic ou autre langage) est compilé en CIL et stocké dans une assembly (ou un assemblage).
L'assembly reprend le format de fichier PE (Portable Executable) qui est aussi celui des .dll et des .exe, et comprend un fichier manifeste contenant les medadata de l'assemblage, qui est l'interface du code avec les autres composants des logiciels qui l'utilisent.

Ce code est compilé en bytecode pour être interprété par une JIT, ou en binaire pour être directement exécuté par le processeur.

Le langage CIL peut effectuer des opérations arithmétiques, logiques et a des structures de contrôle (boucles, if, etc), fait des appels de fonctions et méthodes, la gestion de pile, le chargement et sauvegarde de données, une conversion de types (nombre en chaîne...), supporte les exceptions et la concurrence.

Programme minimal Hello en langage d'assemblage CIL

.assembly Hello {}  
.method public static void Main() cil managed  
{       
  .entrypoint       
  .maxstack 1       
  ldstr "Salut le Monde!"       
  call void [mscorlib]System.Console::WriteLine(string)       
  ret  
}  

Exemple de bytecode CIL

assemblage           bytecode     rôle
ldarga argNum        FE 0A        récupère l'adresse donnée en argument
brtrue               2D           branchement si résultat vaut vrai
break                01           sortie de boucle                     

Référence: CIL est la partition 3 du standard ECMA-335 qui définit l'infrastructure .NET.

Outils

Voir aussi LLVM, une alternative plus portable encore, qui peut aussi produire du JavaScript à partir de différents langages, et la différence expliquée entre bitcode et bytecode.