LLVM平台,短短几年间,改变了众多编程语言的走向,也催生了一大批具有特色的编程语言的出现,不愧为编译器架构的王者,也荣获2012年ACM软件系统奖 —— 题记
版权声明:本文为 西风逍遥游 原创文章,转载请注明出处 西风世界 http://blog.csdn.net/xfxyy_sxfancy
使用JIT引擎
LLVM从设计之初就考虑了解释执行的功能,这非常其作为一款跨平台的中间字节码来使用,可以方便地跨平台运行。又具有编译型语言的优势,非常的方便。
我们使用的LLVM3.6版,移除了原版JIT,改换成了新版的MCJIT,性格有了不小的提升,本文就MCJIT的使用和注意事项,进行简要的介绍。
JIT技术
Just-In-Time Compiler,是一种动态编译中间代码的方式,根据需要,在程序中编译并执行生成的机器码,能够大幅提升动态语言的执行速度。
像Java语言,.net平台,luajit等,广泛使用jit技术,使得程序达到了非常高的执行效率,逐渐接近原生机器语言代码的性能了。
JIT引擎的工作原理并没有那么复杂,本质上是将原来编译器要生成机器码的部分要直接写入到当前的内存中,然后通过函数指针的转换,找到对应的机器码并进行执行。
但实践中往往需要处理许多头疼的问题,例如内存的管理,符号的重定向,处理外部符号,相当于要处理编译器后端的诸多复杂的事情,真正要设计一款能用的JIT引擎还是非常困难的。
使用LLVM的MCJIT能开发什么
当然基本的功能是提供一款解释器的底层工具,将LLVM字节码解释执行,具体能够做的事,例如可以制作一款跨平台的C++插件系统,使用clang将C/C++代码一次编译到.bc
字节码,然后在各个平台上解释运行。也可以制作一款云调试系统,联网远程向系统注册方法,获取C++客户端的debug信息等等。当然,还有很多其他的用法等着大家来开发。
使用MCJIT做一款解释器
制作LLVM字节码的解释器还是非常简单的,最棒的示例应该是LLVM源码中的工具:lli
一共700行左右的C++代码,调用LLVM工具集实现了LLVM字节码JIT引擎,如果想很好的学习llvm中的解释器和JIT,可以参考其在github上的源码。
初始化系统
使用LLVM的JIT功能,需要调用几条初始化语句,可以放在main函数开始时。
InitializeNativeTarget();
InitializeNativeTargetAsmPrinter();
InitializeNativeTargetAsmParser();
这几句调用,主要是在处理JIT的TargetMachine,初始化机器相关编译目标。
引用相关的头文件
这里的稍稍有点多余的,不去管了。,llvm的头文件是层次组织的,像执行引擎,都在llvm/ExecutionEngine/
下,而IR相关的,也都在llvm/IR/
下,初用LLVM往往搞不清需要哪些,这时就需要多查相关的文档,了解LLVM的各个模块的功能。
#include "llvm/ExecutionEngine/GenericValue.h"
#include "l