Question Que fait un compilateur juste-à-temps (JIT)?


Qu'est-ce qu'un compilateur JIT fait spécifiquement par opposition à un compilateur non-JIT? Quelqu'un peut-il donner une description succincte et facile à comprendre?


432
2017-09-18 18:52


origine


Réponses:


Un compilateur JIT s'exécute après le programme a démarré et compile le code (généralement le bytecode ou des instructions de la machine virtuelle) à la volée (ou juste à temps, comme on l'appelle) dans un formulaire généralement plus rapide, généralement le jeu d'instructions natives du processeur hôte. Un JIT a accès à des informations d’exécution dynamiques alors qu’un compilateur standard n’a pas et peut faire de meilleures optimisations comme l’inclusion de fonctions fréquemment utilisées.

Ceci est en contraste avec un compilateur traditionnel qui compile tout le code pour usiner le langage avant le programme est d'abord exécuté.

Pour paraphraser, les compilateurs conventionnels construisent l'intégralité du programme en tant que fichier EXE AVANT la première exécution. Pour les programmes de style plus récents, un assembly est généré avec un pseudocode (code-p). Seulement après l'exécution du programme sur le système d'exploitation (par exemple en double-cliquant sur son icône), le compilateur (JIT) se lancera et générera du code machine (code m) que le processeur Intel ou tout autre système comprendra.


437
2017-09-18 18:55



