Cette fonction consomme l’argument pouss´e sur la pile, calcule le sinus, et pousse le
r´esultat sur la pile. On pousse ensuite la variable locale d’indice 0, puis la constante
flottante 3.0, et on demande une division en double, qui va consommer les deux
op´erandes et pousser le quotient. `
A ce point, la pile contient sin(x), puis x/3, du
bas vers le sommet. On additionne les deux op´erandes, qui sont remplac´es par leur
somme, que l’on retourne `a l’appelant.
Ils est assez fastidieux de r´ediger du bytecode Java directement `a l’aide d’un
programme ; il vaut mieux passer par une biblioth`eque ad hoc. Nous sugg´erons
l’utilisation de la biblioth`eque ASM. Le code de g´en´eration de la fonction ci-dessus
est :1
mv = cw.visitMethod(ACC_PUBLIC + ACC_STATIC,
"evaluate", "(D)D", null, null);
mv.visitCode();
mv.visitVarInsn(DLOAD, 0);
mv.visitMethodInsn(INVOKESTATIC, "java/lang/Math", "sin", "(D)D");
mv.visitVarInsn(DLOAD, 0);
mv.visitLdcInsn(new Double("3.0"));
mv.visitInsn(DDIV);
mv.visitInsn(DADD);
mv.visitInsn(DRETURN);
mv.visitMaxs(6, 2);
mv.visitEnd();
6 est la hauteur maximale de la pile demand´ee, en mots, 2 le nombre de mots
de variables locales (ne pas oublier que chaque double prend deux mots).
3 Travail demand´e
`
A partir d’une grammaire d’expressions arithm´etiques (+, -, *, /, ´eventuellement
fonctions comme sinus et cosinus), avec constantes et variables, r´ediger :
•un analyseur syntaxique
•une fonction d’´evaluation des expressions par descente r´ecursive
•une fonction de compilation
Des fichiers seront fournis afin de d´echarger totalement le travail d’interface avec
ASM et la JVM.
`
A titre indicatif, l’impl´ementation de l’enseignant responsable du projet prend
environ 1000 lignes de Java, y compris les m´ethodes de diagnostic, affichage, et
calcul de d´eriv´ees formelles.
4 Suggestion d’extension
Se servir de cette compilation dynamique pour impl´ementer une m´ethode rapide de
r´esolution par la m´ethode de Newton (xn+1 =xn−f(xn)/f0(xn)), avec l’utilisateur
qui donne au clavier une fonction et un point x0.
References
[1] Tim Lindholm and Frank Yellin. The Java Virtual Ma-
chine Specification. Addison-Wesley, 2nd edition, 1999.
http://java.sun.com/docs/books/vmspec/.
1http://asm.objectweb.org/
12