:: Enseignements :: Master :: M2 :: 2011-2012 :: Machine Virtuelle (et bazard autour ...) ::
[LOGO]

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.

La doc de la JSR 292 (intégré au JDK7) java.lang.invoke.

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.

  1. 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.
  2. 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é ?
  3. Pour le générateur, à quoi sert la classe LoopsLabel ? Comment est-elle utilisée ?
  4. Que fait la méthode indyOperator dans la classe Gen ?
    A quoi servent les constantes OPERATOR_BSM, CALL_BSM et CONVERT_BSM ?
  5. 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 ...


  1. Expliquer pourquoi le code ci-dessous ne fonctionne pas ?
           fun hello(message) {
             print(message)
           }
           
           {
             hello("World!")
           }
           
  2. 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


  1. Expliquer pourquoi le code ci-dessous fonctionne
           {
             var a = "foo"
             var b = a
           }
           
    mais pas celui-là
           {
             var a = "foo"
             var string b = a
           }
           
  2. 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.

  1. Pourquoi on ne doit pas implanter le cas ou les deux opérandes ne sont pas dynamique ?
  2. A quoi sert la méthode Operators.getOp ?
  3. 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.
  4. 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.

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