# Compilation à la volée

La compilation à la volée (aussi connue sous les noms de traduction dynamique, compilation juste-à-temps ou compilation JAT ; en anglais, just-in-time compilation ou JIT compilation), en programmation informatique, est une technique visant à améliorer la performance de systèmes bytecode-compilés par la traduction de bytecode en code machine natif au moment de l'exécution. La compilation à la volée se fonde sur deux anciennes idées : la compilation de bytecode et la compilation dynamique.

## Description

Dans un système dit bytecode-compilé (anglicisme de bytecode-compiled), le code source est compilé à l'avance ou à la volée (lors de l'exécution) dans une représentation intermédiaire, le bytecode. C'est le cas par exemple des langages Limbo, Smalltalk, Perl, PHP, Python, Ruby, Lua, GNU Common Lisp ou encore Java, entre autres. Le bytecode n'est pas un code machine, c'est-à-dire que ce n'est pas un code optimisé pour un type d'architecture d'ordinateur en particulier. On dit du bytecode qu'il est portable entre différentes architectures. Ce bytecode est ensuite interprété ou bien exécuté par une machine virtuelle, pour dans tous les cas, exécuter le programme.
Dans un environnement de compilation à la volée, la compilation au sens classique du terme, qui produit le bytecode, n'est qu'une première étape d'un processus d'exécution plus complexe. Dans ce cas, le bytecode est déployé sur le système cible, et lorsque ce bytecode est exécuté, le compilateur du langage de programmation, à la volée, le traduit en code machine natif (ie. optimisé pour l'architecture de la machine exécutant le programme). Ceci peut être fait sur un fichier entier, ou spécifiquement sur une fonction du programme.
Le but de cette démarche est de combiner les avantages de la compilation native et du bytecode :
* Normalement, la compilation est faite à l'avance (ahead-of-time), c'est-à-dire qu'elle est réalisée statiquement avant l'exécution du programme, ce qui a pour défaut de figer les capacités du logiciel livré. En particulier, l'analyse du code source original ou encore l'optimisation dirigée par les profils (profile-guided optimization ou PGO) sont accomplies statiquement à la compilation, en amont du déploiement et de l'exécution sur une machine spécifique, ce qui limite les possibilités d'optimisation.
* La compilation à la volée s'adapte dynamiquement à la charge de travail courante du logiciel, en compilant le code « chaud », c'est-à-dire le code le plus utilisé à un moment donné (ce qui peut représenter tout le programme, mais souvent seules certaines parties du programme sont traitées par compilation à la volée). Obtenir du code machine optimisé se fait beaucoup plus rapidement depuis du bytecode que depuis du code source. Comme le bytecode déployé est portable, la compilation à la volée est envisageable pour tout type d'architecture, à la condition d'avoir un compilateur JIT pour cette architecture, ce qui est facilité par le fait que les compilateurs de bytecode en code machine sont plus faciles à écrire que les compilateurs code source - code natif.

## Histoire

La compilation à la volée a été introduite dans le début des années 1980 par l'implémentation commerciale de Smalltalk : VisualWorks. Actuellement, elle est aussi utilisée dans LLVM, la machine virtuelle .NET de Microsoft ou la plupart des implémentations de la machine virtuelle Java.