1 / 38

Traducteur de byte code Java en byte code .Net

Traducteur de byte code Java en byte code .Net. Sylvain Pasche EPFL 2003. Introduction. But: Réaliser un traducteur de byte code Java en byte code .Net. Fichiers .class Java. Fichiers .exe .Net. Déroulement. Partie théorique: algorithmes de traduction

liesel
Download Presentation

Traducteur de byte code Java en byte code .Net

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Traducteur de byte code Java en byte code .Net Sylvain Pasche EPFL 2003

  2. Introduction • But: Réaliser un traducteur de byte code Java en byte code .Net Fichiers .class Java Fichiers .exe .Net

  3. Déroulement • Partie théorique: algorithmes de traduction • Partie implémentation: réalisation du traducteur

  4. Les deux plates-formes

  5. Partie théorique: approche « Top down » • Paquetages en assemblages • Classes • Méthodes et champs • Instructions

  6. Traduction des paquetages package org.epfl; class Foo class Bar Assembly MyAssembly class Foo class Bar org.epfl  MyAssembly

  7. Traduction 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()

  8. Traduction 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)

  9. Instructions à 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

  10. Instructions non triviales • Instructions d’accès aux paramètres et variables locales • Exceptions • Aperçu des autres algorithmes

  11. Instructions d’accès aux paramètres et variables locales paramètre 0 int 0 int double 1 double instructions: ldarg, starg 1 float String variables locales 2 float char 0 float int instructions: *load, *store 1 String instructions: ldloc, stloc

  12. Paramètres et variables locales: algorithme • Les « slots » Java ne sont pas typés, alors qu’ils 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

  13. Exceptions Java contient moins d’information sur les blocs d’exception.  Il faut retrouver cette information

  14. Reconstituer les blocs: tâche difficile • Java pose très peu de contraintes sur l’emplacement des blocs • L’algorithme général très complexe • Simplification: blocs dans l’ordre try start try end facile à calculer catch start catch end finally start finally end plus difficile à trouver

  15. Algorithme 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, …)

  16. Autres algorithmes • Pas de temps pour tous les voir: • instructions de création d’objets • instructions d’appel de méthodes • instructions d’accès aux champs • instructions de branchement • instructions de manipulation de la pile

  17. Partie 2: implémentation Scénario 2 Scénario 1

  18. Librairie BCEL • « Byte Code Engineering Library » • Offre beaucoup de fonctionnalités avancées • Un vérificateur, mais ne permet pas d’accéder aux informations des types: • Modifications de la librairie pour permettre d’ extraire ces informations

  19. Libraire Msil (1) • Développée par Laurent Rolaz au LAMP • S’inspire de System.Reflection.Emit, mais écrite en Java • Petit sous ensemble des fonctionnalités de System.Reflection.Emit • Génère un fichier texte d’instructions qui doit ensuite être assemblé

  20. Librairie Msil (2) • Librairie peu testée: • Corrections des bugs à faire • Fonctionnalités limitées: • Ajout de nouvelles fonctionnalités pour le traducteur

  21. Le 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

  22. Interface ligne de commande (facultatif) nom de l’assemblage 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 d’entrée

  23. Correspondance paquetages Java et assemblages .Net spécifie pour chaque paquetage Java le nom de l’assemblage .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 … Fichiers de configuration

  24. Limitations • 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 d’exception dans les cas compliqués (imbrications multiples) • La traduction de certaines instructions pourrait être optimisée

  25. Conclusion • 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

  26. Questions ?

  27. Traduction 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()

  28. Traduction des classes: cas de java.lang.Object System.Object scénario 1 ? java.lang.Object System.Object scénario 2 java.lang.Object

  29. Traduction 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()

  30. Instructions de création d’objets L’algorithme simpliste consiste à ignorer les instructions new et dup, et traduire inovkespecial en newobj

  31. Cas 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

  32. Instructions de manipulation de la pile • Java comporte beaucoup d’instructions 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 d’utiliser les variables locales, et faire des empilements et dépilements

  33. Instructions de manipulation de la pile: exemple (1) • instruction dup_x2 • Il faut d’abord analyser quelle forme considérer Forme 1 1 1 1 1 bas de la pile haut de la pile 1 1/2 1 Forme 2 1 2 1

  34. Instructions 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

  35. Autres algorithmes • Pas de temps pour tous les voir: • instructions de création d’objets • Java: 2 phases: new et appel méthode initialisation • .Net : l’instruction newobj initialise l’objet en une étape • instructions d’appel de méthodes • invoke* peuvent se traduire différemment selon le contexte • instructions d’accès au champs • sémantique différente entre les deux plates-formes • instructions de branchement • la traduction dépend de si l’on se trouve dans une exception ou non • instructions de manipulation de la pile • Java possède beaucoup plus d’instructions que .Net

  36. Les exceptions de la machine virtuelle • Que se passe-t-il lors d’une division par zéro ? • Java: lance java.lang.ArithmeticException • .Net: lance System.DivideByZeroException • Une simple traduction du bloc catch ne va pas intercepter l’exception .Net • Algorithme: utiliser les blocs « filter » de .Net pour reconstruire une exception Java

  37. Scénario 1 é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

  38. Scénario 2 Assembleur bytecode .Net lecture bt. Java BCEL écriture bt. .Net Msil Désavantage: ■ pas d’accès aux informations des classes .Net, ■ Msil non mature Avantage: pas de librairie à implémenter à partir de rien

More Related