在 《Eclipse OMR - JitBuilder Demo1(Simple)》中我们了解了一个简单的JIT功能是如何实现的。
这个Simple例子里面,动态实现了一个函数increment,并在内存中把它编译成了机器码。
既然编译后的机器码是在内存中的,可不可以把它保存到本地文件从而形成obj文件呢?当然是可以的了,今天我们就来看看是如何实现的。
先看Makefile里面的内容
increment.o : simple
TR_Options='enableObjectFileGeneration,objectFile=increment.o' ./simple
定义了TR_Options,在TR_Options指定了obj文件的名称为increment.o,然后在运行simple。
当你运行完simple,就会发现生成了increment.o文件。那么怎么使用这个obj文件呢?
还是先看代码
extern int32_t increment(int32_t);
int main(int argc, char *argv[]) {
int32_t v;
v = 0; printf("increment(%d) == %d\n", v, increment(v));
v = 1; printf("increment(%d) == %d\n", v, increment(v));
v = 10; printf("increment(%d) == %d\n", v, increment(v));
v = -15; printf("increment(%d) == %d\n", v, increment(v));
printf("STATIC TEST PASS\n");
return 0;
}
使用C语言的关键字extern定义这个函数即可(当然了在编译的时候,需要链接increment.o这个文件)。
这么折腾一圈有什么意义呢?
只要发挥一点点想象力,就明白了:我们把increment这个函数想象成一个很复杂的功能 - 一个动态语言的JIT,比如是PHP语言的JIT,用上面的套路就可以把PHP代码编译成native exe。
如果学过编译原理,其实这就是AOT。
关于AOT的一个具体例子:Java程序的运行通常需要先安装JRE或者是JDK,以前常会有人想实现这个功能,能不能不安装JRE就能运行Java程序,实现这个功能就需要AOT。
当然了,实现Java的AOT是一个极其复杂的工作,不过现在终于有了:
http://mail.openjdk.java.net/pipermail/hotspot-dev/2016-October/025033.html