7

我正在寻找将 Java 字节码转换为其他编程语言的方法/工具/项目,或者,如果失败了,至少转换为结构化表示(如 XML)。理想的开源,自然。

我看过ASM,“字节码操作和分析框架”。它不支持转换为其他表示,但看起来像是这样一个项目的良好基础。可悲的是,他们的用户页面上列出的项目都没有接近。

4

4 回答 4

7

ASM 有 tree api,它基本上可以为您提供字节码的完整结构。似乎很容易使用它甚至访问者 api 以 XML 或其他格式打印出来。不知道那有什么用。

翻译回 Java 是反编译器的工作,像 Jad 这样的工作就可以了。但这很难,因为a)在源到字节码的转换过程中会丢失信息,b)在多个源可以产生相同的字节码时存在歧义。

如果您真的想直接从字节码转换为另一种高级语言,那么这将很难全面而有意义地完成,出于同样的原因,反编译也很困难,除非转换成另一种语言更糟糕。

如果您想从 Java 源代码转换到另一种语言的源代码,这在之前已经完成,就像在这个Java-to-Python 转换器中一样。这有点容易,因为您可以使用Antlr或内置 Java 编译器工具Project Jackpot等将 Java 转换为 AST。即便如此,我认为您不会在目标语言中获得非常惯用的代码。

于 2009-03-12T14:10:11.470 回答
2

试试BCEL(字节码工程库)。您可以实现一个访问者接口,您可以使用它来生成您想要的任何内容(另一种语言的源代码、自定义 AST、xml 等等)。

我在大学的一个项目中使用了它,我(主要)修改了一个可以处理 Java 源代码的程序分析框架,使其也可以处理 Java 字节码。该任务涉及为分析框架的内部 AST 表示生成节点。

还,

我简要浏览了您提到的“ASM”项目的文档。看起来它定义了几个 vistior 类。您也应该能够使用它们来做您想做的事情。

如果您不熟悉访问者模式,请查看此处的说明。另外,如果你还没有读过,“四人帮”这本书是一本不错的书。

于 2009-03-12T16:50:11.197 回答
1

看起来你正在寻找一个交叉编译器。我知道xmlvm项目,但从未使用过它。也许这适合您的需求。

于 2009-03-12T13:04:22.140 回答
1

您可以尝试gcj将字节码转换为本机代码。

如果您想转换成诸如 python/groovy/ruby 之类的语言,也许可以考虑直接在 JVM 上用这些语言编写(我意识到这并不是您想要的)

或许可以从这个Eclipse Byte Code outline viewer 之类的东西中寻找一些示例。

最后,从一种低级语言(字节码)转换为另一种语言将非常棘手,正确性将是一个问题。

于 2009-03-12T13:12:35.973 回答