【问题标题】:Is there a llvm java front end that converts java source to llvm's intermediate form?是否有 llvm java 前端可以将 java 源代码转换为 llvm 的中间形式?
【发布时间】:2021-11-04 06:21:38
【问题描述】:

根据我的阅读,有一个 llvm 程序可以将 java 字节码转换为 llvm 的中间形式,称为 class2llvm。我的问题是,我如何访问它。我必须安装什么前端才能访问它。

VMkit 是他们对 JVM 的实现,但我正在寻找如何使用 llvm 编译 java 源代码,而不是如何运行它。

【问题讨论】:

  • 你明白你可以使用javac(标准的java编译器)来做到这一点吗?你不需要 llvm 的任何东西——你可以安装 oracle jdk(我想这就是你为 class2llvm 准备 java 文件的方式,但这只是一个猜测)
  • @andrewcooke-javac 真的发出 LLVM 字节码吗?你能提供一个关于如何做到这一点的链接吗?
  • 根据我刚刚读到的有关 VMkit 的内容,它支持提前编译。这不正是您所需要的吗?
  • 也许我不明白。 javac 将从 java 源代码转换为字节码。然后 class2llvm 将从字节码转到 llvm。这让你从java源到llvm。这不是你想要的吗?
  • 啊,好吧,我想我明白大家的困惑了。当我说“你不需要来自 llvm 的任何东西”时,我的意思是从源代码到字节码(而不是从源代码到 llvm)。对不起。

标签: java llvm bytecode


【解决方案1】:

Java 前端将 Java 字节码(.class 文件)转换为 LLVM 字节码。看看这个链接:

https://llvm.org/svn/llvm-project/java/trunk/docs/java-frontend.txt

【讨论】:

【解决方案2】:

您可以查看dragonegg,它使 llvm 能够使用 gcc 的前端。由于 gcc 已经有一个 java 前端,称为 gcj,也许 llvm 可以使用它来编译 java 代码。但是我不确定 llvm 与 gcc 前端的接口有多好,所以这可能行不通。

【讨论】:

  • “从 GCC 7 开始,GCC Java 前端和相关的 libjava 运行时库已从 GCC 中删除。”来源:gcc.gnu.org/wiki/GCJ
【解决方案3】:

我已经使用基于 LLVM 的 vmkit (http://vmkit.llvm.org/) 执行了一个 java 类。它使用 LLVM 将高级语言编译和优化为机器代码。 J3 是一个带有 VMKit 的 JVM 实现。

【讨论】:

  • 问题要求转换sourcecode,而不是bytecode
【解决方案4】:

[注意:从 2015 年 11 月起,它不再是开源的,所以这个 hack 几乎没用。]

RoboVM 可能会成为您正在寻找的解决方案。它是开源的,可将 JVM 字节码(.class 文件)编译为机器码。

我假设他们使用 class2llvm 之类的东西来做到这一点。

不幸的是,它仍处于 alpha 阶段。我刚刚在 HelloWorld.java 上对其进行了测试。它使在单核上运行的加载时间提高了 5 倍。 (大部分运行时间是加载时间。)

echo Hello World! : <1 ms : 31K(/usr/bin/echo 二进制文件)

java HelloWorld : ~70 ms : 0.4K(HelloWorld.class JVM 字节码)

./HelloWorld : ~13 ms : 9.4MB(9.3MB 二进制 + 57K robovm-rt.jar)

请注意,java 调用一个 32MB 的 $JAVA_HOME/lib/rt.jar 文件(可能更多)。在这么大的文件中搜索一定是 java 加载速度如此缓慢的部分原因。如果 RoboVM 变得更智能,也许它可以丢弃大部分 9.3MB 二进制文件以获得更快的加载速度?

该网站提到了 iOS,但我认为那是因为他们正在销售他们的附加 UI 库。 RoboVM 在 Ubuntu 上为我编译得很好。只要确保这样做

$ sudo apt-get install g++-multilib

首先(也许安装 libpthread-stubs0-dev 和 libpthread-workqueue0...不知道它们是否重要)。

【讨论】:

  • 问题要求转换sourcecode,而不是bytecode
  • @Martin,显然 java 编译器将源代码转换为 jvm 字节码,然后可以进一步转换。这可能是投票最多的答案也解释了字节码转换的原因。
  • 自 2015 年 11 月起,RoboVM 不再开源,即公司开发的代码不再作为开源代码发布。
猜你喜欢
  • 1970-01-01
  • 2019-01-02
  • 2011-04-05
  • 1970-01-01
  • 2019-08-30
  • 2012-01-23
  • 2011-08-28
  • 2023-03-16
  • 1970-01-01
相关资源
最近更新 更多