Traducteur de byte code Java en byte code .Net
Embed Size (px)
description
Transcript of Traducteur de byte code Java en byte code .Net
-
Traducteur de byte code Java en byte code .NetSylvain PascheEPFL 2003
-
IntroductionBut: Raliser un traducteur de byte code Java en byte code .NetFichiers .class JavaFichiers .exe .Net
-
Droulement
Partie thorique: algorithmes de traduction
Partie implmentation: ralisation du traducteur
-
Les deux plates-formes
Java.NetSun en 1995Format intermdiaire: byte code JavaMachine pileByte code conu pour le langage Java
8 typesMicrosoft en 2001Format intermdiaire: byte code .NetMachine pileByte code conu pour tre indpendant du langage (C#, J#, VB.net, ). 17 types
-
Partie thorique: approche Top downPaquetages en assemblagesClassesMthodes et champsInstructions
-
Traduction des paquetagespackage org.epfl; class Foo class BarAssembly MyAssembly class Foo class Barorg.epfl MyAssembly
Java.NetClasses organises en paquetagesClasses organises en assemblages
-
Traduction des classesCas gnral: gardent le mme nomCas spciaux:
Objets auxiliaires pour rediriger les mthodesjava.lang.ObjectSystem.Objectjava.lang.StringSystem.Stringjava.lang.String trim()JavaStringWrapper trim()java.lang.Longjava.lang.Long
-
Traduction des instructionsAlgorithme gnral: traduction locale On peut catgoriser les instructions en deux classes:Triviales: traduction locale directe
non trivialesiadd, ladd addiinc ??? (pas dquivalent)
-
Instructions traduction trivialearithmtiques*add, *sub, *mul, *div, *rem, conversioni2l, i2f, ...comparaison*cmpg, *cmpgautresnop, monitorenter, monitorexit, exemple:traduction de imul:
imul mul
-
Instructions non trivialesInstructions daccs aux paramtres et variables localesExceptionsAperu des autres algorithmes
-
Instructions daccs aux paramtres et variables locales0intdouble1floatString2floatintcharparamtrevariables locales0int0float1String1doubleinstructions: *load, *storeinstructions: ldarg, starginstructions: ldloc, stloc
-
Paramtres et variables locales: algorithmeLes slots Java ne sont pas typs, alors quils le sont en .NetJava mmes slots pour arguments et variables localesAnalyse des types stocks dans les slotsAllocation des variables locales et arguments .NetLors de la production du code, slectionner la bonne instruction (variable loc / argument) + le slot .Net
-
ExceptionsJava contient moins dinformation sur les blocs dexception. Il faut retrouver cette information
-
Reconstituer les blocs: tche difficileJava pose trs peu de contraintes sur lemplacement des blocsLalgorithme gnral trs complexeSimplification: blocs dans lordretry starttry endcatch startcatch endfinally startfinally endfacile calculerplus difficile trouver
-
Algorithme de reconstitution des blocsAlgorithme bas sur des exprimentationsPrincipe: analyser les sauts pour en dduire la fin des blocsMarche bien dans la plupart des cas, moins bien dans les situations complexes (imbrications, )
-
Autres algorithmesPas de temps pour tous les voir:instructions de cration dobjetsinstructions dappel de mthodesinstructions daccs aux champsinstructions de branchementinstructions de manipulation de la pile
-
Partie 2: implmentationScnario 1Scnario 2
-
Librairie BCELByte Code Engineering LibraryOffre beaucoup de fonctionnalits avancesUn vrificateur, mais ne permet pas daccder aux informations des types:Modifications de la librairie pour permettre d extraire ces informations
-
Libraire Msil (1)Dveloppe par Laurent Rolaz au LAMPSinspire de System.Reflection.Emit, mais crite en JavaPetit sous ensemble des fonctionnalits de System.Reflection.EmitGnre un fichier texte dinstructions qui doit ensuite tre assembl
-
Librairie Msil (2)Librairie peu teste:Corrections des bugs faire
Fonctionnalits limites:Ajout de nouvelles fonctionnalits pour le traducteur
-
Le traducteur: Java2ilhttp://java2il.sourceforge.net
Implmente tous les algorithmes partie thoriqueGre plusieurs formats en entre (.jar, .class, )Interface ligne de commande simple et intuitiveFichiers de configuration pour grer les paramtres
-
Interface ligne de commandejava2il --assembly Hello --entrypoint Main Hello.class java.util.Date myjar.jar(facultatif)nom de lassemblage traduit(facultatif)nom de la classe du point dentrenom des classes traduire:Fichiers .classFichiers .jarnom de classes Java
-
Fichiers de configurationCorrespondance paquetages Java et assemblages .Net
spcifie pour chaque paquetage Java le nom de lassemblage .Net traduitOptions de traduction:
Niveau de dboguageQuels sont les objets qui redirigent les mthodes de java.lang.Object et java.lang.String
-
LimitationsLes limitations sont celles poses par les algorithmesLa traduction des exceptions pose parfois problmene parvient pas trouver les bornes des blocs dexception dans les cas compliqus (imbrications multiples)La traduction de certaines instructions pourrait tre optimise
-
ConclusionSuccs ! le but est atteint
Tests concluants effectus sur le compilateur MiscLa traduction peut paratre simple, mais des problme complexes se posent
-
Questions ?
-
Traduction des classes: cas de java.lang.Object et java.lang.Stringjava.lang.ObjectSystem.ObjectScnario choisi:java.lang.StringSystem.Stringjava.lang.String trim()JavaStringWrapper trim()Il faudra rediriger les mthodes appeles sur ces objets avec des classes auxiliaires:
-
Traduction des classes: cas de java.lang.Objectjava.lang.ObjectSystem.Objectjava.lang.ObjectSystem.Object?scnario 1scnario 2
-
Traduction des mthodesCas gnral: mme nomSi on traduit java.lang.String en System.String, il faut rediriger certaines mthodes. De mme pour java.lang.ObjectPour se faire, on utilise des classes auxiliaire:java.lang.String trim()JavaStringWrapper trim()
-
Instructions de cration dobjetsLalgorithme simpliste consiste ignorer les instructions new et dup, et traduire inovkespecial en newobj
Java.Netnew java.util.Datedupinvokespecial java.util.Date.
newobj java.util.Date
-
Cas particuliers: les objets dans les slots Javaldstr a_stringastore 1new java.util.Dateastore 1Faut-il utiliser deux slots .Net ?1java.lang.String2java.util.Date
-
Instructions de manipulation de la pileJava comporte beaucoup dinstructions de manipulation de la pile, absente en .Netpop, dup, pop2, dup_x1, dup_x2, dup2, dup2_x1, dup2_x2, swapComment les traduire ?Une solution est dutiliser les variables locales, et faire des empilements et dpilements
-
Instructions de manipulation de la pile: exemple (1)instruction dup_x2
Il faut dabord analyser quelle forme considrer11/211121111haut de la pilebas de la pileForme 1Forme 2
-
Instructions de manipulation de la pile: exemple (2)instruction dup_x2 (forme 1)
1111111haut de la pilebas de la pileForme 1stockage variables localesstloc 1stloc 2stloc 32) dpilement sur la pileldloc 1ldloc 3ldloc 2ldloc 1tat des variables locales:1
2
3
-
Autres algorithmesPas de temps pour tous les voir:instructions de cration dobjetsJava: 2 phases: new et appel mthode initialisation.Net : linstruction newobj initialise lobjet en une tapeinstructions dappel de mthodesinvoke* peuvent se traduire diffremment selon le contexteinstructions daccs au champssmantique diffrente entre les deux plates-formesinstructions de branchementla traduction dpend de si lon se trouve dans une exception ou noninstructions de manipulation de la pileJava possde beaucoup plus dinstructions que .Net
-
Les exceptions de la machine virtuelleQue se passe-t-il lors dune division par zro ?Java: lance java.lang.ArithmeticException.Net: lance System.DivideByZeroExceptionUne simple traduction du bloc catch ne va pas intercepter lexception .NetAlgorithme: utiliser les blocs filter de .Net pour reconstruire une exception Java
-
Scnario 1lecture bc. Java
criture bc. .Net
System.Reflection.Emit
Dsavantage: il faut implmenter une librairie de lecture de bytecode JavaAvantage: System.Reflection.Emit permet accs informations des classes .Net
-
Scnario 2lecture bt. Java
BCEL
criture bt. .Net
MsilDsavantage: pas daccs aux informations des classes .Net, Msil non matureAvantage: pas de librairie implmenter partir de rienAssembleur bytecode .Net