Académique Documents
Professionnel Documents
Culture Documents
Christine Paulin-Mohring
Universit Paris Sud
Compilation
2011-2012
1 / 96
Objectifs du cours
Comprendre les principes de construction dun compilateur
Suite
de
caractres
reprsentant
un programme
COMPILATEUR
Programme: description dune suite doprations qui tant donn une entre
va produire un rsultat.
Les oprations sont dcrites dans plusieurs modles de calcul (impratif,
fonctionnel, objet, assembleur . . . )
Compilation
2011-2012
2 / 96
Example (1)
open P r i n t f
l e t _ = l e t sum = r e f 0 i n
f o r i = 1 to 100 do sum : = ! sum + ( i i ) done ;
p r i n t f " R e s u l t : %d \ n " ! sum
Compilation
2011-2012
3 / 96
Example (2)
Byte-code engendr par ocamlc -c:
0
1
2
4
5
6
7
9
10
11
12
13
14
15
17
CONST0
PUSHCONST1
PUSHCONSTINT 100
PUSH
PUSHACC2
GTINT
BRANCHIF 27
CHECK_SIGNALS
ACC1
PUSHACC2
MULINT
PUSHACC3
ADDINT
ASSIGN 2
ACC1
18
19
21
23
24
25
27
28
30
31
33
36
37
39
40
PUSH
OFFSETINT 1
ASSIGN 2
ACC1
NEQ
BRANCHIF 9
CONST0
POP 2
ACC0
PUSHGETGLOBAL "Result : %d\n"
PUSHGETGLOBALFIELD Printf, 1
APPLY2
POP 1
ATOM0
SETGLOBAL Sum
Compilation
2011-2012
4 / 96
Example (3)
Code machine (partiel) engendr par ocamlopt:
00000000
0: 83
3: b9
8: b8
d: 3d
12: 7e
14: 89
17: eb
19: 89
1b: d1
1d: 89
1f: 4b
20: 0f
23: 01
25: 89
.....
<camlSum__entry>:
ec 04
01 00 00 00
03 00 00 00
c9 00 00 00
05
0c 24
1c
c2
fa
c3
af da
d9
0c 24
sub
mov
mov
cmp
jle
mov
jmp
mov
sar
mov
dec
imul
add
mov
Compilation
$0x4,%esp
$0x1,%ecx
$0x3,%eax
$0xc9,%eax
19 <camlSum__entry+0x19>
%ecx,(%esp)
35 <camlSum__entry+0x35>
%eax,%edx
%edx
%eax,%ebx
%ebx
%edx,%ebx
%ebx,%ecx
%ecx,(%esp)
2011-2012
5 / 96
Autres apports
Compilation
2011-2012
6 / 96
Organisation
Compilation
2011-2012
7 / 96
Calendrier prvisionnel
12/09 Cours 1-2 : Introduction aux compilateurs, Analyse lexicale
Cours 3 : Analyse syntaxique
TD 1 - Projet 1
19/09 Cours 4 : Analyse smantique lmentaire
TD 2 - Projet 2
26/09 Cours 5 : Gnration de code 1
TD 3 - Projet 3
03/10 Cours 6 : Gnration de code 2
TD 4 - Projet 4
10/10 Cours 7 : Gnration de code 3
TD 5 - Projet 5
17/10 Pas de cours (?)
TD 6 - Projet 6
24-28/10 Partiel + rattrapage TD 31 octobre (?)
Compilation
2011-2012
8 / 96
Calendrier-suite
Compilation
2011-2012
9 / 96
Pratique
Page WEB du cours :
http://www.lri.fr/~paulin/COMPIL
Page WEB du projet :
http://www.lri.fr/~kn/compil
Coordonnes :
Adresse lectronique
Tlphone
Bureau
Christine.Paulin@lri.fr
01 72 92 59 05
PCRI - bat 650 - bureau 74 (RdC Est)
Compilation
2011-2012
10 / 96
Prrequis
Compilation
2011-2012
11 / 96
Choix de ocaml
Compilation
2011-2012
12 / 96
Bibliographie
Compilation
A. W. Appel. Modern Compiler Implementation in ML. Cambridge
University Press, 1998
J. R. Levine, T. Mason, and D. Brown. Lex & Yacc. Unix Programming
Tools. O Reilly, 1995
ocaml
E. Chailloux, P. Manoury, and B. Pagano. Dveloppement dapplications
avec Objective Caml. OReilly, 2000
Claude March and Ralf Treinen. Formation au langage CAML.
Universit Paris Sud. Notes du Cours LGL
Jean-Christophe Fillitre. Intiation la programmation fonctionnelle.
Universit Paris Sud. Notes de Cours - Master Informatique M1
Assembleur
Jim Larus. Computer Organization and Design: The Hardware/Software
Interface, chapter Assemblers, Linkers, and the SPIM Simulator. Morgan
Kaufmann, 2004.
http://pages.cs.wisc.edu/~larus/HP_AppA.pdf
C. Paulin (Universit Paris Sud)
Compilation
2011-2012
13 / 96
Compilation
2011-2012
14 / 96
Plan-1
Introduction la compilation
Structure dun compilateur, exemple
Quelques notions de smantique
Evaluateur versus compilateur, techniques de construction de
compilateurs
Analyse lexicale et syntaxique
Mise en oeuvre dun analyseur lexical
Analyse descendante, analyse ascendante
Ambiguits et prcdences
Actions smantiques: arbres de syntaxe abstraite
Analyse smantique lmentaire
Analyse de porte
Compilation
2011-2012
15 / 96
Plan-2
Gnration de code
Machines abstraites
Assembleur
Appels de fonctions, rcursion terminale
Allocation de registres
Gestion de la mmoire
Analyse smantique avance
Typage : surcharge, infrence de types
Analyses statiques
Compilation
2011-2012
16 / 96
Rappels de vocabulaire
Alphabet : ensemble fini dobjets appel caractres
Mot (sur un alphabet) : suite finie de caractres.
Le mot vide sera not ;
lopration de concatnation de deux mots m1 et m2 est note par simple
juxtaposition m1 m2 .
Compilation
2011-2012
17 / 96
Exemple
Alphabet
Mot
Langage fini
Langage infini
Reconnaissance
Tranformation
Compilation
2011-2012
18 / 96
Sommaire
Prambule
Introduction la compilation
Description dun compilateur
Exemple - analyse syntaxique
Principes
Mise en uvre
Compilation
2011-2012
19 / 96
Compilation
2011-2012
20 / 96
Compilation
2011-2012
21 / 96
Efficacit
Le compilateur doit tre si possible rapide (en particulier ne pas boucler)
Le compilateur doit produire un code qui sexcutera aussi rapidement
que possible
Correction
Le programme compil doit reprsenter le mme calcul que le
programme original.
Ncessite davoir une description indpendante des calculs reprsents
par les programmes du langage source.
Compilation
2011-2012
22 / 96
Compilation
2011-2012
23 / 96
Compilation
2011-2012
24 / 96
Aprs la compilation
Compilation
2011-2012
25 / 96
Sommaire
Prambule
Introduction la compilation
Description dun compilateur
Exemple - analyse syntaxique
Principes
Mise en uvre
Compilation
2011-2012
26 / 96
Exemple
Compiler un langage A RITH dexpressions arithmtiques vers le code
dune machine pile.
Le langage A RITH se compose dune suite dexpressions:
set ident = expr
print expr
Compilation
2011-2012
27 / 96
Analyse syntaxique
Compilation
2011-2012
28 / 96
<prog>
<inst>
<expr>
<binop>
<unop>
Compilation
2011-2012
29 / 96
Analyse syntaxique
Compilation
2011-2012
30 / 96
set foo = 45
print -3*(foo-2)
Suite de terminaux:
set ident = entier print - entier * ( ident - entier )
Les espaces, retour la ligne sont ignors.
Certaines suites de caractres, sont transformes en un caractre
terminal (mot-cl, identifiant, constante entire).
Certaines suites de caractres sans espaces sont transformes en
plusieurs caractres terminaux.
Compilation
2011-2012
31 / 96
<prog>
<prog>
<instr>
<prog> <instr>
print <expr>
<expr>
<binop>
( <expr> )
<expr>
Compilation
entier
2011-2012
32 / 96
Autre drivation
Arbre alternatif qui reconnait la mme entre (mais pas le mme calcul).
<prog>
<prog>
<instr>
<prog> <instr>
print <expr>
<expr>
( <expr> )
entier
Compilation
2011-2012
33 / 96
Compilation
2011-2012
34 / 96
Exercice
Compilation
2011-2012
35 / 96
Compilation
2011-2012
36 / 96
Les parenthses sont utiles pour rsoudre les ambiguits dune criture
linaire mais inutiles dans les arbres de syntaxe abstraites.
Les commentaires sont inutiles pour engendrer le code.
La localisation des constructions de programmes dans le fichier permet
de mieux rendre compte des erreurs smantiques.
Compilation
2011-2012
37 / 96
.
.
set
foo entier
Compilation
foo
2011-2012
38 / 96
Compilation
2011-2012
39 / 96
Compilation
2011-2012
40 / 96
::
::
Set
Print
"foo" Cst
45
[]
Op
*
Op
Op
3 "foo"
Compilation
2011-2012
41 / 96
Lanalyseur lexical
Principes
Utilise des expressions rgulires pour reconnatre des entits lexicales.
Elle traite les entres correspondantes et produit des tokens qui sont
fournis la grammaire (symboles terminaux).
Les tokens produits doivent tre dclars (en gnral dans la
grammaire).
Certaines entits (identificateurs, constantes entires. . . ) portent des
valeurs qui seront utilises pour construire last.
Le type ocaml des tokens
type token =
CST of i n t | IDENT of s t r i n g
| SET | LET | IN | PRINT | EOF | LP | RP
| PLUS | MINUS | TIMES | DIV | EQ
Compilation
2011-2012
42 / 96
Compilation
2011-2012
43 / 96
Compilation
2011-2012
44 / 96
Cas particuliers
Compilation
2011-2012
45 / 96
Entete de fichier
Compilation
2011-2012
46 / 96
Compilation
2011-2012
47 / 96
Grammaire
Compilation
2011-2012
48 / 96
{
{
{
{
{
{
{
{
{
Cst($1) }
Var($1) }
Op(Sum,$1,$3) }
Op(Diff,$1,$3) }
Op(Prod,$1,$3) }
Op(Quot,$1,$3) }
Op(Diff,Cst(0),$2) }
Letin($2,$4,$6) }
$2 }
Compilation
2011-2012
49 / 96
Prambule
Dclaration des tokens
Prcision des prcdences
%token
%token
%token
%token
%token
%token
%token
<int> CST
<string> IDENT
SET, LET, IN, PRINT
EOF
LP RP
PLUS MINUS TIMES DIV
EQ
Compilation
2011-2012
50 / 96
Points dentre
Compilation
2011-2012
51 / 96
Compilation
2011-2012
52 / 96
Compilation
2011-2012
53 / 96
Sommaire
Prambule
Introduction la compilation
Description dun compilateur
Exemple - analyse syntaxique
Principes
Mise en uvre
Compilation
2011-2012
54 / 96
Compilation
2011-2012
55 / 96
Analyse de porte
Un nom (on parle souvent de variable) est introduit dans le programme
pour reprsenter une valeur qui est le rsultat dun calcul.
Ce nom peut ensuite tre rutilis dans le programme.
Le langage peut restreindre la partie du programme dans lequel un nom
est visible, cest le cas des variables locales ou bien de la construction
let x = e1 in e2 (x nest visible que dans e2 ).
Un mme nom dans le programme peut tre dclar plusieurs fois, il
reprsentera deux objets diffrents.
set x = 3 print x + let x = 2 * x in x + 5
Les rgles de portes dfinissent quelle dclaration est associe
chaque utilisation.
On peut remplacer un nom x par un nom y condition de renommer la
dclaration et les utilisations correspondantes et que y ne soit pas dj
utilis dans le programme.
set x1 = 3 print x1 + let x2 = 2 * x1 in x2 + 5
C. Paulin (Universit Paris Sud)
Compilation
2011-2012
56 / 96
Compilation
2011-2012
57 / 96
Compilation
2011-2012
58 / 96
Compilation
2011-2012
59 / 96
Compilation
2011-2012
60 / 96
Exemple
Cas du langage A RITH:
Les valeurs manipules pour les expressions sont uniquement des
entiers.
Dans le langage de programmation, lopration + sapplique deux
expressions quelconques.
Dans le modle smantique, on a des oprations pour effectuer les
calculs correspondants sur les entiers.
Un environnement associe des valeurs des variables.
Les rgles expliquent comment chaque programme produit une valeur:
dans un environnement donn, une expression svalue vers un entier (si
toutes les variables mentionnes sont dfinies dans lenvironnement)
un programme svalue galement dans un environnement (initialement
vide) et a pour valeur une liste des valeurs imprimes.
Compilation
2011-2012
61 / 96
Exemple de rgles
` e1
n1 ` e2
n2
` Op(PLUS, e1 , e2 )
n1 + n2
` e1
n1 + (x, n1 ) ` e2
` Letin(x, e1 , e2 )
n2
`e
n + (x, n) ` p
` (Set(x, e) :: p)
l
n2
l
`e
n `p
l
` (Print(e) :: p)
(n :: l)
Compilation
2011-2012
62 / 96
pc
fp
gp
C
zone de code C
registre pc qui pointe sur linstruction courante excuter.
pile P permettant de stocker des valeurs entires.
Registres permettent daccder diffrentes parties de P:
sp (stack pointer) pointe sur le premier emplacement vide de la pile,
fp (frame pointer) repre ladresse de base du tableau dactivation des
fonctions
gp pointe sur la base de la pile partir de laquelle sont stockes les
variables globales.
C. Paulin (Universit Paris Sud)
Compilation
2011-2012
63 / 96
Compilation
2011-2012
64 / 96
Rgles smantiques
Code
ADD
SUB
MUL
DIV
PUSHI n
PUSHN n
PUSHG n
STOREG n
PUSHL n
STOREL n
WRITEI
START
STOP
Description
P[sp-2]:=P[sp-2]+P[sp-1]
P[sp-2]:=P[sp-2]-P[sp-1]
P[sp-2]:=P[sp-2]*P[sp-1]
P[sp-2]:=P[sp-2]/P[sp-1]
P[sp]:=n
P[sp]:=0 . . . P[sp+n-1]:=0
P[sp]:=P[gp+n]
P[gp+n]:=P[sp-1]
P[sp]:=P[fp+n]
P[fp+n]:=P[sp-1]
imprime P[sp-1] sur lcran
Affecte la valeur de sp fp
Arrte lexcution du programme
sp
sp-1
sp-1
sp-1
sp-1
sp+1
sp+n
sp+1
sp-1
sp+1
sp-1
sp-1
sp
sp
Compilation
Condition
P[sp-2], P[sp-1] entiers
P[sp-2], P[sp-1] entiers
P[sp-2], P[sp-1] entiers
P[sp-2], P[sp-1] entiers
n entier
n entier
n entier
n entier
n entier
n entier
P[sp-1] entier
2011-2012
65 / 96
Schma de compilation
Compilation
2011-2012
66 / 96
Compilation
2011-2012
67 / 96
Compilation
2011-2012
68 / 96
Compilation
2011-2012
69 / 96
Formulation mathmatique:
`e
P T
(P 0 , sp0 )
Compilation
2011-2012
70 / 96
Sommaire
Prambule
Introduction la compilation
Description dun compilateur
Exemple - analyse syntaxique
Principes
Mise en uvre
Compilation
2011-2012
71 / 96
Compilation
2011-2012
72 / 96
Compilation
2011-2012
73 / 96
Compilation
2011-2012
74 / 96
Sommaire
Prambule
Introduction la compilation
Description dun compilateur
Exemple - analyse syntaxique
Principes
Mise en uvre
Compilation
2011-2012
75 / 96
Interprteur
On peut valuer les programmes dun langage L en utilisant un autre
langage de programmation ds que lon connait les entres du
programme.
Implantation plus ou moins sophistique des rgles de smantique.
Linterprteur ajoute un niveau supplmentaire dexcution qui le rend en
gnral moins efficace que le compilateur mais il est aussi plus facile
crire (on peut utiliser toute la puissance du langage de programmation).
Linterprteur prsuppose la connaissance des entres du programmes, il
ne permet pas de modulariser la construction des rsultats.
Le compilateur a juste besoin de savoir o il pourra trouver les valeurs
dentres au moment de lexcution.
Il nest pas forcment ncessaire de connatre prcisment les valeurs
des entres pour faire des valuations intressantes. On peut galement
calculer avec des valeurs abstraites comme les types.
Compilation
2011-2012
76 / 96
Compilation
2011-2012
77 / 96
Compilation
2011-2012
78 / 96
Compilation
2011-2012
79 / 96
Sommaire
Prambule
Introduction la compilation
Description dun compilateur
Exemple - analyse syntaxique
Principes
Mise en uvre
Compilation
2011-2012
80 / 96
Compilation
2011-2012
81 / 96
Sommaire
Prambule
Introduction la compilation
Description dun compilateur
Exemple - analyse syntaxique
Principes
Mise en uvre
Compilation
2011-2012
82 / 96
Assembleur MIPS
Compilation
2011-2012
83 / 96
Compilation
2011-2012
84 / 96
Registres MIPS
Larchitecture MIPS sappuie sur 32 registres entiers $0 $31 ayant des
rles spcifiques.
Nom
Numro
Rle
$zero
$0
constante 0
$at
$1
rserv pour lassembleur
$v0$v1 $2$3
utilis pour les valeurs de retour des fonctions
et lvaluation des expressions
$a0$a3 $4$7
passage des arguments dune fonction
$t0$t7
$8$15
temporaires
$s0$s7 $16$23 temporaires
$t8$t9
$24$25 temporaires
$k0$k1 $26$27 reserv pour lOS
$gp
$28
pointeur global
$sp
$29
pointeur de pile (stack)
$fp
$30
pointeur de frame (tableau dactivation des
fonctions
$ra
$31
adresse de retour
C. Paulin (Universit Paris Sud)
Compilation
2011-2012
85 / 96
Organisation de la mmoire
pile
donnes
dynamiques
(tas)
donnes
statiques
code
La pile permet de stocker des donnes dont on controle la dure de vie
sur une base dernier entr - premier sorti.
Le registre $sp pointe au sommet de la pile.
Les adresses dcroissent quand la pile augmente.
Le pointeur $gp pointe au milieu de la zone des donnes statiques.
Compilation
2011-2012
86 / 96
Instructions MIPS
Excution:
$pc contient ladresse de linstruction excuter
on lit 4 (ou 8) octets cette adresse
on interprte ces bits comme une instruction et ses arguments
on excute linstruction
on modifie le registre $pc pour passer linstruction suivante (en gnral
juste aprs sauf si instruction de saut)
Compilation
2011-2012
87 / 96
li
lui
move
$r0 C
$r0 216 C
$r0 $r1
$r0 $r1+$r2
$r0 $r1+C
$r0 $r1-$r2
$ro $r1/$r2
$lo $r1/$r2; $hi $r1 mod $r2
$r0 $r1 $r2 (pas doverflow)
$lo $r1 $r2[low] ; $hi $r1 $r2[high]
$r0 -$r1
Compilation
2011-2012
88 / 96
sle
seq
sne
Oprations logiques (bit bit) : and, andi, not, or, sll, srl . . .
Oprations sur les flottants : add.s, add.d . . .
Compilation
2011-2012
89 / 96
Chargement mmoire
Une adresse (adr ) a la forme gnrale C($r 0) et correspond ladresse
dans le registre $r0 plus le dcalage de la constante C sur 16 bits signs.
Stocker une adresse :
la
$r0, adr
$r0 adr
Lire en mmoire :
lw
lh
lb
mfhi
mflo
$r0, adr
$r0, adr
$r0, adr
$r0
$r0
Stocker en mmoire
sw
sh
sb
$r0, adr
$r0, adr
$r0, adr
Compilation
2011-2012
90 / 96
Instructions de saut
Architecture MIPS : branchement conditionnel avec dplacement relatif
sur 16 bits
Assembleur MIPS : branchement vers un label (calcul automatique du
dcalage).
beq
beqz
bgt
bgtz
label
label
jr
$r0
branchement inconditionnel
branchement inconditionnel avec sauvegarde dans
$ra de linstruction suivante
branchement inconditionnel ladresse dans $r0
aussi jalr . . .
C. Paulin (Universit Paris Sud)
Compilation
2011-2012
91 / 96
Directives:
.data les objets suivants sont stocks dans la partie donnes
.text les objets suivants sont stocks dans la partie code
.globl symb dclare la label comme global pouvant tre rfrenc de
lextrieur
.asciiz str stocke la chane str termine par le caractre null
aussi .word, .byte, .float . . .
Interface avec SPIM : SPIM appelle le programme ladresse main: et
stocke dans $ra ladresse o revenir.
C. Paulin (Universit Paris Sud)
Compilation
2011-2012
92 / 96
Appels systmes
Une instruction spciale syscall permet de faire des oprations de
lecture/criture
Code instruction dans $v0
Arguments dans $a0-$a3
Rsultat ventuel dans $v0
Exemple : pour afficher un rsultat contenu dans un registre $t0
.data
str:
.asciiz "Answer = "
.text
li $v0, 4
#code print_str
la $a0,str
# adresse string
syscall
li $v0, 1
#code print_int
move $a0,$t0
# constante imprimer
syscall
C. Paulin (Universit Paris Sud)
Compilation
2011-2012
93 / 96
Conclusion
Compilation
2011-2012
94 / 96
Problme du bootstrap
Compilation
2011-2012
95 / 96
Solution du bootstrap
On dispose dune compilateur (ou interprteur) C0 dun sous-ensemble
L0 du langage L vers M crit dans le langage M.
On crit un compilateur naif C1 de L vers M dans le langage L0 .
On compile C1 laide C0 et on obtient un compilateur (naif) D0 de L vers
M dans le langage M.
On crit un compilateur avanc C2 de L vers M dans le langage L.
On compile C2 laide D0 et on obtient un compilateur (avanc) D1 de L
vers M dans le langage M.
Le compilateur D1 produit un bon code mais a t compil par un
programme naif donc nest pas efficace.
On recompile C2 laide D1 et on obtient un compilateur (avanc et
sexcutant rapidement) D2 de L vers M dans le langage M.
Retour
Compilation
2011-2012
96 / 96