2011-04-19 6 views
3

Est-il possible de décompiler les langages JVM comme Groovy, Scala à leur forme initiale?Décomposition des langages JVM

Si j'essaie de décompiler une classe Groovy de 4 lignes, j'obtiens environ 20 lignes de code Java décompilé. Il s'agit plus d'une question théorique que d'une question pratique, car il n'y a pas de tels décompilateurs sur le marché (pas que je sache).

Merci.

+0

Notez que le compilateur _will_ jettera des informations qui ne peuvent pas être reconstruites de sorte que vous n'obtiendrez jamais l'original. –

Répondre

3

Oui, il est possible d'obtenir une fidélité similaire à celle d'un décompilateur Java (ce qui signifie que le code sera similaire, mais pas nécessairement identique). Toutefois, vous auriez besoin d'un décompilateur dédié pour chaque langue.

Edit: Je pense que je dois préciser quel niveau de fidélité je pense:

  • Les noms des variables locales peuvent ou peuvent ne pas être
  • reproductibles types de boucle pourraient être mal interprétés (for remplacé par while, ...)
  • plus générales: Les choses qui peuvent se faire de deux façons similaires pourraient être mal interprétées
  • ...

Toutes ces erreurs se produisent également lors de la décompilation du code Java, simplement parce que l'association du code source au code source Java n'est pas 1: 1.

Cependant, si vous avez un décompilateur Groovy dédié, alors je fortement soupçonne de produire beaucoup code plus lisible de décompiler le code compilé Groovy que Java Decompiler pourrait jamais.

+0

Une hypothèse très optimiste, en effet. – Ingo

+0

@Ingo: Je ne vois pas comment c'est optimiste. Le code produit par un décompilateur Java compétent ne supporte que la similarité de base avec la source originale. Les noms de variables locales sont généralement perdus (sauf s'ils sont explicitement inclus dans les fichiers '.class' lors de la compilation) et le plus souvent, le type spécifique de boucle utilisé est également mal représenté (en remplaçant les boucles' for' par les boucles while). –

+1

J'ai élaboré une opinion différente dans mon article. – Ingo

0

Eh bien, les seules choses auxquelles je peux penser sont les problèmes d'optimisation et de commentaires du compilateur. Les commentaires ne sont pas conservés dans le bytecode (heureusement) et le compilateur peut modifier le code source pour de meilleures performances, à côté de cela il semble possible.

+0

Je ne suis pas inquiet pour les commentaires. Mais comment vas-tu restaurer quelque chose comme ça? this.metaClass = ((MetaClass) ScriptBytecodeAdapter.castToType (tmp12_9, $ get $$ classe $ groovy $ lang $ MetaClass())); tmp12_9; while (true) return; –

+2

@Alexandru: ce n'est pas le code de byte. C'est ainsi qu'un ** décompilateur de langage Java ** essaie d'interpréter du code octet qui n'a pas été produit en compilant du code en langage Java. Ceci est lié à produire des résultats étranges, mais un décompilateur dédié pour le langage correct reconnaîtrait la construction "étrange" du bytecode et connaîtrait la construction de langage qu'il représente. –

+0

@Joachim, vous avez raison ce n'est pas le code de byte, c'est pourquoi je n'ai pas dit que c'est. Je suppose que c'est logique, si vous savez que vous avez affaire à un fichier de classe généré par Groovy, vous devriez savoir que vous devez le traiter différemment d'un fichier de classe généré par Java. –

1

Ce n'est pas forcément possible. Par exemple, un langage pourrait altérer ses noms d'une manière qui n'est pas réversible. En outre, il pourrait mapper différentes constructions de la langue source à une construction de langage java unique. Toutefois, le langage java (par opposition au bytecode JVM) ne pouvait pas être suffisamment puissant pour coder certains concepts ou constructions du langage source de telle sorte qu'ils puissent être réifiés. C'est déjà le cas avec Java et le bytecode JVM, où ce dernier n'est pas capable d'exprimer des génériques.

+0

pour votre deuxième point, je ne voulais pas convertir Java bytecode généré par Groovy à Java, mais de retour à Groovy. –

+0

@Alexandru - C'est exactement mon point de vue - je ne connais pas Groovy, mais je peux imaginer qu'il a certaines fonctionnalités qui ne peuvent pas être compilées en bytecode sans perdre des informations. Un exemple d'un langhuage qui perd de l'information lorsqu'il est compilé en bytecode est, ironiquement, Java lui-même, d'où il est sûr de supposer que cela sera d'autant plus le cas avec d'autres langages. – Ingo

Questions connexes