![]() |
VOOZH | about |
En informatique, un compilateur est un programme qui traduit un fichier de code source (écrit dans un certain langage de programmation) en un autre fichier contenant du langage d’assemblage et décrivant un programme équivalent. Le fichier ainsi créé, écrit en langage d’assemblage, n’aura ensuite plus qu’à être traduit en binaire (c'est-à-dire en « langage machine ») pour être compris par l’ordinateur, qui pourra alors l'exécuter.
Chaque langage de programmation a son propre compilateur. Le premier compilateur a été écrit par Grace Hopper. L’un des compilateurs les plus connus aujourd’hui est le compilateur écrit par Richard Stallman pour le langage C, gcc. En réalité, ce n’est pas seulement un compilateur mais une suite de logiciels dont un compilateur, cc1.
Un exemple en C : un fichier test.c contient le code source suivant…
// On a besoin de la fonction "write" qui se trouve dans le fichier "unistd.h", donc on inclut ce fichier #include<unistd.h> intmain(void)// La fonction principale du programme (et la seule) { // Affiche {{"|Hello World!}} suivi d’un retour à la ligne (\n) sur l’écran write(STDOUT_FILENO,"Hello World!\n",13); // Sort du programme return(0); }
Le compilateur transforme ce fichier source en fichier objet, écrit en langage d’assemblage :
.file"test.c" .section.rodata .LC0: .string"Hello World!\n" .text .globlmain .typemain,@function main: .LFB0: .cfi_startproc pushq%rbp .cfi_def_cfa_offset16 .cfi_offset6,-16 movq%rsp,%rbp .cfi_def_cfa_register6 movl{{unité|13|$}},%edx movl$.LC0,%esi movl{{unité|1|$}},%edi callwrite movl{{unité|0|$}},%eax leave .cfi_def_cfa7,8 ret .cfi_endproc .LFE0: .sizemain,.-main .ident"GCC: (GNU) 4.5.1 20100924 (Red Hat 4.5.1-4)" .section.note.GNU-stack,"",@progbits
Puis l’assembleur et l’éditeur de liens finissent le travail pour produire un fichier binaire, illisible par un humain :
... 48 83 ec 08 e8 73 00 00 00 e8 02 01 00 00 e8 ed 01 00 00 48 83 c4 08 c3 ff 35 ba 04 20 00 ff 25 bc 04 20 00 0f 1f 40 00 ff 25 ba 04 20 00 68 00 00 00 00 e9 e0 ff ff ff ff 25 b2 04 20 00 68 01 31 ed 49 89 d1 5e 48 89 e2 48 83 e4 f0 50 54 49 c7 c0 80 05 40 00 48 c7 c1 f0 04 40 00 48 c7 c7 eb b0 06 60 00 48 c1 fb 03 48 83 eb 01 48 39 d8 73 24 66 0f 1f 44 00 00 48 83 c0 01 48 89 05 25 48 89 6c 24 d8 4c 89 64 24 e0 48 8d 2d 9b 01 20 00 4c 8d 25 94 01 20 00 4c 89 6c 24 e8 4c 89 74 24 f0 4c 89 7c 24 f8 48 89 5c 24 d0 48 83 ec 38 4c 29 e5 41 89 fd 49 89 f6 48 c1 fd 03 49 89 d7 ...
Ça n'a aucune importance, car il s'agit simplement d'une façon comme une autre de représenter les mêmes nombres. Ici, plutôt que d’utiliser le binaire, on a écrit en hexadécimal, qui prend quatre fois moins de place. Pour cette raison, l’hexadécimal est très employé à la place du binaire.
L’exemple précédent permet de comprendre les différentes utilités d’un langage de programmation :
De plus, chaque processeur peut avoir un langage d’assemblage différent des autres, ce qui fait que le code d’assemblage présenté plus haut a peu de chances de fonctionner sur un autre ordinateur pris au hasard. En revanche, le programme écrit en C n’est pas à adapter pour fonctionner sur tous les ordinateurs : lorsqu’il est recompilé, l’assembleur produit est automatiquement adapté à l’ordinateur qui compile !
Il ne faut pas confondre le compilateur avec l'interpréteur :
Portail de l'informatique — Tous les articles sur son histoire, les logiciels, Internet…
|