You are on page 1of 96

Introduction la compilation

Christine Paulin-Mohring
Universit Paris Sud

Master Informatique 2011-2012

C. Paulin (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

Suite dinstructions machines


pour excuter
le programme

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 . . . )

C. Paulin (Universit Paris Sud)

Compilation

2011-2012

2 / 96

Example (1)

Programme source en ocaml:

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

C. Paulin (Universit Paris Sud)

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

C. Paulin (Universit Paris Sud)

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

C. Paulin (Universit Paris Sud)

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

maitriser les techniques de base pour la transformation textuelle:


(lex, yacc)
comprendre les caractristiques des langages de programmation
(smantique, efficacit)
programmation: structures de donnes et algorithmes avancs

C. Paulin (Universit Paris Sud)

Compilation

2011-2012

6 / 96

Organisation

TDs partir de recueils dexercices


dbut mercredi 14 septembre
Projet associ (responsable Kim Nguyen)
Utilisation du langage ocaml
Partiel + Controle Continu + Examen

C. Paulin (Universit Paris Sud)

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 (?)

C. Paulin (Universit Paris Sud)

Compilation

2011-2012

8 / 96

Calendrier-suite

31/10 Cours 8 : Gnration de code 4


TD 7 - Projet 7
07/11 Cours 9 : Organisation de la mmoire
TD 8 - Projet 8
14/11 Cours 10 : Analyse smantique avance 1
TD 9 - Projet 9
21/11 Cours 11 : Analyse smantique avance 2
TD 10 - Projet 10
28/11 TD 11 - Projet 11
?? Projet 12 - soutenances

C. Paulin (Universit Paris Sud)

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)

Merci dutiliser prioritairement le courrier lectronique.

C. Paulin (Universit Paris Sud)

Compilation

2011-2012

10 / 96

Prrequis

Thorie des langages formels: alphabet, mot, expressions rgulires,


automates, grammaires, ambiguit
Langages de programmation: typage, organisation de la mmoire
Algorithmique : tables de hachage, arbres, graphes. . .

C. Paulin (Universit Paris Sud)

Compilation

2011-2012

11 / 96

Choix de ocaml

Un langage pour un dveloppement efficace:


Concision du code
Bibliothques
Typage fort (documentation, dtection des erreurs)
Efficacit du code gnr

Un langage particulirement adapt aux manipulations symboliques:


Structures darbre

Concepts avancs de thorie des langages de programmation:


ordre suprieur, infrence de type, modules . . .

C. Paulin (Universit Paris Sud)

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

Principes de fonctionnement du cours

Prsence attentive obligatoire en cours/TD


Pas de tlphone, ordinateur allum . . .
Questions bienvenues
Des tests de connaissance courts : bonus sur note partiel
Documents, notes de cours interdits en partiel examen,
une page A4 manuscripte autorise.

C. Paulin (Universit Paris Sud)

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

C. Paulin (Universit Paris Sud)

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

C. Paulin (Universit Paris Sud)

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 .

Langage ensemble de mots.


Reconnaissance : tant donns un mot m et un langage L, est-ce que
m L?
peut-on construire un programme qui tant donn m dcide si m L ?
peut-on pour une classe de langages L engendrer un programme qui permet
de dcider si un mot m appartient L.

En compilation, on ne se contente pas de reconnatre lappartenance


dun mot un langage, on doit galement transformer lentre afin
davancer dans la production de code.

C. Paulin (Universit Paris Sud)

Compilation

2011-2012

17 / 96

Exemple

Alphabet
Mot
Langage fini
Langage infini
Reconnaissance
Tranformation

C. Paulin (Universit Paris Sud)

Compilation

2011-2012

18 / 96

Sommaire

Prambule

Introduction la compilation
Description dun compilateur
Exemple - analyse syntaxique
Principes
Mise en uvre

Smantique des langages


Exemple: Gnration de code
Compilateur versus interprteur
Techniques de construction de compilateurs
Elments dassembleur

C. Paulin (Universit Paris Sud)

Compilation

2011-2012

19 / 96

Quest-ce quun compilateur ?


Un compilateur est un traducteur qui permet de transformer un
programme crit dans un langage L1 en un autre programme crit dans
un langage machine L2 .
En pratique on sarrte souvent un langage intermdiaire (assembleur
ou encore langage dune machine abstraite).
Quest-ce quun programme ?
Description de comment partir dune entre, produire un rsultat.
Le compilateur peut rejeter des programmes quil considre incorrects,
dans le cas contraire, il construit un nouveau programme (phase
statique) que la machine pourra excuter sur diffrentes entres.
Lexcution du programme sur une entre particulire peut ne pas
terminer ou chouer produire un rsultat (phase dynamique).

