0% ont trouvé ce document utile (0 vote)
15 vues25 pages

Compilation

Le document présente les langages informatiques, en distinguant les langages compilés et interprétés, ainsi que leur fonctionnement. Il décrit le processus de compilation d'un programme en C, incluant les étapes de prétraitement, compilation, assemblage et édition de liens. Enfin, il illustre le passage des paramètres dans les fonctions C à travers des exemples de code.

Transféré par

bakarykon312
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PPT, PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
15 vues25 pages

Compilation

Le document présente les langages informatiques, en distinguant les langages compilés et interprétés, ainsi que leur fonctionnement. Il décrit le processus de compilation d'un programme en C, incluant les étapes de prétraitement, compilation, assemblage et édition de liens. Enfin, il illustre le passage des paramètres dans les fonctions C à travers des exemples de code.

Transféré par

bakarykon312
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PPT, PDF, TXT ou lisez en ligne sur Scribd

Notion de Compilation

Dr Mahamadou Abdou TOURE

1
I. Langages Informatiques
Un langage informatique, par opposition aux langages naturels comme le
fran­çais ou l'anglais, est un langage structuré utilisé pour décrire des
actions (ou algo­rithmes) exécutables par un ordinateur.
La principale différence entre les langages informatiques et les langues
natu­relles réside dans l'absence d'ambiguité : alors que certaines phrases
du français peuvent être interprétées différemment par différents
auditeurs, tous seront d'ac­cord pour dire ce que fait un programme
donné.
Historiquement, le premier langage informatique a été l'assembleur. Or,
la programmation en assembleur est souvent fastidieuse, surtout pour
des programmes importants. Plus grave, un programme écrit en
assembleur dépend étroitement du type de machine pour lequel il a été
écrit. Si l'on désire l'adapter à une autre machine ("porter'' le
programme), il faut le réécrire entièrement.

2
I. Langages Informatiques
C'est pour répondre à ces problèmes qu'ont été développés dès les
années 50 des langages de plus haut niveau. Dans ces langages, le
programmeur écrit selon des règles strictes mais dispose
d'instructions et de structures de données plus ex­pressives qu'en
assembleur. Par exemple, dans certains langages comme MATLAB,
on pourra écrire en une ligne que l'on désire multiplier deux
matrices, alors que le programme correspondant en:
Langage C prendrait quelques lignes;
Assembleur prendrait quelques centaines de lignes.

3
I. Langages Informatiques
1. Interpréteurs et Compilateurs:
On distingue grossièrement deux familles de langages informatiques, les
langages interprétés et les langages compilés.
Un programme en langage interprété va être traduit au fur et à mesure de
son exécution par un interpréteur.
interpréteur Un interpréteur est un programme
chargé de­ décoder chaque instruction du langage et d’exécuter les
actions correspondantes.
Dans le cas de programmes compilés, la traduction en langage machine a lieu
une fois pour toute. Le compilateur (traducteur) traduit chaque
instruction du langage en une suite plus ou moins complexe d'instructions
en langage machine. Les programmes compilés s’exécutent ainsi plus
rapidement que les programmes interprétés, car la traduction est déjà
faite. On perd cependant en souplesse de programmation, car les types
de données doivent être connus au moment de la compilation.

