77

我不明白 LLVM 和 java(字节码)之间的区别,它们是什么?

-edit-“它们是什么”我的意思是 LLVM 和 java(字节码)之间的区别,而不是 LLVM 和 java 之间的区别。

4

4 回答 4

88

假设您的意思是 JVM 而不是 Java:

LLVM 是一个低级的基于寄存器的虚拟机。它旨在抽象底层硬件并在编译器后端(机器代码生成)和前端(解析等)之间划清界限。

JVM 是一个更高级别的基于堆栈的虚拟机。JVM 提供垃圾收集,具有对象和虚拟方法调用等概念。因此,JVM 为语言互操作性提供了更高级别的基础设施(很像微软的 CLR)。

(可以在 LLVM 上构建这些抽象,就像可以在 C 之上构建它们一样。)

于 2009-01-18T07:50:06.620 回答
28

太糟糕了,这个问题走错了路。我来寻找更详细的比较。

JVM 字节码和 LLVM 位码之间的最大区别在于 JVM 指令是面向堆栈的,而 LLVM 位码不是。这意味着 JVM 字节码不是将值加载到寄存器中,而是将值加载到堆栈中并从那里计算值。我相信这样做的一个优点是编译器不必分配寄存器,但我不确定。

LLVM 位码更接近机器级代码,但不受特定架构的约束。例如,我认为 LLVM 位码可以使用任意数量的逻辑寄存器。也许更熟悉 LLVM 的人可以在这里发言?

于 2009-11-22T20:41:27.107 回答
3

JVM 字节码和 LLVM 字节码有相同点和不同点。就相似性而言,这是两个中间程序表示。因此,它们可以表示用不同编程语言编写的程序。例如,有将 Java、Closure、Scala 等转换为 JVM 字节码的前端,也有将 C、C++、Swift、Julia、Rust 等转换为 LLVM 字节码的前端。

这就是说,JVM 字节码和 LLVM 字节码在用途和设计上大不相同。从历史上看,JVM 字节码被设计为通过网络(例如 Internet)分布,并通过虚拟机在本地计算机中进行解释。这就是它基于堆栈的原因之一:通常,基于堆栈的字节码更小。

也许,在一开始,LLVM 字节码也被认为是可以解释的,但如果它发生了,它的目的会随着时间而改变。因此,LLVM 字节码是一种用于分析和优化的程序表示。它以静态单一分配格式编码,这更像是程序的数学抽象,而不是实际的可执行程序集。因此,例如,LLVM IR 中的 phi 函数等指令在典型的计算机体系结构中没有直接等效的指令。因此,尽管可以解释 LLVM 字节码(有一个名为 lli 的工具,它是 LLVM 工具链的一部分,可以做到这一点),但这并不是使用 LLVM IR 的最重要方式。

于 2020-06-05T21:05:04.347 回答
-4

Java 是一种编程语言,它使用 JVM 作为“即时”(JIT)执行的手段,而 LLVM 是一种编译器构建工具包,旨在为现有语言开发新语言和前端。LLVM确实有一个 JIT 引擎,但如果您不需要它,则不需要使用它。您可以抛弃 LLVM 汇编器、字节码或平台特定的汇编器,而不是使用 JIT 执行。

于 2009-05-19T14:53:59.333 回答