反编译JVM语言

时间:2011-04-19 21:07:42

标签: java jvm reverse-engineering decompiling jvm-languages

是否可以将Groovy,Scala等JVM语言反编译为初始形式?

如果我尝试反编译一个4行的Groovy类,我会得到大约20行反编译的Java代码。

这更像是一个理论问题,而不是一个实际问题,因为市场上没有这样的反编译器(不是我所知道的)。

感谢。

3 个答案:

答案 0 :(得分:3)

是的,它可能具有Java反编译器可以管理的类似保真度(意思是:代码看起来相似,但不一定相同)。

但是,您需要为每种语言使用专用的反编译器。

编辑:我想我需要澄清一下我期望的保真程度:

  • 局部变量的名称可能是可重现的,也可能是不可重现的
  • 循环类型可能被误解释(for替换为while,...)
  • 更一般:可以用两种类似方式完成的事情可能会被误解
  • ...

所有这些都是反编译Java代码时也会出现的错误,因为从字节代码到Java源代码的关联不是1:1。

但是,如果你有一个专用的Groovy反编译器,那么我强烈怀疑它能够从反编译的Groovy代码产生更可读的代码,而不是Java反编译器。

答案 1 :(得分:1)

不一定可能。例如,一种语言可能会以不可逆的方式破坏它的名称。此外,它可以将源语言的不同构造映射到单个java语言构造。

然而,最令人不快的是,java语言(与JVM字节码相比)无法强大到足以对源语言的某些概念或构造进行编码,从而可以实现它们。 Java和JVM字节码已经是这种情况,后者无法表达泛型。

答案 2 :(得分:0)

嗯,我能想到的唯一问题是编译器优化和注释的问题。注释不会保留在字节码中(幸运的是),并且编译器可能会更改源代码以获得更好的性能,除了它似乎可能。