Qu'est-ce qu'un compilateur batch?

28

J'ai la citation suivante du cours de mon compilateur (dans le contexte de la coloration des graphiques):

Parce qu'il est lent, la coloration des graphiques a tendance à être utilisée dans les compilateurs par lots, tandis que le balayage linéaire a tendance à être utilisé dans les compilateurs JIT.

Je n'ai pas pu trouver de définition claire en ligne. Alors, qu'est-ce qui fait qu'un compilateur est un compilateur par lots?

Rodrigo
la source
Cette question est hors sujet ici. softwareengineering.stackexchange.com est un meilleur endroit pour demander
Basile Starynkevitch

Réponses:

42

Un compilateur JIT (Just-In-Time) compile le code au moment de l'exécution, c'est-à-dire pendant l'exécution du programme. Par conséquent, le coût de la compilation fait partie du temps d'exécution du programme et doit donc être minimisé.

Le contraire est un compilateur à l'avance (AOT) qui est essentiellement synonyme de "compilateur par lots". Cela convertit le code source en code machine, puis seul le code machine est distribué. Par conséquent, le compilateur peut être très lent car il n'a pas d'impact sur le temps d'exécution du programme résultant.

De nos jours, quand les gens disent «compilateur», ils désignent généralement un compilateur AOT. En effet, le terme "compilateur AOT" n'a vraiment commencé à devenir populaire que récemment lorsque les gens ont commencé à créer des compilateurs AOT pour les langages compilés JIT, en particulier JavaScript. Beaucoup de ces langages, par exemple C #, se compilent en un langage intermédiaire pour une VM qui est ensuite compilé JIT pour coder la machine au moment de l'exécution. Le terme "compilateur AOT" a la connotation que le code source sera compilé directement en code machine, donc aucune forme de compilation JIT n'est requise au moment de l'exécution.

"Compilateur par lots" est un peu un terme archaïque à ce stade. Le vrai contraste avec un compilateur par lots lorsque le terme était populaire était un compilateur incrémentiel . La compilation incrémentielle est souvent associée à des langages comme Lisp où vous disposiez d'un REPL et vous pouvez demander interactivement l'implémentation du langage pour compiler une fonction spécifique. Si une fonction était exécutée dont la compilation n'avait pas été demandée auparavant, elle serait généralement interprétée. Un compilateur par lots, en revanche, a compilé toutes les fonctions à la fois, c'est-à-dire dans un lot.

Derek Elkins
la source
1
Et de retour dans le passé, les complicateurs qui n'exécutaient pas du tout de manière interactive devaient soumettre un travail à une file d'attente par lots afin de compiler votre programme
Neuromancer
Et certaines implémentations de langage (awk GNU, cpython et ainsi de suite) compilent la totalité de l'entrée d'une représentation interne comme première étape au moment de l'exécution, qui mélange certaines des propriétés décrites ici.
dmckee
1
@dmckee la plupart sinon toutes les implémentations de langage, en fait
user253751
Autre ambiguïté: des outils appelés compilateurs batch existaient pour les systèmes d'exploitation MSDOS, ces fichiers batch compilés en fichiers exécutables ....
rackandboneman
Bien sûr, il y a toujours une représentation interne. Mais parfois c'est une langue à part entière, comme dans Gcc, Llvm ou .Net. Cela est dû à l'architecture frontale / intermédiaire / principale, le frontal transformant le langage (C, C ++, Java, fortran ..) en un langage commun de bas niveau, puis les algorithmes d'optimisation sont exécutés, et enfin ce code optimisé dans le langage commun est transformé par le back-end en bytecode ou assembleur, exécutable ou bibliothèque statique ou dynamique.
reuns
11

Le sens est impliqué dans la citation que vous donnez! Il découle du terme informatique traitement par lots qui est utilisé lorsque la tâche n'est pas effectuée en temps réel, mais il est prévu pour une exécution ultérieure par le système d'exploitation lorsque la charge (souvent pour les activités en temps réel) est moindre.

Un compilateur par lots est celui qui effectue la compilation lorsqu'un utilisateur n'attend pas le résultat de la compilation. C'est celle que nous dirions, en utilisant une terminologie plus moderne, faite en arrière-plan.

C'est l'inverse d'un JIT (Just-In-Time) qui se fait "en direct" au moment exact où il est nécessaire sans avoir le luxe de passer le temps supplémentaire pour effectuer le traitement de manière plus approfondie.

La vitesse plus lente de la compilation par lots peut être illustrée par ceci:

entrez la description de l'image ici

Source: https://xkcd.com/303/

Ou même ceci:

entrez la description de l'image ici

Source: http://dilbert.com/strip/2013-06-22

Brian Tompsett - 汤 莱恩
la source