:: Enseignements :: ESIPE :: E4INFO :: 2009-2010 :: Génération de code ::
[LOGO]

Génération de code Jasmin


Le but de ce TD est de se familiariser avec la génération de code Jasmin.

Jasmin

Jasmin est un assembleur open-source pour créer des fichiers classes à partir d'une syntaxe ressemblant à de l'assembleur et lisible en ASCII. Il utilise des ensembles d'instructions de la Machine Virtuelle Java. Télécharger l'archive jasmin.jar. Vous pouvez vous aider du guide officiel et d'un tutoriel basé sur des exemples. Il existe aussi un cours intéressant.
Nous vous conseillons d'utiliser la liste des instructions décrites ici.

Exercice 1 - Génération de classes simples

Exercice 2 - Génération avec visiteur

Le but de l'exercice est d'écrire un visiteur qui génère le code Jasmin correspondant au petit langage (reconnu par la grammaire du td précédent). Le code Jasmin comprendra le calcul et l'affichage des variables. Suivre les instructions suivantes:

  1. Télécharger l'archive gc-ir2-td4.zip. Elle reprend en partie la correction du TD précédent. Elle contient également une classe à compléter GeneratorVisitor qui devra générer le code Jasmin voulu. Elle prend dans son constructeur deux arguments: la bindingMap remplie par le TypeCheckingVisitor et le nom du fichier dans lequel le code Jasmin sera généré. La méthode print permet d'écrire dans ce fichier une chaîne de caractères.
  2. Affichage du nom des variables
    Compléter le visiteur pour qu'il génère du code Jasmin permettant d'afficher le nom des variables lors de leur déclaration.
    On supposera que la taille de la pile et le nombre de variables sont fixés!
  3. Opérations sur les réels
    Compléter le visiteur pour qu'il génère le code Jasmin permettant de calculer les expressions arithmétiques sur les réels (+,-,*) et d'afficher le résultat pour chacune des variables (ex. let x = 2.1 + 7 * 6;).
    On supposera pour l'instant que les expressions ne peuvent pas contenir de variables!
  4. Utilisation des variables
    Compléter le visiteur pour, maintenant, tenir compte des variables (ex. let y = 1 - x * 6;).
    Indication: utiliser la bindingMap et la VarSlopMap associant à chaque variable (Var) un identifiant entier correspondant à son numéro de registre.
    Attention: un réel prend 2 places (2 registres) et un booléen (en fait, un entier) prend 1 place!.
  5. Calcul des expressions d'égalité et d'inégalité
    Traiter maintenant le cas des expressions d'égalité et d'inégalité (ex. let z = y == 7 != false;).
    Indication: il existe deux cas à traiter: le cas où les opérandes sont des booléens et le cas où ce sont des réels.
    Attention: dorénavant, les variables peuvent être soit des réels soit des booléens!!
  6. Gestion des if
    Gérer maintenant les expressions contenant des if (ex. let w = 5.1 + if(z == true) 3 else 1;).
  7. Taille de pile et nombre de registres
    Calculer dynamiquement la taille de la pile et le nombre nécessaire de registres.