Compilateur

Une page de Vikidia, l’encyclopédie junior
Aller à la navigation Aller à la recherche
Grace Hopper en 1984.

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.

Exemple de compilation[modifier | modifier le wikicode]

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>

int  main(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
.globl main
    .type  main, @function
main:
.LFB0:
    .cfi_startproc
    pushq  %rbp
    .cfi_def_cfa_offset 16
    .cfi_offset 6, -16
    movq  %rsp, %rbp
    .cfi_def_cfa_register 6
    movl  {{unité|13|$}}, %edx
    movl  $.LC0, %esi
    movl  {{unité|1|$}}, %edi
    call  write
    movl  {{unité|0|$}}, %eax
    leave
    .cfi_def_cfa 7, 8
    ret
    .cfi_endproc
.LFE0:
    .size  main, .-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

 ...
Interrogation.svg Les fichiers binaires ne devraient-ils pas être écrits seulement avec des 0 et des 1 ?

Ç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 :

  • le code source est beaucoup plus simple à comprendre que du binaire ou même le langage d’assemblage ;
  • il est aussi beaucoup plus court à lire et à écrire.

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 !

Différence avec un interpréteur[modifier | modifier le wikicode]

Il ne faut pas confondre le compilateur avec l'interpréteur :

  • Le premier permet de traduire entièrement le code source en code exécutable. Ainsi à partir des fichiers sources, on obtient les fichiers exécutables, qui pourront être utilisés indépendamment. On n'a plus besoin du code source ni du compilateur pour l'exécution.
  • Avec un interpréteur, le code est traduit au fur et à mesure de l'exécution. On n'obtient pas de fichier exécutable : le code machine est donné à exécuter par l'interpréteur pendant qu'il lit le code source. Dans ce cas, le code source et l'interpréteur doivent être utilisés ensemble.

Voir aussi[modifier | modifier le wikicode]

Portail de l'informatique —  Tous les articles sur son histoire, les logiciels, Internet…