Qu'est-ce qu'un interpréteur ?
Un interpréteur est un programme qui exécute directement le code source, en réalisant ses instructions au fur et à mesure, au lieu de traduire d'abord tout le programme dans un fichier de code machine séparé. Les implémentations standard de Python et de Ruby sont des interpréteurs.
Mis à jour le 24 septembre 2026
- 1print("Hello")
- 2total = 2 + 3
- 3print(total)
- 4print("Done")
Chaque exécution traduit de nouveau les lignes. Active la faute de frappe et l'interpréteur affiche quand même « Hello » avant d'atteindre la ligne 3 et de s'arrêter.
Tape python3 hello.py et le résultat s'affiche, mais regarde ensuite le dossier : aucun nouveau fichier de programme n'a été créé. Le programme qui s'est réellement exécuté, c'est python3 lui-même, l'interpréteur Python. Il a lu hello.py, compris ce que signifie chaque instruction et l'a exécutée. Relance le script demain et l'interpréteur relit le code source depuis le début.
Comment fonctionne un interpréteur
Un interpréteur répète un seul cycle jusqu'à la fin du programme : prendre l'instruction suivante, comprendre ce qu'elle signifie, l'exécuter, passer à la suivante. Il garde les variables du programme dans sa propre mémoire pendant qu'il travaille, c'est pourquoi total = price * 3 peut utiliser un price défini quelques lignes plus haut.
Le moyen le plus clair de le voir est le mode interactif, appelé REPL (read, evaluate, print, loop : lire, évaluer, afficher, recommencer). Tape python3 sans nom de fichier et chaque ligne s'exécute dès que tu appuies sur Entrée :
>>> price = 4
>>> price * 3
12
Les vrais interpréteurs ajoutent une étape de préparation. CPython, l'interpréteur Python standard, compile d'abord tout ton fichier en bytecode, une liste compacte d'instructions simples, puis lance une boucle qui exécute ce bytecode une instruction à la fois. Tu peux afficher le bytecode d'une ligne :
Python 3.12 affiche ceci (les autres versions diffèrent dans les détails) :
0 0 RESUME 0
1 2 LOAD_NAME 0 (price)
4 LOAD_CONST 0 (3)
6 BINARY_OP 5 (*)
10 STORE_NAME 1 (total)
12 RETURN_CONST 1 (None)
Chacune de ces lignes est une étape de la boucle de l'interpréteur : récupérer la valeur de price, récupérer la constante 3, les multiplier, ranger le résultat dans total. Rien de tout cela n'est du code machine ; c'est l'interpréteur, lui-même un programme C compilé, qui réalise chaque étape.
Les erreurs apparaissent quand la ligne s'exécute
Comme un interpréteur exécute au fur et à mesure, un programme peut faire un vrai travail avant de tomber sur une erreur. Exécute ceci et les deux premières lignes s'affichent avant le plantage :
Step 1: starting
Step 2: still fine
Traceback (most recent call last):
...
ZeroDivisionError: division by zero
Une erreur de syntaxe se comporte différemment, parce que CPython compile tout le fichier en bytecode avant d'en exécuter la moindre partie. Remplace la ligne 3 par print("Step 3:" 10) (il manque la virgule) et rien ne s'affiche, pas même Step 1 :
SyntaxError: invalid syntax. Perhaps you forgot a comma?
Dire qu'« un interpréteur exécute le code ligne par ligne » n'est donc vrai qu'à moitié. La grammaire est vérifiée d'abord pour tout le fichier ; tout le reste, comme une division par zéro ou l'utilisation d'un nom qui n'existe pas, n'est détecté qu'au moment où la ligne s'exécute. Voir erreur de syntaxe pour le premier cas.
Compilateur ou interpréteur
Un compilateur traduit tout le programme dans un fichier séparé avant son exécution. Un interpréteur exécute le programme lui-même, à chaque fois. Les différences pratiques en découlent :
| Compilateur | Interpréteur | |
|---|---|---|
| Quand le travail a lieu | Une fois, avant l'exécution du programme | À chaque exécution du programme |
| Résultat | Un fichier séparé (exécutable ou bytecode) | Aucun fichier de programme séparé |
| Ce que tu fournis aux utilisateurs | Le programme compilé | Le code source, plus l'interpréteur installé sur leur machine |
| Vérification des erreurs | Syntaxe et, dans les langages typés, erreurs de type pour tout le programme avant l'exécution | La syntaxe est en général vérifiée d'abord ; les autres erreurs apparaissent quand la ligne fautive s'exécute |
| Modifier et exécuter | Recompiler après chaque modification | Enregistrer et relancer |
| Vitesse | Plus rapide, le processeur exécute directement le code machine | Plus lent, chaque instruction est décodée pendant l'exécution |
| Portabilité | Recompiler pour chaque processeur et système d'exploitation | Le même code source s'exécute partout où l'interpréteur existe |
| Langages typiques | C, C++, Rust, Go | Python, Ruby, PHP, Bash |
L'écart de vitesse est réel pour les boucles de calcul serrées : la même boucle peut s'exécuter bien plus vite en C compilé qu'avec CPython. Pour les programmes qui attendent surtout le réseau, le disque ou l'utilisateur, la différence est souvent trop faible pour être remarquée.
Compilé ou interprété n'est pas une propriété du langage
Un langage est un ensemble de règles ; le compilateur ou l'interpréteur est un programme qui les met en œuvre. Le même langage peut être exécuté des deux façons, et la plupart des langages populaires mélangent les deux :
- Python. CPython compile en bytecode et l'interprète. PyPy, une autre implémentation, ajoute un compilateur à la volée (JIT) qui transforme en code machine le code souvent exécuté pendant que le programme tourne.
- Java.
javaccompile le code source en bytecode à l'avance. La machine virtuelle Java interprète ensuite ce bytecode et compile à la volée les méthodes les plus sollicitées en code machine. Depuis Java 11,java Main.javaexécute directement un fichier source unique en le compilant d'abord en mémoire. - JavaScript. Les navigateurs et Node.js utilisent des moteurs comme V8, qui commencent par interpréter le code et compilent les parties les plus sollicitées en code machine pendant l'exécution.
- C et C++. Presque toujours compilés à l'avance avec GCC, Clang ou MSVC.
python3 app.py # Python: interpreter, bytecode behind the scenes
node app.js # JavaScript: V8 interprets, then JIT-compiles
javac Main.java # Java step 1: compile to Main.class
java Main # Java step 2: the JVM runs the bytecode
Dans tous les cas, l'interpréteur ou la machine virtuelle fait partie de l'environnement d'exécution du programme : il doit être installé partout où le programme s'exécute.
Idées reçues
- « Un interpréteur traduit chaque ligne en code machine. » Un interpréteur classique ne produit jamais de code machine pour ton programme. Il lit une instruction et la réalise avec du code déjà compilé dans l'interpréteur. Produire du code machine pendant l'exécution, c'est ce que fait un compilateur JIT.
- « Les langages interprétés n'ont pas d'étape de compilation. » CPython, YARV (pour Ruby) et PHP compilent tous d'abord en bytecode. L'étape est automatique et invisible, donc facile à ignorer.
- « Interprété veut dire lent. » La compilation JIT a comblé une grande partie de l'écart. V8 exécute JavaScript assez vite pour de grosses applications comme VS Code, construit sur Electron.
- « Python, c'est l'interpréteur. » Python est le langage. CPython, PyPy et MicroPython sont différents interpréteurs pour ce langage, et ils peuvent différer en vitesse et dans les bibliothèques qu'ils prennent en charge.
Pour aller plus loin
Pour l'autre moitié de la comparaison, lis ce qu'est un compilateur et comment il transforme le code source en code machine. La page environnement d'exécution explique ce que l'interpréteur apporte d'autre avec lui. Pour essayer un interpréteur toi-même, exécute un script Python ou ouvre le playground Python.
Questions fréquentes
Python est-il un compilateur ou un interpréteur ?
C++ utilise-t-il un interpréteur ou un compilateur ?
Lequel est le plus rapide, un interpréteur ou un compilateur ?
Qu'est-ce qu'un REPL ?
python3 ou node sans nom de fichier en ouvre un. C'est pratique pour tester une petite idée sans créer de fichier.Un langage peut-il être à la fois compilé et interprété ?
javac, puis interprété et compilé à la volée par la JVM, et il existe à la fois des interpréteurs et des compilateurs pour des langages comme Python et JavaScript.