使用LLVM作为虚拟机 – 多平台和多体系结构编码

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

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

正如您可能想象的那样,我选择了LLVM.为什么?因为它的速度非常快.我使用C N-Body代码进行了一些基准测试,并在我的机器上使用lli jitted IR实现了7s,而使用了clang本地编译代码的27s(我知道clang首先使IR然后是机器代码).

所以,这是我的问题:我可以使用LLVM基本工具集(我只需要lli)的任何可再发行版本吗?或者我必须自己编译?如果是后者,你能否提供一些关于如何做的提示?如果我真的必须这样做,我想是从我的机器(英特尔Mac)交叉编译它们,并生成一些安装程序(例如,Windows的.msi,流行的Linux发行版的.rpm和.deb以及.pkg Mac电脑).请记住,我只需要LLVM的最小子集,这样通过使用“lli”,该子集就能够像VM一样工作.这里真正的问题是如何将LLVM用作典型的虚拟机.

最佳答案
首先,我认为所有3个选项 – LLVM IR LLVM,Java Bytecode OpenJDK和.NET CIL Mono – 都是很好的选择,我同意在它们之间做出决定并不容易.

如果您使用LLVM并且只想使用lli,则可以将LLVM编译到目标平台并将生成的lli可执行文件打包到您的发行版中,它应该可以正常工作.

通过LLVM编写JIT编译器的另一种方法是使用执行引擎–see the handy examples in the Kaleidoscope tutorial.这意味着你编写自己的程序,它将JIT编译你自己的语言,将它编译到你想要的任何平台,同时静态链接它与LLVM,以及然后分发它.

在任何情况下,由于JIT编译器需要将LLVM二进制文件复制到客户端,因此请确保在您的发行版中附加版权声明(但您不必开源您的发行版).

转载注明原文:使用LLVM作为虚拟机 – 多平台和多体系结构编码 - 代码日志