Surveillez de près le rapport des points assignés au générateur et aux extensions bonus: ne gaspillez pas des forces ou du temps dont vous ne disposez pas pour un gain qui n'en vaut pas forcément la peine.
Si vous souhaitez modifier les grammaires ou le système de types de Vier dans le cadre de l'implantation d'une extension, vous pouvez vous servir du fichier LaTeX original de la spécification (qui utilises la librairie mathpartir
).
Extension 1: la boucle
Actuellement Vier ne permet d'implanter du code répétitif qu'à l'aide de la récursion. La boucle while
— qui répète une expression jusqu'à ce qu'une condition soit vraie — est la construction la plus simple permettant d'ajouter la répétition de façon native.
Le bonus de 2 points sera donné à tout groupe qui, lors du test de l'étape generator, peut démontrer les propriétés suivantes de son compilateur.
- La capacité d'accepter des programmes contenants des boucles dont vous définirez la syntaxe.
- La capacité de détecter des boucles invalides du points de vue de la sûreté du typage dont vous définirez les propriétés exactes.
- La capacité de générer du code assembleur DLX correspondant à cette opération.
Extension 2: le test et la coercition dynamique de type
Certains langages objet, comme Java ou Scala, disposent d'un mécanisme permettant
-
de tester dynamiquement de quelle classe un objet est une instance (
isInstanceOf
), -
de coercer le type statique d'une classe vers quelque chose de plus précis, c'est-à-dire un sous type du type statique, et de générer une erreur dynamique si cette coercition s'avère finalement impossible (
asInstanceOf
).
Ce mécanisme, très utilisé dans des langages avec des systèmes de types «pauvres» (comme Java 1.4), peut également être ajouté à Vier.
Le bonus de 4 points sera donné à tout groupe qui, lors du test de l'étape generator, peut démontrer les propriétés suivantes de son compilateur.
- La capacité d'accepter des programmes contenants des coercitions dont vous définirez la syntaxe.
- La capacité de détecter des coercitions ou tests invalides du points de vue de la sûreté du typage dont vous définirez les propriétés exactes.
- La capacité de générer du code assembleur DLX correspondant à ces opérations.
Extension 3: les variables locales
La seule forme de stockage modifiable que Vier permet sont les champs des classes. Dans ces conditions, l'implantation des méthodes tend à s'étendre dans l'interface de la classe, ce qui est regrettable. La notion de variable locale permet de différencier entre du stockage propre à la classe, et du stockage temporaire pour l'implantation d'une méthode.
En Vier, l'endroit naturel ou définir des variables est sous forme d'expression à l'intérieur des blocs. La variable est ensuite accessible jusqu'à la fin du bloc (ou dans des blocs imbriqués).
Conseils: Pour gérer les variables dans le générateur, il faut modifier la gestion de la pile. L'adresse du début du bloc d'activation d'une méthode ne change pas au cours d'un appel donné; il est désigné par FP
(frame pointer). La fin du bloc est par contre variable (contrairement à la situation sans variable); elle est repérée par le registre SP
(stack pointer). La différence entre SP
et FP
est appelée la taille du bloc d'activation (frame size).
Ainsi, lors de la génération de code, vous devez calculer pour chaque instruction quelle est la taille du bloc d'activation. Pour cela, la classe Code
fournit les méthodes incFrameSize
, decFrameSize
et getFrameSize
.
La déclaration d'une variable la place au sommet de la pile. Afin de générer le code pour modifier et lire cette variable, il faut toujours savoir où elle se trouve sur la pile. Pour cela, on ajoute un champ offset
au symbole de variable. Ce champ contient la position de la variable sur la pile par rapport à FP
. Il doit être initialisé pendant la génération du code de la déclaration de variable.
La génération de code des blocs doit bien sûr générer le code des expressions et de l'expression finale qu'ils contiennent. En plus de cela, ils doivent libérer la mémoire allouée sur la pile par les éventuelles déclarations de variables qu'ils contiennent.
Le bonus de 6 points sera donné à tout groupe qui, lors du test de l'étape generator, peut démontrer les propriétés suivantes de son compilateur.
- La capacité d'accepter des programmes contenants des déclarations, des lectures et des écritures de variables dont la portée est contrôlée par les blocs et dont vous définirez la syntaxe.
- La capacité de détecter des déclarations, lectures ou écritures de variables invalides du points de vue de la sûreté du typage dont vous définirez les propriétés exactes, mais qui exclut en particulier l'écriture ou la lecture de variables hors de leur portée.
- La capacité de générer du code assembleur DLX correspondant à ces opérations.