Title: Traducteur de byte code Java en byte code .Net
1Traducteur de byte code Java en byte code .Net
2Introduction
- But Réaliser un traducteur de byte code Java en
byte code .Net
Fichiers .class Java
Fichiers .exe .Net
3Déroulement
- Partie théorique algorithmes de traduction
- Partie implémentation réalisation du traducteur
4Les deux plates-formes
Java .Net
Sun en 1995 Format intermédiaire byte code Java Machine à pile Byte code conçu pour le langage Java 8 types Microsoft en 2001 Format intermédiaire byte code .Net Machine à pile Byte code conçu pour être indépendant du langage (C, J, VB.net, ). 17 types
5Partie théorique approche Top down
- Paquetages en assemblages
- Classes
- Méthodes et champs
- Instructions
6Traduction des paquetages
Java .Net
Classes organisées en paquetages Classes organisées en assemblages
package org.epfl class Foo class Bar
Assembly MyAssembly class Foo class
Bar
org.epfl ? MyAssembly
7Traduction des classes
- Cas général gardent le même nom
java.lang.Long
java.lang.Long
- Cas spéciaux
- Objets auxiliaires pour rediriger les méthodes
java.lang.Object
System.Object
java.lang.String
System.String
java.lang.String trim()
JavaStringWrapper trim()
8Traduction des instructions
- Algorithme général traduction locale
- On peut catégoriser les instructions en deux
classes - Triviales traduction locale directe
- non triviales
iadd, ladd ? add
iinc ? ??? (pas déquivalent)
9Instructions à traduction triviale
- arithmétiques
- add, sub, mul, div, rem,
- conversion
- i2l, i2f, ...
- comparaison
- cmpg, cmpg
- autres
- nop, monitorenter, monitorexit,
exemple traduction de imul imul ? mul
10Instructions non triviales
- Instructions daccès aux paramètres et variables
locales - Exceptions
- Aperçu des autres algorithmes
11Instructions daccès aux paramètres et variables
locales
Java .Net
paramètres variables locales paramètres variables locales
paramètre
0
int
0
int
double
1
double
1
float
String
instructions ldarg, starg
variables locales
2
float
char
0
float
int
1
String
instructions load, store
instructions ldloc, stloc
12Paramètres et variables locales algorithme
- Les slots Java ne sont pas typés, alors
quils le sont en .Net - Java mêmes slots pour arguments et variables
locales - Analyse des types stockés dans les slots
- Allocation des variables locales et arguments
.Net - Lors de la production du code, sélectionner la
bonne instruction (variable loc / argument) le
slot .Net
13Exceptions
Un bloc Java Un bloc .Net
try start 0x12 try end 0x21 catch start 0x23 catch end ??? finally start 0x34 finally end ??? try start 0x14 try end 0x20 catch start 0x22 catch end 0x27 finally start 0x30 finally end 0x40
Java contient moins dinformation sur les blocs
dexception. ? Il faut retrouver cette
information
14Reconstituer les blocs tâche difficile
- Java pose très peu de contraintes sur
lemplacement des blocs - Lalgorithme général très complexe
- Simplification blocs dans lordre
try start try end
facile à calculer
catch start catch end
finally start finally end
plus difficile à trouver
15Algorithme de reconstitution des blocs
- Algorithme basé sur des expérimentations
- Principe analyser les sauts pour en déduire la
fin des blocs - Marche bien dans la plupart des cas, moins bien
dans les situations complexes (imbrications, )
16Autres algorithmes
- Pas de temps pour tous les voir
- instructions de création dobjets
- instructions dappel de méthodes
- instructions daccès aux champs
- instructions de branchement
- instructions de manipulation de la pile
17Partie 2 implémentation
Java .Net
Librairie lecture bytecode Java JikesBt gnu.bytecode BCEL Ø
librairie écriture bytecode .Net Msil System.Refle-ction.Emit
Scénario 1
Scénario 2
18Librairie BCEL
- Byte Code Engineering Library
- Offre beaucoup de fonctionnalités avancées
- Un vérificateur, mais ne permet pas daccéder aux
informations des types - Modifications de la librairie pour permettre d
extraire ces informations
19Libraire Msil (1)
- Développée par Laurent Rolaz au LAMP
- Sinspire de System.Reflection.Emit, mais écrite
en Java - Petit sous ensemble des fonctionnalités de
System.Reflection.Emit - Génère un fichier texte dinstructions qui doit
ensuite être assemblé
20Librairie Msil (2)
- Librairie peu testée
- Corrections des bugs à faire
- Fonctionnalités limitées
- Ajout de nouvelles fonctionnalités pour le
traducteur
21Le traducteur Java2il
- http//java2il.sourceforge.net
- Implémente tous les algorithmes partie théorique
- Gère plusieurs formats en entrée (.jar, .class,
) - Interface ligne de commande simple et intuitive
- Fichiers de configuration pour gérer les
paramètres
22Interface ligne de commande
(facultatif) nom de lassemblage traduit
java2il --assembly Hello --entrypoint Main
Hello.class java.util.Date myjar.jar
nom des classes à traduire Fichiers
.class Fichiers .jar nom de classes Java
(facultatif) nom de la classe du point dentrée
23Fichiers de configuration
- Correspondance paquetages Java et assemblages
.Net - spécifie pour chaque paquetage Java le nom de
lassemblage .Net traduit
- Options de traduction
- Niveau de déboguage
- Quels sont les objets qui redirigent les méthodes
de java.lang.Object et java.lang.String
24Limitations
- Les limitations sont celles posées par les
algorithmes - La traduction des exceptions pose parfois
problème - ne parvient pas à trouver les bornes des blocs
dexception dans les cas compliqués (imbrications
multiples) - La traduction de certaines instructions pourrait
être optimisée
25Conclusion
- Succès ! le but est atteint
- Tests concluants effectués sur le compilateur
Misc - La traduction peut paraître simple, mais des
problème complexes se posent
26Questions ?
27Traduction des classes cas de java.lang.Object
et java.lang.String
Scénario choisi
java.lang.Object
System.Object
java.lang.String
System.String
Il faudra rediriger les méthodes appelées sur ces
objets avec des classes auxiliaires
java.lang.String trim()
JavaStringWrapper trim()
28Traduction des classes cas de java.lang.Object
System.Object
scénario 1
?
java.lang.Object
System.Object
scénario 2
java.lang.Object
29Traduction des méthodes
- Cas général même nom
- Si on traduit java.lang.String en System.String,
il faut rediriger certaines méthodes. De même
pour java.lang.Object - Pour se faire, on utilise des classes auxiliaire
java.lang.String trim()
JavaStringWrapper trim()
30Instructions de création dobjets
Java .Net
new java.util.Date dup invokespecial java.util.Date.ltinitgt newobj java.util.Date
Lalgorithme simpliste consiste à ignorer les
instructions new et dup, et traduire
inovkespecial en newobj
31Cas particuliers les objets dans les slots Java
- ldstr a_string
- astore 1
- new java.util.Date
- astore 1
- Faut-il utiliser deux slots .Net ?
1
java.lang.String
2
java.util.Date
32Instructions de manipulation de la pile
- Java comporte beaucoup dinstructions de
manipulation de la pile, absente en .Net - pop, dup, pop2, dup_x1, dup_x2, dup2, dup2_x1,
dup2_x2, swap - Comment les traduire ?
- Une solution est dutiliser les variables
locales, et faire des empilements et dépilements
33Instructions de manipulation de la pile exemple
(1)
- instruction dup_x2
- Il faut dabord analyser quelle forme considérer
Forme 1
1
1
1
1
bas de la pile
1
1/2
1
haut de la pile
Forme 2
2
1
1
34Instructions de manipulation de la pile exemple
(2)
- instruction dup_x2 (forme 1)
Forme 1
bas de la pile
haut de la pile
1
1
1
1
1
1
1
- stockage variables locales
- stloc 1
- stloc 2
- stloc 3
2) dépilement sur la pile ldloc 1 ldloc 3 ldloc
2 ldloc 1
état des variables locales 1 2 3
35Autres algorithmes
- Pas de temps pour tous les voir
- instructions de création dobjets
- Java 2 phases new et appel méthode
initialisation - .Net linstruction newobj initialise lobjet en
une étape - instructions dappel de méthodes
- invoke peuvent se traduire différemment selon le
contexte - instructions daccès au champs
- sémantique différente entre les deux
plates-formes - instructions de branchement
- la traduction dépend de si lon se trouve dans
une exception ou non - instructions de manipulation de la pile
- Java possède beaucoup plus dinstructions que .Net
36Les exceptions de la machine virtuelle
- Que se passe-t-il lors dune division par zéro ?
- Java lance java.lang.ArithmeticException
- .Net lance System.DivideByZeroException
- Une simple traduction du bloc catch ne va pas
intercepter lexception .Net - Algorithme utiliser les blocs filter de .Net
pour reconstruire une exception Java
37Scénario 1
Java .Net
écriture bc. .Net System.Reflection.Emit
lecture bc. Java Ø
Désavantage il faut implémenter une librairie de
lecture de bytecode Java Avantage
System.Reflection.Emit permet accès informations
des classes .Net
38Scénario 2
Java .Net
Assembleur bytecode .Net
lecture bt. Java BCEL
écriture bt. .Net Msil
Désavantage pas daccès aux informations des
classes .Net, Msil non
mature Avantage pas de librairie à
implémenter à partir de rien