C. Paulin (Universit Paris Sud)

Compilation

2011-2012

20 / 96

Quattend-on dun compilateur ?


Dtection des erreurs :
Identificateurs mal forms, commentaires non ferms . . .
Constructions syntaxiques incorrectes
Identificateurs non dclars
Expressions mal types if 3 then "toto" else 4.5
Rfrences non instancies
...

Les erreurs dtectes la compilation sappellent les erreurs statiques.


Les erreurs dtectes lexcution sappellent les erreurs dynamiques:
division par zro, dpassement des bornes dans un tableau. . .

C. Paulin (Universit Paris Sud)

Compilation

2011-2012

21 / 96

Quattend-on dun compilateur ? (2)

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.

C. Paulin (Universit Paris Sud)

Compilation

2011-2012

22 / 96

Structure dun compilateur


Un compilateur se construit en plusieurs phases.
Analyse syntaxique :
Transforme une suite de caractres en un arbre de syntaxe abstraite (ast)
reprsentant la description des oprations effectuer.
Combinaison de lanalyse lexicale qui reconnait des mots aussi appels
token ou entits et de lanalyse syntaxique qui reconnait des phrases bien
formes.

Analyse smantique : analyse larbre de syntaxe abstraite pour calculer


de nouvelles informations permettant de:
rejeter des programmes incorrects (porte, typage. . . )
prparer la phase de gnration de code (organisation de lenvironnement,
construction de tables pour les symboles, rsolution de la surcharge . . . )

C. Paulin (Universit Paris Sud)

Compilation

2011-2012

23 / 96

Structure dun compilateur (2)

Gnration de code : passage par plusieurs langages intermdiaires


pour produire un code efficace
Organisation des appels de fonctions dans des tableaux dactivation
Instructions simplifies (code trois oprandes)
Analyses de flots
Allocation de registres
...

C. Paulin (Universit Paris Sud)

Compilation

2011-2012

24 / 96

Aprs la compilation

La compilation du programme se fait souvent de manire modulaire.


Les dpendances par rapport aux autres parties du programme ou aux
bibliothques sont rsolues par ldition de liens.
Le programme peut tre intgr un runtime, qui va offrir des services
indpendants du programme (accs systmes, gestionnaire de mmoire
. . . ).
Dans le cadre de programmes compils vers du code pour une machine
abstraite (bytecode Java ou Ocaml), le runtime comprendra un interprte
de la machine abstraite.

C. Paulin (Universit Paris Sud)

Compilation

2011-2012

25 / 96

Sommaire

Prambule

Introduction la compilation
Description dun compilateur
Exemple - analyse syntaxique
Principes
Mise en uvre

Smantique des langages


Exemple: Gnration de code
Compilateur versus interprteur
Techniques de construction de compilateurs
Elments dassembleur

C. Paulin (Universit Paris Sud)

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

Les expressions peuvent comporter des variables locales.


Exemple de programme:
set x = 4
set xx = let y = 2 * x + 5 in - (y * y)
print x * xx

C. Paulin (Universit Paris Sud)

Compilation

2011-2012

27 / 96

Analyse syntaxique

La premire phase danalyse syntaxique, consiste transformer la suite


de caractres reprsentant le programme en un arbre de syntaxe
abstraite qui ne conserve que les informations utiles pour le calcul.
Pour cela, on passe par une phase intermdiaire, lanalyse lexicale qui
construit une suite dentits lexicales (token) qui servent dalphabet
dentre (symboles terminaux) pour la grammaire.

C. Paulin (Universit Paris Sud)

Compilation

2011-2012

28 / 96

Description syntaxique du langage

<prog>
<inst>
<expr>

<binop>
<unop>

::=  | <prog> <inst>


::= set ident = <expr>
| print <expr>
::= entier | ident |
| <expr> <binop> <expr> | <unop> <expr>
| let ident = <expr> in <expr>
| ( <expr> )
::= + | - | * | /
::= -

C. Paulin (Universit Paris Sud)

Compilation

2011-2012

29 / 96

Analyse syntaxique

La grammaire distingue les symboles terminaux qui forment lalphabet


dentre et les symboles non-terminaux qui sont des symboles intermdiaires
pour la reconnaissance.
Exemple
Terminaux: set, let, in, print, =, +, -, /, *, (, ), ident, entier
Non-terminaux: <prog>, <inst>, <expr>, <binop>, <unop>.
Rgle de production: X ::= m avec X un symbole non-terminal et m un
mot utilisant la fois des symboles terminaux et non-terminaux.
Reconnaissance: Un mot m form de terminaux est reconnu par la
grammaire sil existe un arbre de drivation syntaxique dont les feuilles
correspondent au mot m et les nuds aux rgles de production, la racine
tant le symbole initial.

