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

Lab 3 - Interpreter Java


On souhaite enfin implanter un interpreteur sur la JVM.
Une base de code est disponible: vm2015-lab3.zip
Voici une video de Charles Nutter, un des créateurs de JRuby qui explique comment marche le bytecode Java.
Java Bytecode for Dummies par Charles Nutter


Exercice 1 - JVM interpreter

Le but de cet exercice est d'écrire un interpreteur/compilateur qui va pour chaque fonction du langage Script va générer le bytecode Java correspondant puis faire exécuter celui-ci par la machine virtuelle Java.
Rappel, on exécute le programme avec
         java -jar script.jar mon_program_que_je_veux_executer.script
        

  1. Tester le JAR exécutable sur les différents scriptes du répertoire samples. Que fait-il ?
  2. A quoi servent les classes Generator, Linker et RT ?
  3. Comment marche la méthode findSlot de la classe Env (déclarée dans la classe Generator) ?
  4. Que doit on implanter pour que le script suivant fonctionne ?
              fn (main:
                3
              )
             
  5. Que doit on implanter pour que le script suivant fonctionne ?
              fn (main:
                print(3)
              )
             
  6. Qu'affiche le script suivant, est-ce normal ?
              fn (main:
                print(print(3))
              )
             
  7. Verifier aussi que le helloworld fonctionne aussi
              fn (main:
                print('hello world !')
              )
             
  8. Que doit on implanter pour que le script suivant fonctionne ?
              fn (main:
                a = 3
                print(a)
              )
             
  9. Verifier que le script suivant fonctionne aussi
              fn (main:
                b = a = 3
                print(a)
                print(b)
              )
             
  10. Faire en sorte que le script suivant fonctionne
              fn (main:
                a = 1
                print(a + 1)
              )
             
  11. On cherche à implanter le 'if', faire en sorte que le script suivant fonctionne
              fn (main:
                a = 1
                b = if(a 23 34)
                print(b)
              )
             
  12. On cherche à implanter le 'while', faire en sorte que le script suivant fonctionne
              fn (main:
                a = 0
                while(a < 10
                  print(a)
                  a = a + 1
                )
                print('done')
              )
             
  13. On souhaite que l'appel de fonction marche. Faire en sorte que le script suivant fonctionne.
              fn(identity x:
               x)
               
              fn(main:
                print(123)
                print('hello')
              )
             
  14. Vérifier que les codes suivants ne sont pas valides et lève une exception
    Utilisation de variable non définie:
               fn(main:
                 print(a)
               )
             
    Utilisation d'une fonction non définie:
               fn(main:
                 foo()
               )
             
  15. Vérifier que les codes récursifs fonctionnent, par exemple, avec factoriel
              fn (fact x:
                if(x == 1 1 fact(n - 1)))
                
              fn(main:
                print(fact(5))
              )