我不明白LLVM和java(字节码)之间的区别,它们是什么?
-edit-由'他们是什么'我的意思是LLVM和java(字节码)之间的差异,而不是LLVM和java。
答案 0 :(得分:82)
假设您的意思是JVM而不是Java:
LLVM是基于低级寄存器的虚拟机。 它旨在抽象底层硬件,并在编译器后端(机器代码生成)和前端(解析等)之间划清界限。
JVM是一个更高级别的基于堆栈的虚拟机。 JVM提供垃圾收集,具有对象和虚方法调用等概念。因此,JVM为语言互操作性提供了更高级别的基础结构(非常类似于Microsoft的CLR)。
(可以在LLVM上构建这些抽象,就像可以在C上构建它们一样。)
答案 1 :(得分:26)
这个问题在错误的脚上走了太糟糕了。我来找它寻找更详细的比较。
JVM字节码和LLVM bitcode之间的最大区别在于JVM指令是面向堆栈的,而LLVM bitcode则不是。这意味着JVM字节码不是将值加载到寄存器中,而是将值加载到堆栈中并从那里计算值。我相信这样做的一个优点是编译器不必分配寄存器,但我不确定。
LLVM bitcode更接近机器级代码,但不受特定架构的约束。例如,我认为LLVM bitcode可以使用任意数量的逻辑寄存器。也许更熟悉LLVM的人可以在这里说出来?
答案 2 :(得分:1)
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的最重要方法。
答案 3 :(得分:-2)
Java是一种编程语言,它使用JVM作为“即时”(JIT)执行的手段,而LLVM是一种编译器构建工具包,旨在为现有语言开发新语言和前端。 LLVM 具有JIT引擎,但如果您不需要它,则无需使用它。您可以抛弃LLVM汇编程序,字节代码或特定于平台的汇编程序,而不是使用JIT执行。