5

我正在评估自定义 VM 的不同可能性,并在另一个问题中省略了 LLVM。由于我仍在评估嵌入式语言 VM,因此我现在无法自己测试/检查。我想知道有关 LLVM/CLANG 的以下信息:

  • 它在 Windows 上是否得到很好的支持?还是索拉里斯?(跨平台对我来说是一个加分项)
  • 如果我想用类 C 语言编写自己的/自定义 VM,我需要在项目中包含什么?(LLVM/CLANG 部分或组件等)
  • 出于显而易见的原因(不编写解释器),我会将编译器与 VM 分开。所需组件的大小是多少?我可以在程序中构建它们而不是动态链接到它们吗?
  • 我可以避免 JIT 吗?我想要一个字节码虚拟机,它不一定会转换为本机代码。这在平台不支持 JIT 时会有所帮助(例如,具有限制内存权限且不允许 wx/rwx 内存映射的系统)。

例如,我知道 clamav 防病毒软件使用由 LLVM/clang 支持的字节码来支持动态/运行时签名。但是,我不知道是否有现成的工具来实现这个和/或指导您完成实现这样一个事情的过程的教程或文档。

谢谢!:)

4

1 回答 1

5

Clang 是类 C 语言的解析器,包括 C++。如果您的语言足够类似于 C(即 Java 不是),那么您可以将对您的语言的支持添加到 clang,它知道如何生成 LLVM IR。

LLVM 不需要 JIT,通常是静态链接的。LLVM 提供了执行 LLVM IR 优化和代码生成的库。JIT 只是将代码生成到内存而不是磁盘上。Clang+LLVM 的普通用法是作为 GCC 的替代品,生成 .o 文件的代码。

它有多大取决于你需要什么。你想要所有的优化吗?您是否想要所有目标(与 GCC 不同,LLVM 可以在一个二进制文件中构建任意数量的后端)。既然你提到嵌入式,一个例子是 Android 在手机上使用 LLVM:http ://android-developers.blogspot.com/2011/02/introducing-renderscript.html

Windows 得到很好的支持,您可以使用我们的 CMake 构建系统或 mingw32 使用 MSVC++ 构建 LLVM。Solaris 支持更不确定,我们经常使用补丁来修复它,但我已经有一段时间没有看到任何补丁了。

最后,您可能想阅读http://llvm.org/docs/tutorial上的教程。这记录了 JITted REPL 语言的构造,但静态编译语言的基础是相同的。您无需使用 llvm::JIT 对象,而是调用 Target.addPassesToEmitFile 并将其交给要写入的输出流。请参阅 llvm/tools/llc/llc.cpp 以获得完整的示例(它很长;如果您不想支持 llc 所做的所有选项,则只需要其中的一小部分)。

于 2011-05-13T07:55:32.453 回答