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.
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é.