7

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

我想到的最佳选择是:编译为 JVM 字节码并使用 OpenJDK 作为运行时环境,编译为 .NET 字节码并使用 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 以及用于麦克斯)。请记住,我只需要 LLVM 的一个最小子集,这样这个子集就可以通过使用“lli”来充当 VM。这里真正的问题是如何将 LLVM 用作典型的虚拟机。

4

1 回答 1

6

首先,我认为所有 3 个选项 - LLVM IR + LLVM、Java Bytecode + OpenJDK 和 .NET CIL + Mono - 都是极好的选择,我同意在它们之间做出决定并不容易。

如果您选择 LLVM 并且只想使用lli,则可以将 LLVM 编译到目标平台并将生成的lli可执行文件与您的发行版一起打包,它应该可以工作。

通过 LLVM 编写 JIT 编译器的另一种方法是使用执行引擎 -请参阅 Kaleidoscope 教程中的方便示例。这意味着您编写自己的程序,该程序将 JIT 编译您自己的语言,将其编译到您想要的任何平台,同时将其与 LLVM 静态链接,然后分发它。

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

于 2013-05-05T07:40:41.493 回答