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

0
148

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 via l'une des deux méthodes de compilation ou d'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.

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.

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 le Common Language Runtime .NET utilisent la compilation Just-In-Time pour accélérer l'interprète.

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 vue, 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&# 8217 ; pas besoin de 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 succès de performance ?

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 la compilation au moment de l'exécution a évidemment un impact sur les performances par rapport à une compilation directe en bytecode au préalable.

Publicité

Cependant, parce que la compilation JIT est généralement ne doit être exécuté 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 des chronomètres—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 du stress élevé sur le compilateur JIT au début.