我不明白LLVM位码和Java字节码之间的区别,它们是什么?-edit-"它们是什么“我指的是LLVM位码和Java字节码之间的区别,而不是LLVM和Java是什么。
mzillmmw1#
假设您指的是JVM而不是Java:LLVM是一个低级的基于寄存器的虚拟机,它被设计用来抽象底层硬件,并在编译器后端(机器码生成)和前端(解析等)之间划出一条清晰的界线。JVM是一个更高层次的基于堆栈的虚拟机。JVM提供垃圾收集,有对象和虚拟方法调用等概念。因此,JVM为语言互操作性提供了更高层次的基础设施(很像微软的CLR)。(It可以在LLVM上构建这些抽象,就像可以在C之上构建它们一样。)
qfe3c7zg2#
很遗憾这个问题一开始就问错了。我是想找一个更详细的比较。JVM字节码和LLVM位码之间最大的区别是JVM指令是面向堆栈的,而LLVM位码不是。这意味着JVM字节码不是将值加载到寄存器中,而是将值加载到堆栈中并从堆栈中计算值。我相信这样做的优点是编译器不必分配寄存器,但我不确定。LLVM位代码更接近于机器级代码,但不受特定架构的限制。例如,我认为LLVM位代码可以使用任意数量的逻辑寄存器。也许更熟悉LLVM的人可以在这里发言。
bxgwgixi3#
JVM字节码和LLVM字节码既有相似之处,也有不同之处。就相似之处而言,这是两种中间程序表示。因此,它们可以表示用不同编程语言编写的程序。例如,有将Java、Closure、Scala等转换为JVM字节码的前端,也有将C、C++、Swift、Julia、Rust等转换为LLVM字节码的前端。也就是说,JVM字节码和LLVM字节码在目的和设计上有很大的不同。历史上,JVM字节码被设计成通过网络(例如Internet)分发,并通过虚拟机在本地计算机中解释。这就是它基于堆栈的原因之一:基于堆栈的字节码通常较小。也许,在它的开始,LLVM字节码也被认为是解释的,但如果它发生了,它的目的已经随着时间的推移而改变。所以,LLVM字节码是一种旨在进行分析和优化的程序表示。它是以静态单赋值格式编码的,这更像是程序的数学抽象,而不是实际的可执行汇编。所以,例如,LLVM IR中有一些类似φ函数的指令,它们在典型的计算机体系结构中没有直接的等价物。2因此,尽管可以解释LLVM字节码(LLVM工具链中有一个名为lli的工具,它可以执行此操作),但这并不是使用LLVM IR的最重要方式。
lymgl2op4#
Java是一种编程语言,它使用JVM作为“准时”(JIT)执行的手段,而LLVM是一个编译器构造工具包,旨在开发新语言和现有语言的前端。LLVM * 确实 * 有一个JIT引擎,但如果你不需要它,就不必使用它。你可以抛弃LLVM汇编程序、字节码或特定于平台的汇编程序,而不是使用JIT执行。
4条答案
按热度按时间mzillmmw1#
假设您指的是JVM而不是Java:
LLVM是一个低级的基于寄存器的虚拟机,它被设计用来抽象底层硬件,并在编译器后端(机器码生成)和前端(解析等)之间划出一条清晰的界线。
JVM是一个更高层次的基于堆栈的虚拟机。JVM提供垃圾收集,有对象和虚拟方法调用等概念。因此,JVM为语言互操作性提供了更高层次的基础设施(很像微软的CLR)。
(It可以在LLVM上构建这些抽象,就像可以在C之上构建它们一样。)
qfe3c7zg2#
很遗憾这个问题一开始就问错了。我是想找一个更详细的比较。
JVM字节码和LLVM位码之间最大的区别是JVM指令是面向堆栈的,而LLVM位码不是。这意味着JVM字节码不是将值加载到寄存器中,而是将值加载到堆栈中并从堆栈中计算值。我相信这样做的优点是编译器不必分配寄存器,但我不确定。
LLVM位代码更接近于机器级代码,但不受特定架构的限制。例如,我认为LLVM位代码可以使用任意数量的逻辑寄存器。也许更熟悉LLVM的人可以在这里发言。
bxgwgixi3#
JVM字节码和LLVM字节码既有相似之处,也有不同之处。就相似之处而言,这是两种中间程序表示。因此,它们可以表示用不同编程语言编写的程序。例如,有将Java、Closure、Scala等转换为JVM字节码的前端,也有将C、C++、Swift、Julia、Rust等转换为LLVM字节码的前端。
也就是说,JVM字节码和LLVM字节码在目的和设计上有很大的不同。历史上,JVM字节码被设计成通过网络(例如Internet)分发,并通过虚拟机在本地计算机中解释。这就是它基于堆栈的原因之一:基于堆栈的字节码通常较小。
也许,在它的开始,LLVM字节码也被认为是解释的,但如果它发生了,它的目的已经随着时间的推移而改变。所以,LLVM字节码是一种旨在进行分析和优化的程序表示。它是以静态单赋值格式编码的,这更像是程序的数学抽象,而不是实际的可执行汇编。所以,例如,LLVM IR中有一些类似φ函数的指令,它们在典型的计算机体系结构中没有直接的等价物。2因此,尽管可以解释LLVM字节码(LLVM工具链中有一个名为lli的工具,它可以执行此操作),但这并不是使用LLVM IR的最重要方式。
lymgl2op4#
Java是一种编程语言,它使用JVM作为“准时”(JIT)执行的手段,而LLVM是一个编译器构造工具包,旨在开发新语言和现有语言的前端。LLVM * 确实 * 有一个JIT引擎,但如果你不需要它,就不必使用它。你可以抛弃LLVM汇编程序、字节码或特定于平台的汇编程序,而不是使用JIT执行。