对于自定义字节码VM,使用LLVM/CLANG的程序大小是多少?

soz*_*oze 5 compiler-construction bytecode llvm clang vm-implementation

我正在评估自定义VM的不同可能性,而我从另一个问题中遗漏了LLVM.由于我还在研究嵌入式语言VM的评估,我现在无法自己测试/检查.我想知道有关LLVM/CLANG的以下信息:

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

我知道clamav防病毒实例使用LLVM/clang支持的字节码来支持动态/运行时签名.但是,我不知道是否存在实现此功能和/或教程或文档的现有工具,它们将指导您完成实现此类操作的过程.

谢谢!:)

小智 5

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

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

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

Windows得到了很好的支持,你可以使用我们的CMake构建系统或mingw32构建带有MSVC++的LLVM.Solaris支持更加不确定,我们会定期使用补丁来修复它,但我暂时还没有看到任何补丁.

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