Eclipse OMR - JitBuilder Demo1(Simple续)

在 《Eclipse OMR - JitBuilder Demo1(Simple)》中我们了解了一个简单的JIT功能是如何实现的。

这个Simple例子里面,动态实现了一个函数increment,并在内存中把它编译成了机器码。

既然编译后的机器码是在内存中的,可不可以把它保存到本地文件从而形成obj文件呢?当然是可以的了,今天我们就来看看是如何实现的。

先看Makefile里面的内容

https:/github.com/eclipse/omr/blob/380ed9131a4251d283962d296907614bf5be65ce/jitbuilder/release/Makefile#L306-L307

increment.o : simple
	TR_Options='enableObjectFileGeneration,objectFile=increment.o' ./simple

定义了TR_Options,在TR_Options指定了obj文件的名称为increment.o,然后在运行simple。

当你运行完simple,就会发现生成了increment.o文件。那么怎么使用这个obj文件呢?

还是先看代码

https://github.com/eclipse/omr/blob/380ed9131a4251d283962d296907614bf5be65ce/jitbuilder/release/src/UseIncrement.c#L25

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

猜你喜欢

转载自my.oschina.net/u/134395/blog/1582020
今日推荐