2011-05-13 128 views
13

我写了一个Brainfuck实现(C++),其工作原理是这样:使JIT编译器

  1. 读取输入brainfuck文件
  2. 做琐碎的优化
  3. 转换brainfuck成机器代码的VM
  4. 在VM中执行此机器代码

这很快,但瓶颈现在在虚拟机上。它是用C++编写的,读取一个令牌,执行一个动作(如果你知道Brainfuck,这个动作根本不是很多)等等。

我想要做的是剥离虚拟机并生成本地机器代码(基本上,JIT编译器)。这很容易成为20倍的加速。

这意味着步骤3被JIT编译器替换,步骤4替换执行生成的机器代码。

我真的不知道从哪里开始,所以我有几个问题:

  1. 这是如何工作,如何生成的机器代码得到执行?
  2. 是否有任何C++库用于生成本机机器码?

回答

15
  1. 生成的机器代码只是jmp -ed或call -ed照常功能。有时还需要禁用内存上的不执行标志(NX位),其中包含生成的代码。在linux中,这是通过mprotect(addr, size, PROT_READ | PROT_WRITE | PROT_EXEC.)完成的。在Windows中,NX被称为DEP。

  2. 有一些......例如, http://www.gnu.org/software/lightning/ - GNU Lightning(通用)和https://developer.mozilla.org/En/Nanojit - Nanojit,用于Firefox JavaScript JIT引擎。更强大和更现代的JIT是LLVM,您只需将BF代码转换为LLVM IR,然后LLVM就可以为许多平台执行优化和代码生成,或者在具有JIT功能的解释器(虚拟机)上运行LLVM IR。有一个关于BF后& LLVM完全LLVM JIT编译器BF http://www.remcobloemen.nl/2010/02/brainfuck-using-llvm/

另一个BF + LLVM编译器是在这里,在LLVM的SVN:https://llvm.org/svn/llvm-project/llvm/trunk/examples/BrainF/BrainF.cpp

+1

+1并且被接受为唯一解释机器代码如何被调用的人。 – orlp 2011-05-16 22:15:33

3

GNU Lightning是一组宏,可以为几种不同的体系结构生成本机代码。您需要对汇编代码有深入的了解,因为您的第3步将涉及使用Lightning宏将机器代码直接发送到稍后执行的缓冲区中。

5

LLVM是一个完整的C++库(或一套库),用于从中间形式生成本地代码,包含文档和示例,并且已用于生成JITters。

(它也有一个使用框架的C/C++编译器 - 但是框架本身可以用于其他语言)。

4

下面是使用新的gcc-JIT一个例子: JIT-compilation using GCC 5

它甚至优化INCS到常数。

+1

嗯,看起来像没有人感兴趣:-( – xophos 2015-12-18 09:58:29

+2

我感兴趣:-) – mahdix 2016-02-10 21:58:42