假设我有一个软件,我想制作跨平台插件。您编译虚拟机的插件,运行我的软件的任何平台都可以运行此代码。
我想知道是否有可能为此目的使用LLVM解释器和字节码。另外,我想知道使用LLVM是否有意义而不是其他东西,即LLVM是为什么制作的?
答案 0 :(得分:7)
我不确定LLVM是否为设计。但是,我怀疑使用LLVM 1
还没有做任何事情为作业专门创建的其他基于虚拟机的脚本引擎 :
如果您正在寻找可嵌入的虚拟机:
<子> 1 包括将c ++信息编译为javascript以在浏览器中运行... 子>
答案 1 :(得分:5)
理论上,存在一个有限的LLVM IR子集,可以在各种平台上移植。你不应该指定对齐,你不应该指向整数类型的指针,你必须避免内在,等等。这意味着 - 你不能立即使用股票C编译器生成的代码(llvm-gcc,Clang,等等),除非您为其指定一个有限的目标并实现清理LLVM传递。另一个问题是不保证来自不同LLVM版本的bitcode格式兼容。
在实践中,我不会去那里。 Mono是一个相当小巧,可嵌入,快速的虚拟机,所有.NET工具堆都可用。 VM本身非常低级(只要您不关心可验证性)。
答案 2 :(得分:5)
VMIR(https://github.com/andoma/vmir)是一个LLVM bitcode解释器/ JIT引擎,旨在嵌入到其他应用程序中。
免责声明:我是它的作者,它仍然在进行中,但工作得很合理。
答案 3 :(得分:2)
LLVM包含interpreter,因此如果您可以为目标平台构建此解释器,则可以动态评估LLVM bitcode。
但显然不是那么快。
答案 4 :(得分:0)
在他们的classic discussion(你不想错过,如果你是开源,LLVM,编译器的粉丝)关于LLVM与libJIT,这已经发生在LLVM成名并建立之前很久,作者libjIT Rhys Weatherley提出了这个特殊问题,他说LLVM不适合嵌入,而LLVM的作者Chris Lattner说,否则,它是模块化的,你可以以任何可能的方式使用它,包括只嵌入你的部分需要。