Un code intermédiaire ou bytecode est un langage de programmation qui sert de passerelle entre un langage de programmation de haut niveau et le code machine lu par les microprocesseurs des ordinateurs. Ce code intermédiaire est une traduction du langage de haut niveau, qu'un interprète retranscrit ensuite en un langage machine que le matériel informatique peut traiter.
Un exemple bien connu de code intermédiaire est le code dit code à trois voies, où chaque instruction de ce code opère sur trois éléments : deux opérandes et un résultat.
Pourquoi avons-nous besoin d'un code intermédiaire ? Principalement pour des raisons pratiques de compatibilité. Le code intermédiaire est généré indépendamment des exigences techniques du matériel ou de la plate-forme sur lequel il doit être traduit, de sorte qu'il peut être converti et adapté à différents systèmes d'exploitation et systèmes informatiques.
Comment fonctionne le code intermédiaire ?
Imaginons que nous voulions programmer une application informatique en Python. À un moment donné, nous devrons transformer le code Python en un langage intermédiaire ou bytecode. Il s'agit donc du processus de génération du code intermédiaire :
Génération de code de haut niveau
Un développeur crée des logiciels programmés avec Python, ou tout autre langage de programmation de haut niveau que d'autres développeurs peuvent lire. Dans de nombreux cas, les développeurs écrivent le code des programmes en environnements de développement intégrés qui disposent d'un large éventail d'outils. Cependant, il n'en reste pas moins qu'il est nécessaire d'avoir une vision globale de la situation, dans cet environnement, le code ne peut pas être traduit à un langage lisible par le matériel.
Compilation en code intermédiaire
Un compilateur est l'outil par excellence qui convertit le code source en code intermédiaire. Ce programme traduit les chaînes du code source en code intermédiaire, ou au code machine ou à tout autre langage de programmation par le biais d'une analyse lexicale, syntaxique et sémantique.
Traduction finale du code machine
Un interprète, une machine virtuelle, est installé sur tous les systèmes informatiques où l'application doit être testée. Il effectuera les tâches suivantes traduction finale du code intermédiaire en code machine composé de nombres binaires (1 ou 0) afin que les processeurs informatiques puissent traiter le code final et l'exécuter.
Il convient de mentionner que la machine virtuelle qui sert d'interprète n'est pas interchangeable entre les différents systèmes d'exploitation ou entre les différents types de machines virtuelles. les architectures informatiques, Chacune d'entre elles nécessite un interprète aux caractéristiques très spécifiques.
Langages de programmation utilisant le code intermédiaire
Plusieurs langages de programmation utilisent un code intermédiaire dans le cadre de leur processus de compilation ou d'interprétation. En voici quelques-uns :
-
Java : Le code source Java est compilé en bytecode, puis interprété en code machine par la machine virtuelle Java.
-
C# : Le code source de C# est compilé en CIL (Common Intermediate Language), également connu sous le nom de MSIL (Microsoft Intermediate Language). Le Common Language Runtime exécute le code, la machine virtuelle .NET.
-
JavaScript : En particulier dans les moteurs avancés tels que V8 dans Google Chrome et Node.js, JavaScript compile également le code source en bytecode.
Exemple de langue intermédiaire
Ce bytecode est généré par Javac, le compilateur Javay, et est exécutable dans une machine virtuelle Java (JVM).
Tout d'abord, créons un simple programme Java ad hoc pour l'exemple qui nous occupe :
public class HelloWorld {
public static void main(String[] args) {
System.out.println(«Hello, World !») ;
}
}
Lorsque ce code est compilé à l'aide de la commande javac HelloWorld.java, un fichier bytecode appelé HelloWorld.class est généré. Le contenu de ce fichier n'est pas orienté vers la lisibilité humaine, mais peut être décompilé avec des outils tels que javap (inclus dans le JDK).
Si nous lançons javap -c HelloWorld.class, nous obtiendrons une représentation du bytecode dans un format plus lisible. Ce bytecode est une représentation intermédiaire entre le code source de haut niveau (Java) et le code machine spécifique à la plate-forme. Par la suite, la machine virtuelle l'interprétera en fonction du matériel spécifique pour lequel elle doit le traduire :
Compilé à partir de «HolaMundo.java».»
public class HelloWorld {
public HelloWorld() ;
Code :
0 : aload_0
1 : invokespecial #1 // Méthode java/lang/Objet.»» :()V
4 : retour
public static void main(java.lang.String[]) ;
Code :
0 : getstatic #2 // Champ java/lang/System.out:Ljava/io/PrintStream ;
3: ldc #3 // String ¡Hola, Mundo!
5: invokevirtual #4 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
8: return
}