C. Paulin (Universit Paris Sud)

Compilation

2011-2012

30 / 96

Analyse syntaxique sur un exemple

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.

C. Paulin (Universit Paris Sud)

Compilation

2011-2012

31 / 96

Exemple: arbre de drivation syntaxique

<prog>
<prog>

<instr>

<prog> <instr>

print <expr>

set ident = <expr>

<expr>

<binop>

entier <unop> <expr>


-

( <expr> )

entier <expr> <binop> <expr>


ident

C. Paulin (Universit Paris Sud)

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

set ident = <expr> <unop>


entier

<expr>

- <expr> <binop> <expr>


entier

( <expr> )

<expr> <binop> <expr>


ident

entier

La grammaire est ambige (2 arbres pour la mme entre).


Les rgles de prcdence permettent de choisir.
C. Paulin (Universit Paris Sud)

Compilation

2011-2012

33 / 96

Les lments prciser

Quest-ce quun identificateur ?


(alpha-numrique, commence par une lettre)
Quest-ce quun entier ?
(suite de chiffres)
Quels sont les mots cls ?
(ne peuvent tre utiliss comme identificateur)
Comment se lvent les ambiguits ?
(rgles usuelles pour les expressions arithmtiques)

C. Paulin (Universit Paris Sud)

Compilation

2011-2012

34 / 96

Exercice

Construire la suite de tokens puis larbre de drivation syntaxique pour le


