Compilateur vs interpréteur vs JIT : les différences expliquées
Il existe trois manières principales d'exécuter du code source. Un compilateur (ahead-of-time, ou AOT) traduit tout le programme en code machine avant son exécution. Un interpréteur lit et exécute le programme au fur et à mesure, sans produire de fichier de code machine séparé. Un compilateur just-in-time (JIT) commence par interpréter, puis compile en code machine les parties fréquemment utilisées pendant l'exécution du programme. De nombreux langages combinent ces approches.
| Critère | Compilateur (AOT) | Interpréteur | Compilateur JIT |
|---|---|---|---|
| Moment de la traduction du code | Avant l'exécution : tout le programme devient du code machine | Pendant l'exécution : le programme est lu et exécuté pas à pas | Pendant l'exécution : le code fréquemment utilisé est compilé en code machine |
| Démarrage | Rapide (mais nécessite d'abord une étape de build) | Rapide, sans étape de build | Plus lent au début, jusqu'à ce que le code soit « chaud » |
| Vitesse d'exécution | La plus rapide et la plus prévisible | La plus lente, souvent plusieurs fois plus lente que le code compilé | Proche de celle du code compilé après le warm-up, parfois plus rapide grâce aux informations d'exécution |
| Portabilité | Un binaire par plateforme | Portable : fonctionne partout où l'interpréteur existe | Bytecode portable, avec un runtime spécifique à la plateforme |
| Détection des erreurs | De nombreuses erreurs sont détectées à la compilation | Les erreurs apparaissent lorsque la ligne fautive s'exécute | Dépend du langage |
| Utilisation mémoire | Faible surcoût à l'exécution | L'interpréteur lui-même reste en mémoire | Mémoire supplémentaire pour le compilateur et le cache de code compilé |
| Cycle de développement | Modifier, compiler, exécuter | Modifier et exécuter immédiatement | Généralement modifier et exécuter, ou compiler en bytecode |
| Exemples de langages | C, C++, Rust, Go | Python classique (CPython), Ruby, scripts shell | Java (HotSpot), JavaScript (V8), C# (.NET), PyPy |
Les valeurs indiquées sont des ordres de grandeur typiques et varient selon la génération de procédé et le produit.