4
I. Langages Informatiques
1. Interpréteurs et Compilateurs:
Un compilateur traduit un programme source écrit dans un langage de
haut niveau (par exemple C) en un autre programme dans un
langage de bas niveau (par exemple l'assembleur). Cette opération
de traduction est assez complexe; les compilateurs sont des
programmes sophistiqués, qui ont beaucoup progressé ces
dernières années.

5
I. Langages Informatiques
2. Principaux Langages:
Les principaux langages compilés sont :
C/C++/C# programmation système et scientifique;
VB idem;
ADA logiciels embarqués;
Cobol gestion;
Fortran calcul scientifique;
Pascal enseignement.

6
I. Langages Informatiques
2. Principaux Langages:
Quelques langages interprétés :
BASIC bricolage;
LISP Intelligence Artificielle;
Prolog idem;
Perl traitement de fichier textes;
Python programmation système, internet;
Java "applets'' internet;
MATLAB calcul scientifique;
Mathematica idem.

7
I. Langages Informatiques
2. Principaux Langages:
Notons que la distinction compilé/interprété est parfois floue. Certains
lan­gages, comme LISP, Java ou Python, peuvent subir une première
phase de compi­lation vers un langage intermédiaire (bytecode),
bytecode qui
sera lui même interprété.

8
II. Le C comme langage compilé
Ainsi, un programme C est décrit par un fichier texte, appelé fichier
source. La compilation se décompose en fait en 4 phases successives :
Le traitement par le préprocesseur : le fichier source (portant
l’extension .c) est analysé par le préprocesseur qui effectue des
transformations purement textuelles (remplacement de chaînes de
caractères, inclusion d’autres fichiers sources, compilation
conditionnelle ...).
La compilation : la compilation proprement dite traduit le fichier
généré par le préprocesseur (d’extension .i) en assembleur, c’est-à-
dire en une suite d’instructions du microprocesseur qui utilisent des
mnémoniques rendant la lecture possible.

9
II. Le C comme langage compilé
 L’assemblage : cette opération transforme le code assembleur
(extension .s) en un fichier binaire, c’est-à-dire en instructions
directement compréhensibles par le processeur. Généralement, la
compilation et l’assemblage se font dans la foulée, sauf si l’on
spécifie explicitement que l’on veut le code assembleur. Le fichier
produit par l’assemblage est appelé fichier objet (et porte
l’extension .o). Les fichiers objets correspondant aux librairies
précompilées ont pour suffixe .a.
 L’édition de liens : un programme est souvent séparé en plusieurs
fichiers sources, pour des raisons de clarté mais aussi parce qu’il
fait généralement appel à des librairies de fonctions standards déjà
écrites. Une fois chaque fichier de code source assemblé, il faut
donc lier entre eux les différents fichiers objets. L’édition de liens
produit alors un fichier dit exécutable ([Link] par défaut).
10
II. Le C comme langage compilé
GNU Compiler Collection, abrégé en GCC, GCC est un ensemble de
compilateurs créés par le projet GNU. GCC est un logiciel libre
capable de compiler divers langages de programmation, dont C,
C++, Objective-C, Java, Ada et Fortran.
GCC est utilisé pour le développement de la plupart des logiciels
libres. Le noyau Linux dépend notamment étroitement des
fonctionnalités de GCC.
GCC a été conçu pour remplacer le compilateur C fourni en
standard sur le système d'exploitation Unix, qui s'appelle [Link]
GCC signifiait à l'origine GNU C Compiler,
Compiler soit le « compilateur C
de GNU ».

11
III. Compilation du Langage C
1. Traduction d’un programme simple:
Considérons le programme en langage C suivant :
/* Programme EXEMPLE1.c en langage C */
void main()
{
char X = 11;
char C = 'A’;
int Res;
if (X < 0)
Res = – 1;
else
Res = 1; }
12
III. Compilation du Langage C
1. Traduction d’un programme simple:
Trois variables, X, C et Res sont définies avec ou sans valeur initiale.
Ensuite, on teste le signe de X et range 1 ou –1 dans la variable Res.
Remarquons les points suivants :
La fonction main() est considérée à ce stade comme une procédure
ordinaire (PROC near).
near C'est plus tard, lors de la phase d’édition de lien,
qu'il sera indiqué que la fonction main() correspond au point d'entrée
du programme (=première instruction à exécuter). La fonction est
terminée par l'instruction sur RET.
On n'utilise pas ici de segment de données : toutes les variables sont
allouées sur la pile.

NB: Cette traduction est faite sur les processeurs 80x86


13
III. Compilation du Langage C
1. Traduction d’un programme simple:
Remarquons les points suivants :
L'allocation des variables sur la pile s'effectue simplement en
soustrayant au pointeur SP le nombre d'octets que l'on va utiliser (ici 4,
car 2 variables X et C d'un octet, plus une variable (Res) de 2 octets).
La ligne X = 11 est traduite par MOV byte ptr [bp – 1], 11
Noter l'utilisation de byte ptr pour indiquer que BP contient ici l'adresse
1; d'une donnée de taille octet.
Le test if (X < 0) est traduit par une instruction CMP suivie d'un
branchement conditionnel, utilisant une étiquette placée par le
compilateur (d’où son nom étrange : @1@114).
NB: Cette traduction est faite sur les processeurs 80x86

14
III. Compilation du Langage C
1. Traduction d’un programme simple:
_TEXT SEGMENT byte public 'CODE’
;
; void main() {
;
ASSUME cs:_TEXT
_main PROC near
PUSH BP
MOV BP, SP
SUB SP, 4

15
III. Compilation du Langage C
1. Traduction d’un programme simple:
; char X = 11;
MOV byte ptr [bp – 1], 11
; char C = 'A'; ;
MOV byte ptr [bp – 2], 65
;
; int Res;
; if (X < 0) ;
CMP byte ptr [bp – 1], 0
JGE @1@86

16
III. Compilation du Langage C
1. Traduction d’un programme simple:
; Res = ­-1;
;
MOV word ptr [bp – 4], 65535
JMP @1@114
@1@86:
; else
; Res = 1;
;
MOV word ptr [bp – 4], 1

17
III. Compilation du Langage C
1. Traduction d’un programme simple:
@1@114:
;
;}
;
MOV sp,bp
POP bp s
RET
_main ENDP
_TEXT ENDS
END

18
III. Compilation du Langage C
2. Fonctions C et procédures:
Chaque langage de programmation doit définir une convention de
passage des paramètres lors des appels de procédures ou de
fonctions. Cette convention permet de prévoir l’état de la pile avant,
pendant et après un appel de fonction (dans quel ordre sont empilés
les paramètres? Qui est responsable de leur dépilement ? Comment
est passée la valeur de retour ?)
Etudions à partir d'un exemple simple comment sont passés les
paramètres lors des appels de fonctions en langage C.

19
III. Compilation du Langage C
2. Fonctions C et procédures:
/* Programme EXEMPLE2.C */
int ma_fonction( int x, int y )
{
return x + y;
}
void main()
{
int X = 11;
int Y = 22;
int Res;
Res = ma_fonction(X, Y);
}
20
III. Compilation du Langage C
2. Fonctions C et procédures:
_TEXT SEGMENT byte public 'CODE’
; int ma_finction(int x, int y) {
ASSUME cs:_TEXT
_ma_fonction PROC near
PUSH bp
MOV bp, sp
;
; return x + y;
;
MOV AX, [bp + 4]
ADD AX, [bp + 6]

21
III. Compilation du Langage C
2. Fonctions C et procédures:
;}
POP BP
RET
_ma_fonction ENDP
; void main()
;
ASSUME CS: _TEXT
_main PROC NEAR
PUSH BP
MOV BP, SP
SUB SP, 6

22
III. Compilation du Langage C
2. Fonctions C et procédures:
; int X = 11;
MOV [BP – 2], 11
; int Y = 22;
MOV [BP – 4], 22
; int Res;
; Res = ma_fonction(X, Y);
PUSH WORD PTR [BP – 4]
PUSH WORD PTR [BP – 2]
CALL _ma_fonction
ADD SP, 4
MOV [BP – 6], AX
23
III. Compilation du Langage C
2. Fonctions C et procédures:
; }
MOV sp,bp
POP bp
RET
_main ENDP
_TEXT ENDS
END
En étudiant cet exemple, on constate que :

24
III. Compilation du Langage C
2. Fonctions C et procédures:
la fonction C ma_fonction() a été traduite par une procédure
assembleur nommée _ma_fonction, qui lit ces arguments sur la pile
la fonction ne modifie pas l’état de la pile;
Avant l'appel de la fonction (CALL), les arguments sont empilés
(PUSH). Après le retour de la fonction, le pointeur SP est incrémenté
pour remettre la pile dans son état précédent (ADD sp, 4 est
équivalent à deux instructions POP 2 octets). La valeur retournée par
la fonction est passée dans AX (d’où l'instruction MOV [BP – 6], AX).

25

Vous aimerez peut-être aussi