Au début, un compilateur était chargé de transformer un langage de haut niveau (défini comme niveau supérieur à l'assembleur) en code objet (instructions machine), qui serait ensuite lié (par un éditeur de liens) à un exécutable.

À un moment de l'évolution des langages, les compilateurs compileraient un langage de haut niveau en pseudo-code, qui serait ensuite interprété (par un interprète) pour exécuter votre programme. Cela a éliminé le code objet et les exécutables, et a permis à ces langages d'être portables sur plusieurs systèmes d'exploitation et plates-formes matérielles. Pascal (qui compilé en P-Code) était l'un des premiers; Java et C # sont des exemples plus récents. Finalement, le terme P-Code a été remplacé par bytecode, car la plupart des pseudo-opérations ont un octet de long.

Un compilateur Just-In-Time (JIT) est une fonctionnalité de l'interpréteur d'exécution qui, au lieu d'interpréter le bytecode chaque fois qu'une méthode est invoquée, compile le bytecode dans les instructions du code machine de la machine en cours d'exécution, puis l'invoque code objet à la place. Idéalement, l'efficacité de l'exécution du code objet surmontera l'inefficacité de la recompilation du programme à chaque exécution.


227
2017-09-18 19:06



JIT-Juste à temps le mot lui-même dit quand c'est nécessaire (sur demande)

Scénario typique:

Le code source est complètement converti en code machine

Scénario JIT:

Le code source sera converti en langage assembleur comme la structure [pour ex IL (langage intermédiaire) pour C #, ByteCode pour java].

Le code intermédiaire est converti en langage machine uniquement lorsque les codes requis sont uniquement convertis en code machine.

JIT vs comparaison non-JIT:

  • Dans JIT tout le code n'est pas converti en code machine d'abord une partie du code qui sera nécessaire sera converti en code machine alors si une méthode ou une fonctionnalité appelée n'est pas dans la machine alors que sera transformé en code machine ... il réduit la charge sur le processeur.

  • Comme le code machine sera généré au moment de l'exécution ... le JIT le compilateur produira un code machine optimisé pour fonctionner l'architecture du processeur de la machine.

Exemples JIT:

  1. En Java JIT est dans JVM (Java Virtual Machine)
  2. En C # c'est en CLR (Common Language Runtime)
  3. Dans Android, il est en DVM (machine virtuelle Dalvik) ou ART (Android RunTime) dans les nouvelles versions.

60
2018-04-29 08:55



Comme d'autres l'ont mentionné

JIT signifie Just-in-Time, ce qui signifie que le code est compilé lorsque cela est nécessaire, pas avant l'exécution. 

Juste pour ajouter un point à la discussion ci-dessus, la JVM conserve un compte à partir du nombre de fois qu'une fonction est exécutée. Si ce nombre dépasse une limite prédéfinie, JIT compile le code en langage machine qui peut être directement exécuté par le processeur (contrairement au cas normal où javac compile le code en bytecode puis java - l'interprète interprète ce bytecode ligne par ligne pour le convertir en code machine et exécute).

La prochaine fois que cette fonction est calculée, le même code compilé est exécuté à nouveau, contrairement à l’interprétation normale selon laquelle le code est à nouveau interprété ligne par ligne. Cela rend l'exécution plus rapide.


23
2017-12-10 13:20



JIT signifie Just-in-Time, ce qui signifie que le code est compilé lorsque cela est nécessaire, pas avant l'exécution.

Cela est bénéfique car le compilateur peut générer du code optimisé pour votre machine particulière. Un compilateur statique, comme votre compilateur C moyen, compilera tout le code sur le code exécutable sur la machine du développeur. Par conséquent, le compilateur effectuera des optimisations basées sur certaines hypothèses. Il peut se compiler plus lentement et faire plus d’optimisations car cela ne ralentit pas l’exécution du programme pour l’utilisateur.


9
2017-09-18 19:00



Après que le code byte (qui est neutre pour l'architecture) a été généré par le compilateur Java, l'exécution sera gérée par la JVM (en Java). Le code d’octet sera chargé dans JVM par le chargeur, puis chaque instruction d’octet sera interprétée.

Lorsque nous devons appeler une méthode plusieurs fois, nous devons interpréter le même code plusieurs fois et cela peut prendre plus de temps que nécessaire. Nous avons donc les compilateurs JIT (juste à temps). Lorsque l'octet a été chargé dans JVM (son temps d'exécution), le code entier sera compilé plutôt qu'interprété, ce qui économise du temps.

Les compilateurs JIT ne fonctionnent que pendant l'exécution, nous n'avons donc pas de sortie binaire.


9
2017-08-10 08:46



Le compilateur JIT ne compile que le code d’octet en code natif équivalent lors de la première exécution. A chaque exécution successive, la JVM utilise simplement le code natif déjà compilé pour optimiser les performances.

enter image description here

Sans compilateur JIT, l'interpréteur JVM traduit le byte-code ligne par ligne pour le faire apparaître comme si une application native est en cours d'exécution.

enter image description here

La source


7
2018-01-19 04:37



Compilateur Just In Time (JIT):
Il compile les bytecodes Java en instructions machine de ce CPU spécifique.

Par exemple, si nous avons une instruction de boucle dans notre code Java:

while(i<10){
    // ...
    a=a+i;
    // ...
 }

Le code de boucle ci-dessus s'exécute 10 fois si la valeur de i est 0.

Il n'est pas nécessaire de compiler le bytecode 10 fois encore car la même instruction va être exécutée 10 fois. Dans ce cas, il est nécessaire de compiler ce code une seule fois et la valeur peut être modifiée pour le nombre de fois requis. Ainsi, le compilateur Just In Time (JIT) garde la trace de ces instructions et méthodes (comme indiqué précédemment) et compile ces éléments de code octet en code machine pour de meilleures performances.

Un autre exemple similaire est la recherche d'un motif utilisant "Regular Expression" dans une liste de chaînes / phrases.

JIT Compiler ne compile pas tout le code en code machine. Il compile le code qui a un modèle similaire au moment de l'exécution.

Regarde ça Documentation Oracle sur Understand JIT pour en savoir plus


6
2018-02-27 02:25



Vous avez du code qui est complétée dans une certaine IL (langue intermédiaire). Lorsque vous exécutez votre programme, l'ordinateur ne comprend pas ce code. Il comprend seulement le code natif. Ainsi, le compilateur JIT compile votre IL en code natif à la volée. Cela se fait au niveau de la méthode.


4
2017-09-18 18:56