:: Enseignements :: Master :: M2 :: 2011-2012 :: Machine Virtuelle (et bazard autour ...) ::
![[LOGO]](http://igm.univ-mlv.fr/ens/resources/mlv.png) | Lab 2 - Preparation |
Le but de cette préparation au lab 2 est d'écrire le runtime du langage foo
lorsque celui-ci est compilé en utilisant les outils fournis par la JSR 292.
L'archive ZIP correspondant à la préparation du lab2 est disponible
ici.
Exercice 1 - Prise en main
Comme vous pouvez le voir, le code contenu dans le ZIP n'est pas exactement
le même que le code que vous avez écrit pour le lab1.
Cet exercice permet de voir et comprendre les différences.
-
Commençont par le TypeChecker, à quoi servent les champs
typeMap et symbolMap ? Pour cela, suivez l'utilisation
des valeurs renvoyées par getTypeMap et getSymbolMap.
-
Toujours dans le TypeChecker, la classe Env possède un
champs expectedType à quoi sert'il ?
Le champs returnType a disparu de la classe Env, pourquoi ?
Par quoi a t'il été remplacé ?
-
Pour le générateur, à quoi sert la classe LoopsLabel ?
Comment est-elle utilisée ?
-
Que fait la méthode indyOperator dans la classe Gen ?
A quoi servent les constantes OPERATOR_BSM, CALL_BSM
et CONVERT_BSM ?
-
A quoi sert la classe DescriptorMap ?
En quoi cette classe est-elle reliée avec les méthodes getDescriptorMapObject
et setDescriptorMapObject de la classe RT et les méthodes
createMH de la classe Engine ?
Exercice 2 - I say run ...
-
Expliquer pourquoi le code ci-dessous ne fonctionne pas ?
fun hello(message) {
print(message)
}
{
hello("World!")
}
-
Ecrire le code de la méthode de bootstrap pour que cela fonctionne.
Pour cela, utiliser la classe Engine pour générer le code
de la fonction ci-nécessaire puis insérer le methode handle correspondant
dans le callsite.
Attention à ce que le type du callsite et le type du method handle match.
Exercice 3 - and convert
-
Expliquer pourquoi le code ci-dessous fonctionne
{
var a = "foo"
var b = a
}
mais pas celui-là
{
var a = "foo"
var string b = a
}
-
Ecrire le code de la méthode de bootstrap pour que cela fonctionne dans tous les cas.
Exercice 4 - Un opérateur sur 10 comprend le binaire
On souhaite implanter les deux opérateurs == et !=,
pour ces deux opérateur, il y a 3 cas différents, soit l'opérande de gauche et de droite
est dynamique soit seul l'opérande de gauche est dynamique soit seul l'opérande de droite
est dynamique.
-
Pourquoi on ne doit pas implanter le cas ou les deux opérandes ne sont pas dynamique ?
-
A quoi sert la méthode Operators.getOp ?
-
Implanter le cas où les deux opérandes sont dynamiques. Pourquoi n'a t'on pas besoin
de tester que les deux valeurs ont le même type.
-
Dans le cas où un des opérandes n'est pas dynamique, alors l'autre valeur doit être
du même type que celui qui n'est pas dynamique.
Implanter les deux cas restant en utilisant un guardWithTest pour vérifier
que l'opérande dynamique est du bon type avant d'appeler la bonne implantation
de == et !=.
Exercice 5 - Errare computerum est
On souhaite que lorsque l'on jette une exception RuntimeFailureException,
que celle-ci indique les numéros de ligne et de colonne du script correspondant
à là où l'erreur se produit.
-
La méthode de bootstrap pour les opérateurs appele numericOperator
mais ne cacul pas le noeud de l'AST correspondant.
Modifier celle-ci pour utiliser le mecanisme de DescriptorMap (cf Exercice 1)
et le nodeDescriptorMapIndex pour trouver le noeud de l'AST correspondant à l'operateur
pour permettre d'avoir un message d'erreur qui affiche les numéros de ligne et de colonne.
© Université de Marne-la-Vallée