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

标签 llvm multiplatform llvm-ir vm-implementation platform-agnostic

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

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

正如您所想象的那样,我选择了 LLVM。为什么?因为它的速度很快。我使用 C++ N-Body 代码做了一些基准测试,并在我的机器上使用 lli jitted IR 实现了 7s,而使用 clang native 编译代码实现了 27s(我知道 clang 首先生成 IR 然后是机器代码)。

所以,这是我的问题:是否有任何可以使用的 LLVM 基本工具集(我只需要 lli)的可再发行版本?还是我必须自己编译?如果是后者,您能否向我提供有关如何操作的任何提示?如果我真的必须这样做,我想是从我的机器(Intel Mac)交叉编译它们,并生成一些安装程序(例如,Windows 的 .msi、流行的 linux 发行版的 .rpm 和 .deb 以及流行的 linux 发行版的 .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 - 使用LLVM作为虚拟机——多平台和多架构编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16348620/

相关文章:

llvm-ir - 如何判断LLVM IR中的指令是否为调用指令?

c++ - LLVM 用函数替换操作数

c++ - 如何在 LLVM pass 中添加一行新代码?

构建 iOS 应用程序时,Kotlin/Native compileKotlinIosX64 任务失败

c - 自进程开始以来耗时

c++ - 多平台包括最佳实践 (qt)

llvm - 编译时常量转换为 LLVM 内在

llvm - 如何修复 "warning: overriding the module target triple with x86_64-pc-linux-gnu [-Woverride-module]"

c++ - LLVM Clang 在 OS X 上产生极慢的输入/输出

c++ - LLVM:如何将 IR 写入文件并运行它?