我不明白LLVM和Java(字节码)之间的区别,它们是什么?
-edit-的意思是LLVM和Java(字节码)之间的区别,而不是LLVM和Java。
我不明白LLVM和Java(字节码)之间的区别,它们是什么?
-edit-的意思是LLVM和Java(字节码)之间的区别,而不是LLVM和Java。
Answers:
假设您的意思是JVM,而不是Java:
LLVM是基于寄存器的低级虚拟机。它旨在抽象化底层硬件,并在编译器后端(机器代码生成)和前端(解析等)之间划清界限。
JVM是更高级别的基于堆栈的虚拟机。JVM提供垃圾回收,具有对象和虚拟方法调用等概念。因此,JVM为语言互操作性提供了更高层次的基础结构(非常类似于Microsoft的CLR)。
(可以在LLVM上构建这些抽象,就像可以在C之上构建它们一样。)
这个问题走错了脚,真是太糟糕了。我来寻找更详细的比较。
JVM字节码与LLVM位码之间的最大区别是JVM指令是面向堆栈的,而LLVM位码则不是。这意味着JVM字节码不是将值加载到寄存器中,而是将值加载到堆栈中并从那里计算值。我认为这样做的一个优点是编译器不必分配寄存器,但是我不确定。
LLVM位代码更接近于机器级代码,但不受特定体系结构的约束。例如,我认为LLVM位代码可以利用任意数量的逻辑寄存器。也许更熟悉LLVM的人可以在这里说出来?
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的最重要方法。