使用LLVM作为虚拟机——多平台和多架构编码。

7

我目前正在使用一种宠物编程语言(用于学习目的),并经过了过去一年的大量研究,我认为现在是时候开始对这种语言的概念进行建模了。首先,我希望它能够编译成某些中间形式,例如JVM或.NET bytecode,目标是多平台/架构兼容性。其次,我希望它运行速度快(我还有许多其他想法,但本主题不讨论这些)。

我想到的最佳选择是: 编译成JVM bytecode,并使用OpenJDK作为运行时环境, 编译成.NET bytecode,并使用Mono作为运行时环境, 编译成LLVM IR,并使用LLVM作为运行时环境。

正如您所想象的那样,我选择了LLVM。为什么?因为它非常快。我使用C++ N-Body代码进行了小型基准测试,在我的机器上使用lli jitted IR实现了7秒的运行时间,而使用clang本机编译代码则需要27秒(我知道clang首先生成IR然后再生成机器代码)。

所以,我的问题是:是否有LLVM基本工具集的可重新分发版本(我只需要lli)可以使用?还是我必须自己编译?如果是后者,您能否提供任何关于如何执行此操作的提示?如果我真的必须这样做,我正在考虑从我的机器(Intel Mac)交叉编译它们,并生成一些安装程序(例如,Windows的.msi,流行的Linux发行版的.rpm和.deb以及Mac的.pkg)。请记住,我只需要LLVM的最小子集,使得该子集能够像使用“lli”一样充当虚拟机。真正的问题在于如何将LLVM用作典型的虚拟机。


LLVM项目采用宽松的许可证,听起来你只需要分发核心库。 - Robert Harvey
@RobertHarvey 这正是我所想的,但我不知道从哪里开始。 - Salvia
毫无疑问,你肯定需要阅读文档,而且既然你已经做出了决定...我自己对与LLVM一起工作感到兴奋;可惜,我还没有阅读文档。 - Robert Harvey
当然,文档可能是一个很好的起点,我会去查一下。顺便说一句,现在还来得及进行设计决策的更改,比如虚拟机/运行时,如果你有比我指出的更好的选择,请随意提出建议。 - Salvia
1个回答

6
首先,我认为LLVM IR + LLVM、Java Bytecode + OpenJDK和.NET CIL + Mono这三个选项都是很好的选择,我同意在它们之间做出决定并不容易。
如果您选择使用LLVM,只想使用lli,则可以将LLVM编译到目标平台并将生成的lli可执行文件打包到您的发行版中,应该可以工作。
通过LLVM编写JIT编译器的另一种方法是使用执行引擎 - 请参见Kaleidoscope教程中的便捷示例。这意味着您编写自己的程序,将JIT编译您自己的语言,将其编译为您想要的任何平台,并将其与LLVM静态链接,然后进行分发。
无论如何,由于JIT编译器需要将LLVM二进制文件复制到客户端,因此请确保在您的发行版中附加版权声明(但您无需开源您的发行版)。

谢谢,你提供的文章非常有帮助,我可能会以此作为起点。 - Salvia
链接已损坏。 - rraallvv

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接