Qu'est-ce que la compilation juste-à-temps (JIT) ?  – CloudSavvy IT
Agence web » Actualités du digital » Qu’est-ce que la compilation juste-à-temps (JIT) ? –

Qu’est-ce que la compilation juste-à-temps (JIT) ? –

La compilation Just-In-Time, ou JIT, est une technique utilisée par les interpréteurs d’exécution pour des langages comme JavaScript, C# et Java pour rapprocher les vitesses d’exécution des performances natives offertes par les langages binaires précompilés comme C++.

Compilateurs vs interprètes

Les ordinateurs ne savent pas comment exécuter des langages de programmation de haut niveau comme C++, du moins pas directement. Afin de traduire du code lisible par l’homme en quelque chose que votre CPU peut exécuter, il doit être converti. Un ordinateur le fait généralement par l’une des deux méthodes suivantes : la compilation ou l’interprétation.

La compilation implique l’exécution d’un compilateur, un programme qui prend le code source et le convertit en code machine binaire, avant d’exécuter l’application. La compilation a lieu sur l’ordinateur du développeur avant d’être emballée et envoyée. La plupart des exécutables que vous téléchargez sont compilés à un certain niveau pour s’exécuter sur votre machine, et le code compilé est généralement assez rapide car le compilateur peut effectuer des optimisations pour votre machine particulière.

Un compilateur prend le code source et le convertit en code machine binaire avant d'exécuter l'application

Cependant, les compilateurs ont quelques inconvénients. Les programmes doivent être compilés pour des jeux d’instructions CPU spécifiques (comme x86-64 ou ARM). En plus de cela, même les systèmes d’exploitation qui partagent des jeux d’instructions (comme Windows et Linux, qui s’exécutent tous deux sur des processeurs Intel) doivent avoir des programmes compilés séparément en raison des nombreuses différences dans leur fonctionnement.

Cela signifie que pour quelque chose comme JavaScript, qui doit être envoyé sur Internet aux clients connectés, il ne peut pas être compilé à l’avance, car le client peut exécuter n’importe quelle combinaison de jeu d’instructions et de système d’exploitation.

Les interprètes adoptent une approche différente. Un interpréteur est essentiellement un robot logiciel qui prend le code source d’un programme comme un script JavaScript ou Python, et gère l’exécution au moment de l’exécution. Il agit essentiellement comme une couche intermédiaire entre le code source et la machine, se tenant là où un compilateur le traduirait directement.

Un interpréteur prend le code source d'un programme et gère l'exécution au moment de l'exécution.

Cela a le grand avantage de ne pas exiger que le programme soit construit pour une machine particulière ; tant que la machine peut exécuter l’interpréteur Python, elle peut exécuter n’importe quel script Python.

À quoi sert la compilation JIT ?

Malheureusement pour les interprètes, ils sont lents. Un véritable interpréteur doit traduire et gérer chaque instruction, faisant essentiellement le travail d’un compilateur pour chaque exécution. C’est beaucoup de frais généraux, donc en réalité, la plupart des interpréteurs comme le moteur JavaScript V8, la machine virtuelle Java (JVM) et Common Language Runtime de .NET utilisent la compilation Just-In-Time pour accélérer l’interpréteur.

La compilation Just-In-Time est essentiellement un compilateur qui temporise et ne compile le code de chaque fonction que lorsque cela est nécessaire. Chaque fois que vous appelez une fonction, si le compilateur JIT ne l’a pas encore vu, il compilera cette fonction (en appliquant toutes les optimisations pour la machine sur laquelle elle s’exécute) et l’exécutera. La prochaine fois que vous appelez la fonction, elle a déjà le code machine sous la main, il lui suffit donc de le rechercher dans le cache.

Just-In-Time fait référence au fait que l’interpréteur n’a pas à compiler l’ensemble de l’application en une seule fois. C’est certainement possible, mais pour une grande application, cela conduirait à des temps de démarrage très élevés. Il est préférable pour les performances de ne compiler que lorsque cela est nécessaire (c’est-à-dire juste à temps).

La compilation JIT a-t-elle un impact sur les performances ?

JIT n’est littéralement qu’une amélioration des performances par rapport aux interprètes réguliers, donc par rapport à ne pas le faire du tout, c’est beaucoup plus rapide. Cependant, la compilation du code n’est pas particulièrement rapide, donc évidemment, faire de la compilation au moment de l’exécution a un impact sur les performances par rapport à si elle avait été compilée directement en bytecode au préalable.

Cependant, comme la compilation JIT ne doit généralement être exécutée que la première fois qu’une fonction est invoquée, les fonctions couramment utilisées ne verront réellement un impact sur les performances qu’à la première invocation. Vous pouvez tester cela en C# avec StopWatches : ils détectent le « bruit de fond » .NET, y compris le temps passé à faire la compilation JIT lors de la première exécution d’une fonction.

Le principal inconvénient des applications compilées JIT est un temps de démarrage à froid élevé, car des milliers de fonctions appelées au démarrage doivent être compilées dès le début. Certaines applications Web ASP.NET peuvent prendre plus d’une minute à s’amorcer, en partie à cause de la forte sollicitation du compilateur JIT au démarrage.