Énoncé et corrigé en Postscript | Réponses intégrées ou à la demande |
Examen de majeure 2 Compilation (Durée 2h) 23 mars 2001 |
On attachera une importance particulière à la clarté, à la précision, mais aussi à la concision de la rédaction. Les trois exercices sont indépendants. La plupart des questions sont également indépendentes dans les exercices 1 et 2.
|
break
qui peut être
utilisée à l'intérieur d'une boucle while
comme dans le langage C
:
l'exécution de l'instruction break
à l'intérieur d'une boucle while
interrompt l'exécution de cette boucle et continue avec
l'instruction qui suit immédiatement la boucle (c'est une erreur
si l'opération break
apparaît en dehors d'une boucle
while
). break
.break
.
break
.
Pp.instruction
dans le cours) un noeud Break
.
On donne le squelette d'un interprète du langage Pseudo-Pascal définit par
deux fonctions récursives:
val instruction : environnement -> Pp.instruction -> unit val expression : environnement -> Pp.expression -> valeur |
let rec instruction env = function | While (e, i1) -> while bool (expression env e) do instruction env i done | ... and expression env = function ... |
bool : valeur -> bool
convertit son argument en un booléen si
c'est possible et lance un erreur d'exécution sinon.While
et l'ajout du cas
Break
dans la fonction instruction
afin de traiter la construction
break
.
While
et
Break
(et d'autres modifications éventuelles à apporter à la fonction de
compilation). On utilisera de préférence une description mathématique
à l'aide des fonctions [[]]er et [[]]sr
utilisés dans le cours et que l'on pourra raffiner.
|
type exp = and stm = Const of int | Label of label | Name of label | Move_temp of temp * exp | Temp of temp | Move_mem of exp * exp | Mem of exp | Exp of exp | Bin of binop * exp * exp | Seq of stm list | Call of frame * exp list | Jump of exp | Cjump of relop * exp * exp * label * label |
lus_par_exp
de type
exp -> temp list
qui prend une expression canonique
(sans Call) du code intermédiaire et retourne la liste des temporaires
lus par celle-ci (on admet les répétitions dans le résultat).
écrits_par_instr
de type
stm -> temp list
qui prend
une instruction canonique (sans saut, sans séquence et sans
Call
emboîtés) du code intermédiaire et qui retourne la liste des
temporaires écrits par celle-ci.
lus_par_exp
et écrits_par_stm
?
|
A0
, ..., A7
) des registres de donnée (D0
,
..., D7
). Pour simplifier, nous considérons un processeur
expérimental CIRC dont le jeu d'instructions est identique à celui du
code SPIM mais dont les registres sont séparés en registres d'adresses
(A0
, ..., A7
) et registres de données
(D0
, ..., D7
) et dont certaines occurrences
des registres dans les instructions sont contraintes.
En particulier, on considère les contraintes suivantes,
add
, mul
, etc.) n'utilisent
que des registres de donnée.
lw
D, n(A) et sw
D, n(A) le registre D est un
registre de donnée, le registre A est un registre d'adresse (et n un
entier).
Ass.code
dans le
cours, abstrait par rapport au choix final des registres et
code machine final le code émit à la fin de la compilation et pouvant
être lu par l'assembleur. Dans l'une ou l'autre expression, on remplace
machine par SPIM ou CIRC pour préciser la version du cours
pour l'architecture SPIM ou la version de cet exercice pour une architecture
CIRC. Bin (Plus, Temp t1, Temp t2)
.
Décrire le code CIRC abstrait produit pour ce code On ne se préoccupera pas
ici du contexte dans lequel l'instruction est placée. (On pourra supposer
que les variables rA
et rD
sont liées à l'ensemble des registres
d'adresses et de données respectivement.)
debut
est
"debut"
):
[ Label debut; Move_mem (Temp t1, Temp t2); Move_temp (t1, Bin (Plus (Temp t1, Temp t3))); Jump (debut); ] |
This document was translated from LATEX by HEVEA and HACHA.