programme:
print let x = -5 in x * x + 2
Le programmes suivants ont des erreurs syntaxiques, dire pourquoi.
print tel x = -5 in x * x + 2
print (* x + 2
print x % 2

C. Paulin (Universit Paris Sud)

Compilation

2011-2012

35 / 96

Choix de la structure darbre de syntaxe abstraite

Larbre de syntaxe abstraite est le rsultat de la phase danalyse


syntaxique.
Construction simple partir de la grammaire (ie de larbre de drivation
syntaxique).
Doit reprsenter linformation contenue dans le programme utile
lanalyse smantique et la gnration de code.
Il retire de larbre de drivation syntaxique ce qui ne sert pas au calcul.
Il rintroduit les valeurs des terminaux comme les constantes entires ou
les identifiants.

C. Paulin (Universit Paris Sud)

Compilation

2011-2012

36 / 96

Arbre de syntaxe abstraite : exemples

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.

C. Paulin (Universit Paris Sud)

Compilation

2011-2012

37 / 96

Exemple darbre de syntaxe abstraite

.
.

print

set

foo entier

45 entier ident entier


3

C. Paulin (Universit Paris Sud)

Compilation

foo

2011-2012

38 / 96

Programmer lanalyse syntaxique

Programmer directement lanalyse syntaxique de la chane de caractres


jusqu larbre de syntaxe abstraite serait trs fastidueux et sans doute
peu efficace.
On utilise des gnrateurs danalyseurs qui permette de ne spcifier que
les parties utiles:
les entits lexicales;
les rgles de grammaire;
les arbres de syntaxe abstraite;

Les analyseurs obissent des rgles syntaxiques spcifiques.


Ils sont eux-mmes compils pour engendrer les fonctions danalyse.
Ils utilisent des mthodes puissantes base dautomates.

C. Paulin (Universit Paris Sud)

Compilation

2011-2012

39 / 96

Structure des ast pour A RITH


Type de donnes ocaml pour reprsenter des structures arborescentes
type binop = Sum | D i f f | Prod | Quot
type expr =
Cst of i n t
| Var of s t r i n g
| Op of binop expr expr
| L e t i n of s t r i n g expr expr
type i n s t r =
Set of s t r i n g expr
| P r i n t of expr
type prg = i n s t r l i s t
Les principales classes syntaxiques correspondent des types Ocaml.
On a choisi de ne pas distinguer le moins unaire (cod par 0 e).

C. Paulin (Universit Paris Sud)

Compilation

2011-2012

40 / 96

Exemple de last dans la syntaxe OCAML

::
::

Set
Print

"foo" Cst
45

[]

Op
*

Op

Op

Cst - Cst Var - Cst


0

C. Paulin (Universit Paris Sud)

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

C. Paulin (Universit Paris Sud)

Compilation

2011-2012

42 / 96

Exemple de fichier ocamllex : lexer.mll

Quelques abbrviations pour les expressions rgulires:


let
let
let
let
let

letter = [a-z A-Z]


digit = [0-9]
ident = letter (letter | digit)*
integer = [0-9]+
space = [ \ t \ n]

C. Paulin (Universit Paris Sud)

Compilation

2011-2012

43 / 96

Les rgles de reconnaissance

Un analyseur a un nom associ un ensembe de rgles


une expression rgulire sur les caractres ASCII correspond une
action (production dun token)
rule nexttoken = parse
| +
{ PLUS }
| -
{ MINUS }
| *
{ TIMES }
| /
{ DIV }
| =
{ EQ }
| (
{ LP }
| )
{ RP }
| integer as x { CST (int_of_string x) }

C. Paulin (Universit Paris Sud)

Compilation

2011-2012

44 / 96

Cas particuliers

Traitement des espaces, des mot-cls, fin de fichier et erreurs


rule nexttoken = parse
| ...
| space+ { nexttoken lexbuf }
| ident
{ id_or_kwd (lexeme lexbuf) }
| eof
{ EOF }
| _
{ raise (Lexing_error (lexeme lexbuf)) }

C. Paulin (Universit Paris Sud)

Compilation

2011-2012

45 / 96

Entete de fichier

Dclare les fonctions utiles lopration danalyse


{
open Lexing
open Parser
exception Lexing_error of string
let kwd_tbl =
["let",LET ;"in",IN ; "set",SET;"print",PRINT]
let id_or_kwd s =
try List.assoc s kwd_tbl with _ -> IDENT(s)
}

C. Paulin (Universit Paris Sud)

Compilation

2011-2012

46 / 96

Les outils de type lex


La commande
ocamllex lexer.mll
produit un fichier ml lexer.ml qui lui-mme contient une fonction
val nexttoken : Lexing.lexbuf -> Parser.token
Le module Lexing docaml introduit des fonctions de manipulation
lexicales.
Des fonctions comme lexeme permettent daccder la chane de
caractres correspondant lexpression rgulire reconnue.
Dans cet exemple, le type des tokens est dfini dans le fichier de
grammaire Parser.
Un objet de type Lexing.lexbuf (buffer pour lanalyse lexicale,
comportant des informations sur le positionnement dans le fichier) peut
tre construit partir dun fichier ou dune chane de caractres.
C. Paulin (Universit Paris Sud)

Compilation

2011-2012

47 / 96

Grammaire

Une grammaire se dfinit par des symboles terminaux, non-terminaux et


des rgles de drivation.
Un mot est reconnu si on peut construire un arbre de drivation
syntaxique dont les feuilles sont les terminaux et les noeuds
correspondent aux rgles.
Les tokens fournis par lanalyseur lexical correspondent aux terminaux
de la grammaire.
Les rgles suivent les constructions syntaxiques du langage mais il faut
tenir compte des ambiguits.
Les actions associes aux rgles permettent de construire les ast.

C. Paulin (Universit Paris Sud)

Compilation

2011-2012

48 / 96

Exemple de fichier ocamlyacc


Fichier parser.mly
Le cur du programme:
instr:
| SET IDENT EQ expr { Set($2,$4)}
| PRINT expr
{ Print($2) }
;
expr:
| CST
| IDENT
| expr PLUS expr
| expr MINUS expr
| expr TIMES expr
| expr DIV expr
| MINUS expr %prec uminus
| LET IDENT EQ expr IN expr
| LP expr RP
;
C. Paulin (Universit Paris Sud)

{
{
{
{
{
{
{
{
{

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

/* priorits et associativits des tokens */


%nonassoc IN
%left MINUS PLUS
%left TIMES DIV
%nonassoc uminus

C. Paulin (Universit Paris Sud)

Compilation

2011-2012

50 / 96

Points dentre

/* Point dentre de la grammaire */


%start prog

/* Type des valeurs retournes par lanalyseur syntaxique */


%type <Ast.prg> prog
%%
prog:
| instrs EOF {List.rev $1}
;
instrs:
| instr
{ [$1] }
| instrs instr { $2::$1 }
;

C. Paulin (Universit Paris Sud)

Compilation

2011-2012

51 / 96

Les outils de type Yacc


La commande
ocamlyacc parser.mly
produit un fichier ml parser.ml qui contient la dclaration du type des
tokens ainsi que la fonction danalyse:
val prog :
(Lexing.lexbuf -> token) -> Lexing.lexbuf -> Ast.prg
Pour construire un ast correspondant un fichier file
let f = open_in file in
let buf = Lexing.from_channel f in
Parser.prog Lexer.nexttoken buf

C. Paulin (Universit Paris Sud)

Compilation

2011-2012

52 / 96

A propos des outils danalyse

Les outils comme ocamllex et ocamlyacc font appel des algorithmes


complexes de calculs dautomates:
analyse lexicale : automates finis
analyse syntaxique : automates pile

Nous tudierons le fonctionnement de ces outils sans entrer dans le


dtail du calcul des tables.

C. Paulin (Universit Paris Sud)

Compilation

2011-2012

53 / 96

Sommaire

Prambule

Introduction la compilation
Description dun compilateur
Exemple - analyse syntaxique
Principes
Mise en uvre

Smantique des langages


Exemple: Gnration de code
Compilateur versus interprteur
Techniques de construction de compilateurs
Elments dassembleur

C. Paulin (Universit Paris Sud)

Compilation

2011-2012

54 / 96

Smantique des langages

La smantique sert prciser la nature des calculs reprsents par un


programme
La plupart des langages courants ne disposent pas dune smantique
formelle complte; la description informelle des manuels de rfrence
peut tre incomplte ou ambige (les compilateurs peuvent donc faire
des choix multiples).
Il y une grande diversit de smantiques pour les langages de
programmation (dnotationnelle, axiomatique, statique, . . . ).

C. Paulin (Universit Paris Sud)

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

Analyse de porte - exemple

Une phase danalyse de porte vrifie:


tout nom utilis a bien t dclar
lutilisation est bien faite dans la porte de la dclaration

Elle peut engendrer un nom unique et effectuer la transformation du


programme afin de simplifier les traitements ultrieurs.
Cration de nouveaux noms en ocaml en utilisant un sparateur et une
rfrence prive. Cration de nouveaux noms en utilisant un sparateur
et une rfrence prive.
l e t new_name = l e t i = r e f 0 i n
fun x > i n c r i ; x ^ " _ " ^ ( s t r i n g _ o f _ i n t ! i )

C. Paulin (Universit Paris Sud)

Compilation

2011-2012

57 / 96

Analyse de porte de A RITH


Une liste de visibilit vis les noms visibles associs leur renommage.
exception ScopeError
l e t rec scope_expr v i s = function
| Cst n as x > x
| Op ( o , e1 , e2 ) >
l e t e1 = scope_expr v i s e1
and e2 = scope_expr v i s e2
i n Op( o , e1 , e2 )
| Var x > ( t r y l e t x = L i s t . assoc x v i s i n Var x
with Not_found > r a i s e ScopeError )
| L e t i n ( x , e1 , e2 ) >
l e t e1 = scope_expr v i s e1 and x = new_name x
i n l e t e2 = scope_expr ( ( x , x ) : : v i s ) e2
i n L e t i n ( x , e1 , e2 )

C. Paulin (Universit Paris Sud)

Compilation

2011-2012

58 / 96

Analyse de porte de A RITH (2)

Extension aux programmes:


l e t rec s c o p e _ i n s t r s v i s = function
[ ] > [ ]
| Set ( x , e ) : : prog >
l e t x = new_name x
and e = scope_expr v i s e i n
Set ( x , e ) : : ( s c o p e _ i n s t r s ( ( x , x ) : : v i s ) prog )
| P r i n t ( e ) : : prog >
P r i n t ( scope_expr v i s e ) : : s c o p e _ i n s t r s v i s prog
l e t scope_prog = s c o p e _ i n s t r s [ ]

C. Paulin (Universit Paris Sud)

Compilation

2011-2012

59 / 96

Smantique oprationnelle grand pas

Elle explique le calcul effectu par un programme en fonction de


lenvironnement dans lequel il est excut.
`p

Elle sappuie sur un modle des valeurs smantiques (des objets


mathmatiques).
Elle sexprime sous forme de rgles dinfrences qui permettent de
dfinir la relation dvaluation.

C. Paulin (Universit Paris Sud)

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.

C. Paulin (Universit Paris Sud)

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)

C. Paulin (Universit Paris Sud)

Compilation

2011-2012

62 / 96

Une machine virtuelle pile


Lorganisation de la machine virtuelle est dcrite par la figure suivante:
sp

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

Smantique de la machine virtuelle

la valeur correspond la configuration de la machine


les programmes sont des listes dinstructions
on donne une smantique oprationnelle petit pas qui dcrit la
transformation de ltat lors de chaque instruction.

C. Paulin (Universit Paris Sud)

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

C. Paulin (Universit Paris Sud)

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

Avant dcrire la fonction de compilation, il faut dterminer la correspondance


entre les entits des deux langages.
Le langage A RITH manipule des noms de variables
La machine virtuelle stocke les donnes dans la pile et les repre par un
dcalage par rapport un endroit donn sur la pile (par exemple repr
par gp).
Chaque variable x de lenvironnement est stocke un endroit prcis
dans la pile.
Le choix daffectation est fait lanalyse smantique et conserv dans
une table des symboles.

C. Paulin (Universit Paris Sud)

Compilation

2011-2012

66 / 96

Calcul des dcalages

Suppose les noms uniques.


Cas simple (sans fonction) qui permet dallouer les variables
statiquement.
Exemple:
set x = 4
set xx = let y = 2 * x + 5 in - (y * y)
print x * xx
On peut stocker x ladresse 0 et les variables xx et y ladresse 1.

C. Paulin (Universit Paris Sud)

Compilation

2011-2012

67 / 96

Reprsentation de la table des symboles

La table des symboles peut simplanter avec une table de hachage:


( val tab : ( s t r i n g , i n t ) Hashtbl . t
v a l addsymb : s t r i n g > i n t > u n i t
v a l findsymb : s t r i n g > i n t )
l e t t a b = H a s h t b l . c r e a t e 17
l e t addsymb x n = H a s h t b l . add t a b x n
l e t findsymb x = H a s h t b l . f i n d t a b x
Calcul du dcalage maximum:
( v a l maxsymb : u n i t > i n t )
l e t maxsymb ( ) =
H a s h t b l . f o l d ( fun _ n m > max n m) t a b 0

C. Paulin (Universit Paris Sud)

Compilation

2011-2012

68 / 96

Calcul des dcalages (2)


Parcours dune expression (n est le nombre de variables visibles)
( v a l dec_expr : i n t > expr > u n i t )
l e t rec dec_expr n = function
Var _ | Cst _ > ( )
| Op( o , e1 , e2 ) > dec_expr n e1 ; dec_expr n e2
| L e t i n ( x , e1 , e2 ) >
dec_expr n e1 ; addsymb x n ; dec_expr ( n +1) e2
Extension aux programmes:
( v a l d e c _ i n s t r s : i n t > i n s t r l i s t > u n i t )
l e t rec d e c _ i n s t r s n = function
[ ] > ( )
| Set ( x , e ) : : prog > dec_expr n e ; addsymb x n ;
d e c _ i n s t r s ( n +1) prog
| P r i n t ( e ) : : prog > dec_expr n e ; d e c _ i n s t r s n prog
( v a l dec_prog : i n s t r l i s t > u n i t )
l e t dec_prog = d e c _ i n s t r s 0
C. Paulin (Universit Paris Sud)

Compilation

2011-2012

69 / 96

Schma de compilation (2)

Invariant dterminer: o se retrouve la valeur du programme?


Valeur en sommet de pile
Correspondance entre les valeurs dans la pile et lenvironnement pour
toutes les variables visibles (x V).
P T si x V, P[T (x)] = (x)

Formulation mathmatique:
`e

P T

compile(T , e) = lc (P, sp) + lc


P 0 [sp0 1] = n

(P 0 , sp0 )

On garantit galement que lenvironnement na pas t altr:


x V, P[T (x)] = P 0 [T (x)]

C. Paulin (Universit Paris Sud)

Compilation

2011-2012

70 / 96

Sommaire

Prambule

Introduction la compilation
Description dun compilateur
Exemple - analyse syntaxique
Principes
Mise en uvre

Smantique des langages


Exemple: Gnration de code
Compilateur versus interprteur
Techniques de construction de compilateurs
Elments dassembleur

C. Paulin (Universit Paris Sud)

Compilation

2011-2012

71 / 96

Gnration de code pour ARITH

Utilise un type concret machine pour les instructions de la machine.


type machine =
Pushi of i n t | Pushn of i n t
| Add | Sub | Mul | Div
| Pushg of i n t | Storeg of i n t
| Pushl of i n t | S t o r e l of i n t
| W r i t e i | S t a r t | Stop
Correspondance des oprations sur les entiers:
( v a l gen_op : binop > machine )
l e t gen_op = function
Sum > Add | D i f f > Sub | Prod > Mul | Quot > Div

C. Paulin (Universit Paris Sud)

Compilation

2011-2012

72 / 96

Gnration de code pour ARITH (2)

Traduction des expressions:


( v a l gen_expr : expr > machine l i s t )
l e t rec gen_expr = function
| Cst n > [ Pushi n ]
| Var x > [ Pushg ( findsymb x ) ]
| Op( o , e1 , e2 ) >
gen_expr e1 @ gen_expr e2 @ [ gen_op o ]
| L e t i n ( x , e1 , e2 ) >
gen_expr e1 @ [ Storeg ( findsymb x ) ] @ gen_expr e2

C. Paulin (Universit Paris Sud)

Compilation

2011-2012

73 / 96

Gnration de code pour ARITH (3)


Extension aux programmes:
( v a l g e n _ i n s t r s : i n s t r l i s t > machine l i s t )
l e t rec g e n _ i n s t r s = function
| [ ] > [ ]
| Set ( x , e ) : : prog >
gen_expr e @ [ Storeg ( findsymb x ) ]
@ g e n _ i n s t r s prog
| P r i n t ( e ) : : prog >
gen_expr e @ [ W r i t e i ] @ g e n _ i n s t r s prog
( v a l gen_prog : i n s t r l i s t > machine l i s t )
l e t gen_prog p =
dec_prog p ;
l e t n = maxsymb ( ) i n
S t a r t : : ( Pushn n ) : : g e n _ i n s t r s p@[ Stop ]

C. Paulin (Universit Paris Sud)

Compilation

2011-2012

74 / 96

Sommaire

Prambule

Introduction la compilation
Description dun compilateur
Exemple - analyse syntaxique
Principes
Mise en uvre

Smantique des langages


Exemple: Gnration de code
Compilateur versus interprteur
Techniques de construction de compilateurs
Elments dassembleur

C. Paulin (Universit Paris Sud)

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.

C. Paulin (Universit Paris Sud)

Compilation

2011-2012

76 / 96

Interprteur pour ARITH


Un environnement stocke les valeurs de chaque variable par exemple
sous la forme dune table de hachage ou dun tableau (index par les
dcalages)
( v a l env : ( s t r i n g , i n t ) H a s h t b l . t
v a l addenv : s t r i n g > i n t > u n i t
v a l f i n d e n v : s t r i n g > i n t
v a l c l e a r e n v : u n i t > u n i t )
l e t env = H a s h t b l . c r e a t e 17
l e t addenv x n = H a s h t b l . add env x n
l e t f i n d e n v x = H a s h t b l . f i n d env x
l e t c l e a r e n v ( ) = H a s h t b l . c l e a r env
Interprtation des oprations par des fonctions ocaml sur les entiers:
( v a l i n t e r p _ o p : binop > i n t > i n t > i n t )
l e t i n t e r p _ o p = function
Sum > ( + ) | D i f f > ( )
| Prod > ( ) | Quot > ( / )
C. Paulin (Universit Paris Sud)

Compilation

2011-2012

77 / 96

Interprteur pour ARITH (2)

Interprtation des expressions:


( v a l i n t e r p _ e x p r : expr > i n t )
l e t rec i n t e r p _ e x p r = function
Var x > f i n d e n v x | Cst n > n
| Op( o , e1 , e2 ) >
l e t n1 = i n t e r p _ e x p r e1 and n2 = i n t e r p _ e x p r e2
i n ( i n t e r p _ o p o ) n1 n2
| L e t i n ( x , e1 , e2 ) > l e t n1 = i n t e r p _ e x p r e1
i n addenv x n1 ; i n t e r p _ e x p r e2

C. Paulin (Universit Paris Sud)

Compilation

2011-2012

78 / 96

Interprteur pour ARITH (3)


Interprtation des programmes:
( v a l i n t e r p _ i n s t r s : i n s t r l i s t > u n i t )
l e t rec i n t e r p _ i n s t r s = function
[ ] > ( )
| Set ( x , e ) : : prog >
l e t n = interp_expr e in
addenv x n ; i n t e r p _ i n s t r s prog
| P r i n t ( e ) : : prog >
l e t n = interp_expr e in
p r i n t _ i n t n ; print_newline ( ) ;
i n t e r p _ i n s t r s prog
( v a l i n t e r p _ p r o g : prog > u n i t )
l e t interp_prog p = clearenv ( ) ; i n t e r p _ i n s t r s p

C. Paulin (Universit Paris Sud)

Compilation

2011-2012

79 / 96

Sommaire

Prambule

Introduction la compilation
Description dun compilateur
Exemple - analyse syntaxique
Principes
Mise en uvre

Smantique des langages


Exemple: Gnration de code
Compilateur versus interprteur
Techniques de construction de compilateurs
Elments dassembleur

C. Paulin (Universit Paris Sud)

Compilation

2011-2012

80 / 96

Techniques de construction de compilateurs

De nombreux compilateurs (Java, ocaml) sont crits dans le langage


lui-mme
On utilise un mcanisme dauto-compilation (boot-strap)
un compilateur ou valuateur lmentaire crit dans un langage de bas
niveau
des compilateurs de plus en plus avancs crits dans le langage de haut
niveau

On peut galement faire de la compilation croise qui permet de crer


des compilateurs pour des architectures multiples.
Dtail du bootstrap

Voir aussi exercice de TD

C. Paulin (Universit Paris Sud)

Compilation

2011-2012

81 / 96

Sommaire

Prambule

Introduction la compilation
Description dun compilateur
Exemple - analyse syntaxique
Principes
Mise en uvre

Smantique des langages


Exemple: Gnration de code
Compilateur versus interprteur
Techniques de construction de compilateurs
Elments dassembleur

C. Paulin (Universit Paris Sud)

Compilation

2011-2012

82 / 96

Assembleur MIPS

Dans le cours, on utilisera la gnration de code MIPS (MIPS32) et un


simulateur SPIM.
http://pages.cs.wisc.edu/~larus/spim.html
MIPS est un assembleur de la famille RISC (Reduced Instruction Set) par
opposition aux architectures CISC (Complex Instruction Set) comme le
x86.
Il est utilis dans des processeurs embarqus, consoles de jeux . . .
Il a peu dinstructions assez rgulires et un nombre important de
registres .

C. Paulin (Universit Paris Sud)

Compilation

2011-2012

83 / 96

Petit rappels darchitecture

Les registres se trouvent sur lunit de calcul (CPU).


La mmoire vive (RAM) contient les donnes et les instructions.
Un octet (ou byte) se compose de 8 bits et peut se coder en hexadcimal
laide de deux caractres ([0-9,a-f]).
0x9b reprsente lentier binaire 10011011
Un mot se compose de 32 bits et donc de 4 octets.

C. Paulin (Universit Paris Sud)

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.

C. Paulin (Universit Paris Sud)

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)

Trois sortes dinstructions


transfert entre registre et mmoire (strore/load)
instructions de calcul entre registres
instructions de saut

Les instructions peuvent utiliser des constantes immdiates qui sont


reprsentes sur 16 bits.

C. Paulin (Universit Paris Sud)

Compilation

2011-2012

87 / 96

Quelques (pseudo-)instructions de calcul


initialisation
$r0, C
$r0, C
$r0, $r1

li
lui
move

$r0 C
$r0 216 C
$r0 $r1

arithmtique entre registres:


add
addi
sub
div
div
mul
mult
neg

$r0, $r1, $r2


$r0, $r1, C
$r0, $r1, $r2
$r0, $r1,$r2
$r1, $r2
$r0, $r1, $r2
$r1, $r2
$r0, $r1

C. Paulin (Universit Paris Sud)

$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

Quelques (pseudo-)instructions de calcul (2)

Test galit et ingalit


slt
slti

$r0, $r1, $r2


$r0, $r1, C

$r0 1 si $r1<$r2 et $r0 0 sinon


$r0 1 si $r1< C et $r0 0 sinon

sle

$r0, $r1, $r2

$r0 1 si $r1$r2 et $r0 0 sinon

seq

$r0, $r1, $r2

$r0 1 si $r1=$r2 et $r0 0 sinon

sne

$r0, $r1, $r2

$r0 1 si $r16=$r2 et $r0 0 sinon

Oprations logiques (bit bit) : and, andi, not, or, sll, srl . . .
Oprations sur les flottants : add.s, add.d . . .

C. Paulin (Universit Paris Sud)

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

$r0 mem[adr], lit un mot


$r0 mem[adr], lit un demi-mot (16 bits)
$r0 mem[adr], lit un octet
$r0 $hi
$r0 $lo

Stocker en mmoire
sw
sh
sb

$r0, adr
$r0, adr
$r0, adr

C. Paulin (Universit Paris Sud)

mem[adr] $r0, stocke un mot


mem[adr] $r0, stocke un demi-mot (16 bits)
mem[adr] $r0, stocke un octet

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

$r0, $r1, label


$r0, label
$r0, $r1, label
$r0, label

branchement conditionnel si $r0=$r1


branchement conditionnel si $r0=0
branchement conditionnel si $r0>$r1
branchement conditionnel si $r0>0

Les versions beqzal, bgtzal. . . assurent de plus la sauvegarde de


linstruction suivante dans le registre $ra
Saut inconditionnel dont la destination est stocke sur 26 bits
j
jal

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

Structure dun programme assembleur


Conventions lexicales:
Un commentaire commence par un # et se termine en fin de ligne
Les entiers scrivent en base 10 par dfaut. On utilise le prfixe 0x pour
une criture hexadcimale.
Les identifiants commencent par un caractre alphabtique et peuvent
contenir des chiffres et le caractre _.
Les chaines de caractres sont dlimites par " et utilisent des caractres
spciaux \n, \t,\".
Les labels sont des identifiants termins par le caractre :

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

Survol rapide des principales tapes de la compilation


Points abords plus tard : reprsentation de structures de donnes,
appels de fonctions, donnes dynamiques.
Points non abords : architecture avances : pipe-line, paralllisme,
mmoire . . .
De nombreux niveaux de langages dont il faut maitriser la syntaxe, la
smantique . . .

C. Paulin (Universit Paris Sud)

Compilation

2011-2012

94 / 96

Problme du bootstrap

Ecrire le compilateur du langage source L dans le langage machine M


dans le langage de haut-niveau L.
Obtenir une version compile du compilateur de L dans M dans le
langage M (ie excutable).

C. Paulin (Universit Paris Sud)

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

C. Paulin (Universit Paris Sud)

Compilation

2011-2012

96 / 96

You might also like