Chapitre 1
Compilation
e chapitre ne constitue pas un cours de compilation, naturellement, mais donne les bases n´ecessaires `a
l’utilisation raisonn´ee d’un compilateur. Apr`es une pr´esentation tr`es g´en´erale d’un ordinateur, nous fe-
rons la diff´erence entre langage machine, assembleur et langages de haut niveau. Ensuite nous ´etudierons
les diff´erentes phases dans la compilation d’un logiciel.
1 Mod`ele de l’ordinateur
Le mod`ele d’ordinateur encore utilis´e aujourd’hui correspond `a l’architecture de Von Neumann. Ce dernier, math´ematicien
hongrois, l’a propos´ee en 1945. Le mod`ele est sch´ematis´e sur la figure 1.1.
Registres
Unit´e arithm´etique
Unit´e de
contrˆole
Unit´e d’entr´ees
sorties
M´emoire contenant les programmes
et les donn´es
Fig. 1.1 – Mod`ele de Von Neumann
Le processeur de l’ordinateur, qui regroupe l’unit´e de contrˆole, l’unit´e arithm´etique et l’unit´e d’entr´ees/sorties
est un condens´e d’´electronique, capable d’effectuer des actions qui ont ´et´e cˆabl´ees. Ces actions, tr`es primitives,
constituent le jeu d’instructions de la machine. Programmer un ordinateur consiste `a lui indiquer les instructions
(les actions) qu’il doit effectuer, dans l’ordre. Un tel programme est dit programme en langage machine, et c’est le
seul langage que l’ordinateur connaˆıt. Les actions possibles sont, par exemple, consulter le contenu de la m´emoire
ou des registres, y ´ecrire, d´eclencher une op´eration d’entr´ees/sorties, ou bien modifier le d´eroulement du programme
lui-mˆeme en omettant d’ex´ecuter certains actions, ou en ex´ecutant `a nouveau certaines d’entre elles. Un processeur
peut ex´ecuter une seule instruction `a la fois (en premi`ere approximation).
Le texte du programme lui-mˆeme est ´ecrit dans la m´emoire. C’est le syst`eme d’exploitation (qui est lui mˆeme un
programme, et qui est lanc´e au d´emarrage de la machine1) qui se charge d’ex´ecuter tel ou tel programme inscrit
en m´emoire.
2 Langage machine
Un programme en langage machine est difficilement lisible. Il est uniquement constitu´e de nombres. Certains de
ces nombres codent les actions `a effectuer, et d’autres, par exemple, des adresses en m´emoire, ou des valeurs.
On peut imaginer que chaque action, avec ses op´erandes, est cod´ee sur un nombre de 8 bits. Les deux premiers
identifient l’op´eration, le suivant un num´ero de registre et les cinq suivants une adresse en m´emoire. L’op´eration
de charger (Load) le contenu de l’adresse 12 dans le registre A (num´erot´e 0) sera coee par : 01 0 01100=76 si
1Comme MacOS, GNU/Linux ou Windows.
1
2Compl´ements Algo-Prog – Gea 2–
l’action Load porte le code 01. Naturellement, les microprocesseurs actuels ont un jeu d’instructions plus large et
des donn´ees plus grandes. En conclusion, un programme ´ecrit en langage machine est clairement illisible.
Une autre fa¸con d’´ecrire un programme, plutˆot que sous forme de nombres, constitue le langage assembleur2.
L’instruction pr´ec´edente serait ´ecrite Load A,12, ce qui est d´ej`a plus ´evocateur que 76. N´eanmoins, de nos jours, le
langage assembleur est assez peu utilis´e3. Il a laiss´e sa place `a essentiellement deux types de langages : les langages
compil´es et les langages interpr´et´es. Dans le premier cas (C, C++, Fortran, Pascal, Cobol, Ada, ...), le programmeur
´ecrit le code source de son programme dans un langage ´evolu´e, par exemple le C, qui n’est pas compr´ehensible par
la machine. Puis, un logiciel nomm´e compilateur aura pour tˆache de transformer ce code source en langage machine.
Cette op´eration est appel´ee la compilation. Une fois transform´e en langage machine, le programme est ex´ecutable
par la machine, mais n’est plus compr´ehensible par un humain. Une autre particularit´e des langages compil´es est
que les programmes ex´ecutables sont d´ependants de la plate-forme. Un programme en langage machine est en effet
d´ependant du type de microprocesseur (du type de mat´eriel en g´en´eral), et du syst`eme d’exploitation (`a cause des
appels-syst`emes). Par cons´equent, un programme compil´e sur un PC Intel avec Linux ne fonctionnera pas sur le
mˆeme PC Intel avec Windows, ni sur une machine `a base de 68000 avec Linux...
Un langage interpr´et´e (Basic, Logo, Lisp, Prolog...) s’utilise `a l’aide d’un interpr´eteur. Un interpr´eteur est un
programme qui va lire le code source, et ex´ecuter une `a une, chacune des op´erations qu’il contient. Un programme
´ecrit dans un langage interpr´et´e est souvent plus lent, en moyenne, qu’un programme compil´e, pour la bonne raison
que l’interpr´eteur doit, `a la vol´ee, comprendre et traduire le texte du programme pour demander `a la machine de
l’ex´ecuter.
3 Compilation d’un programme en C
Nous entendons ici par compilation les deux ´etapes suivantes :
la compilation proprement dite ;
puis d’´edition de liens.
La premi`ere ´etape transforme un fichier source C en fichier objet, (`a peu de choses pr`es des bouts de programme
´ecrits en langage machine). L’´etape d’´edition de liens regroupe des fichiers objets entre eux de fa¸con `a obtenir un
programme complet, ´ecrit en langage machine, qui peut ˆetre ex´ecut´e.
La distinction entre les deux ´etapes est souvent n´ecessaire `a la compr´ehension des erreurs. Une erreur de compilation
signifie g´en´eralement que le compilateur n’a pas compris ce qui est inscrit dans le code source. Une erreur d’´edition
de liens signifie souvent qu’il manque quelque chose aux fichiers objets pour cr´eer un programme complet.
La plupart des environnements de d´eveloppement inegr´es (IDE) maintiennent cette diff´erence et la cr´eation d’un
programme s’effectue en deux ´etapes : Compile, puis Link. Avec un compilateur en ligne de commandes comme
gcc, ces deux ´etapes sont distinctes aussi :
gcc -c fic1.c Compilation de fic1.c, cr´eation de fic1.o
gcc -c fic2.c Compilation de fic2.c, cr´eation de fic2.o
gcc -o programme fic1.o fic2.o ´
Edition de lien, les fichiers fic1.o et fic2.o sont regroup´es pour
former le programme nomm´e programme
Ces deux ´etapes peuvent ˆetre regroup´ees en une ligne :
gcc -o programme fic1.c fic2.c mais il n’en reste pas moins vrai que les deux ´etapes sont effectu´ees
successivement.
L’inerˆet de ce type de compilation (dite compilation s´epar´ee) est de minimiser les temps de compilation. Lorsqu’un
fichier est modifi´e, seul celui-ci doit ˆetre recompil´e, et l’´edition de liens doit ´egalement ˆetre refaite.
Lorsqu’une application est compos´ee de plusieurs centaines de fichiers, alors qu’une compilation compl`ete peut
durer plus d’une heure, une recompilation due `a une modification mineure ne prendra que deux ou trois minutes.
Techniquement parlant, il est `a noter qu’un fichier d’en-tˆete .h inclus dans un fichier .c fait partie int´egrante de
ce dernier. Donc la modification d’un .h implique la recompilation de tous les .c l’incluant (ainsi que l’´edition de
liens). Et de mˆeme si l’on modifie un .h inclus dans un autre .h lui-mˆeme inclus dans un .c...
Les IDE se chargent de g´erer et d’optimiser les compilations. En ligne de commandes, un outil sp´ecial est charg´e
de ce travail : la commande make et le fichier Makefile.
2Ce terme est utilis´e par abus. L’assembleur est le logiciel qui transforme un programme ´ecrit sous forme de mn´emoniques en langage
machine. Par extension, on appelle aussi assembleur le langage constitu´e par ces mn´emoniques.
3En ce qui concerne l’informatique domestique. En informatique industrielle ou embarqu´ee, il n’est pas rare d’utiliser l’assembleur.
1. Compilation 3
4 Param´etrer Dev-C++
4.1 Chemins d’inclusions et de biblioth`eques
On suppose que les biblioth`eques install´ees par le programmeur sont situ´ees dans C :/usr/lib et que les fichiers
d’en-tˆete correspondants sont dans C :/usr/include. Ces deux chemins doivent ˆetre pr´ecis´es dans les boˆıtes
suivantes Outils/Options du compilateur/R´epertoires :
Boˆıte 1 Boˆıte 2
4.2 Options d’´edition de liens
Les biblioth`eques `a lier doivent ˆetre pr´ecis´ees dans les options du projet (Projet / Options du projet / Param`etres),
comme indiqu´e sur la boˆıte 3.
4.3 Option ((tous les warnings))
Vous devez prendre l’ahabitude de profiter de toutes les possibilit´es du compilateur pour vous aider. En particulier,
certains Warnings sont pass´es sous silence par d´efaut. Une simple option indique au compilateur qu’il vous pr´evienne
de constructions douteuses et vous permette de gagner beaucoup de temps de d´ebuggage. L’option -Wall doit ˆetre
indiqu´ee `a partir du menu (Projet / Options du projet / Param`etres) comme indiqu´e sur la boˆıte 4.
Boˆıte 3 Boˆıte 4
1 / 3 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans linterface ou les textes ? Ou savez-vous comment améliorer linterface utilisateur de StudyLib ? Nhésitez pas à envoyer vos suggestions. Cest très important pour nous !