许多动态语言实现(或想要实现)JIT编译器,以加快执行时间。不可避免地,来自花生画廊的人问他们为什么不使用LLVM。答案通常是,“LLVM不适合构建JIT。” (例如,Armin Rigo的评论here.)
为什么LLVM不适合构建JIT?
注意:我知道LLVM有自己的JIT。如果LLVM曾经不适合,但现在适合,请说明改变了什么。我不是在讨论在LLVM JIT上运行LLVM字节码,我在谈论使用LLVM库来实现动态语言的JIT。
答案 0 :(得分:47)
为什么LLVM不适合构建JIT?
我写了HLVM,这是一个高级虚拟机,具有丰富的静态类型系统,包括值类型,尾调用消除,通用打印,C FFI和POSIX线程,支持静态和JIT编译。特别是,HLVM为高级VM提供incredible performance。我甚至使用JIT编译器实现了一个类似ML的交互式前端,其中包含变量类型和模式匹配,如computer algebra demonstration所示。我所有与HLVM相关的工作总共工作了几周(而且我不是计算机科学家,只是一个讨厌的人)。
我认为结果不言自明,并且明确证明LLVM 完全适合于JIT编译。
答案 1 :(得分:27)
Unladen Swallow验尸博客文章中有关于LLVM的一些注意事项: http://qinsb.blogspot.com/2011/03/unladen-swallow-retrospective.html。
不幸的是,处于当前状态的LLVM实际上被设计为静态编译器优化器和后端。 LLVM代码生成和优化很好但很昂贵。优化都旨在处理由静态类C语言生成的IR。优化Python的大多数重要优化都需要有关程序在以前的迭代中如何执行的高级知识,而LLVM并没有帮助我们做到这一点。
答案 2 :(得分:12)
有一个presentation使用LLVM作为JIT备份,其中解决了许多问题,为什么它的坏,大多数似乎归结为人们构建静态编译器作为JIT而不是建立一个真正的JIT。
答案 3 :(得分:10)
更新:截至2014年7月,LLVM添加了一个名为“补丁点”的功能,用于支持Safari's FTL JavaScript JIT.中的多态内联缓存。这完全涵盖了抱怨int Armin Rigo的评论原来的问题。
答案 4 :(得分:9)
启动需要很长时间才是最大的抱怨 - 但是,如果您执行Java所做的事情并以解释器模式启动,并使用LLVM编译最常用的部分,那么这不是一个问题。程序
虽然有这样的论点散布在互联网上,Mono已经成功地使用LLVM作为JIT编译器一段时间了(尽管值得注意的是它默认为自己更快但效率更低的后端,他们还修改了LLVM的部分内容。
对于动态语言,LLVM可能不是正确的工具,仅仅因为它是为优化C和C ++等系统编程语言而设计的,这些语言是强/静态类型并支持非常低级的功能。通常,在C上执行的优化并不能真正使动态语言变得快速,因为您只是创建了一种运行慢速系统的有效方法。现代动态语言JIT执行的操作如内联仅在运行时已知的函数,或基于变量在大多数情况下具有的类型进行优化,而LLVM不是为此而设计的。
答案 5 :(得分:4)
有关LLVM IR的更详细说明,请参阅此处:LLVM IR is a compiler IR。