LLVM和Java字节码有什么区别?


74

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

-edit-的意思是LLVM和Java(字节码)之间的区别,而不是LLVM和Java。


19
代表我们当中那些真正理解您的要求的人,我对您得到的所有愚蠢答案表示歉意。:-(
肯(Ken)

19
如果问题的措词不明确,则答案不是愚蠢的,而是问题。对不起,但是无论谁说以下答案是“愚蠢的”,都应重新阅读此线程中的所有内容。当我回答您的问题时,就像“ llvm和java之间的差异”。肯的​​评论听起来很自大。
Johannes Schaub-litb

2
爱评论肯。对不起,AcidZombie24提供了一些答案。
user254492'3

Answers:


87

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

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

JVM是更高级别的基于堆栈的虚拟机。JVM提供垃圾回收,具有对象和虚拟方法调用等概念。因此,JVM为语言互操作性提供了更高层次的基础结构(非常类似于Microsoft的CLR)。

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



13
@Robert Zaremba您是否曾经尝试使用LLVM实现垃圾回收?我有。基本上,您必须自己完成所有操作(尽管周围有过时的示例,但它们甚至没有提供简单的垃圾收集器)。LLVM只是为您的代码提供了内在函数,以将它们连接到GC。与JVM相反,JVM提供了内置的强制性垃圾收集器,该垃圾收集器自动对所有对象起作用。
mgiuca

1
@mgiuca经过5年,Swift中的ARC比Java GC好得多。quora.com/…–
詹姆斯·雷

JVM几乎就像解释器一样,这也不是差异之一,因为用户需要安装它才能执行程序,而LLVM用于预先生成特定于体系结构的可执行文件(我可能很误会,刚开始了解这一点)?
Ixx

(可能是我在描述JIT与AOT,其中JVM更常用于JIT和LLVM AOT吗?)
Ixx

28

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

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

LLVM位代码更接近于机器级代码,但不受特定体系结构的约束。例如,我认为LLVM位代码可以利用任意数量的逻辑寄存器。也许更熟悉LLVM的人可以在这里说出来?


1
“我相信这样做的一个优点是编译器不必分配寄存器,但是我不确定。” 不确定。ISTR的优点是基于堆栈的易于验证。
JD

1
“我相信这样做的一个优点是编译器不必分配寄存器,但是我不确定。” -基于LLVM的编译器不必处理寄存器分配-它更多是SSA形式。要使LLVM / JVM高效运行,必须做到这一点,因为一般而言,内存要比CPU寄存器慢得多(甚至更慢)。
Maciej Piechotka

7
从性能的角度来看,在堆栈上加载值是不利的。看看这个pdf。
om-nom-nom 2012年

位码和字节码之间的区别是什么?它们是相同的意思还是还有别的东西?
asgs

llvm IR(中间表示)假设您要使用无限个寄存器,llvm后端将根据您所针对的体系结构将这些寄存器映射到物理寄存器。
wfbarksdale

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的最重要方法。


-4

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.