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

问题描述 投票:72回答:4

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

-编辑,“它们是什么”,我是指LLVM和Java(字节码)之间的区别,而不是LLVM和Java。

java comparison jvm llvm
4个回答
86
投票

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

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

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

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


28
投票

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

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

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


0
投票

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
投票
Java是一种编程语言,它使用JVM作为“及时”(JIT)执行的手段,而LLVM是旨在开发新语言和现有语言前端的编译器构造工具。 LLVM

does具有JIT引擎,但是如果您不需要它,则不需要使用它。您可以丢弃LLVM汇编程序,字节码或特定于平台的汇编程序,而不使用JIT执行。

© www.soinside.com 2019 - 2024. All rights reserved.