制作JIT编译器

orl*_*rlp 13 c++ jit brainfuck

我写了一个像这样工作的Brainfuck实现(C++):

  1. 读取输入的brainfuck文件
  2. 做一些微不足道的优化
  3. 将brainfuck转换为VM的机器代码
  4. 在VM中执行此机器代码

这是非常快的,但现在瓶颈在于VM.它是用C++编写的,并且读取一个令牌,执行一个动作(如果你知道Brainfuck就不会有很多动作)等等.

我想要做的是剥离VM并动态生成本机机器代码(基本上是一个JIT编译器).这可以很容易地加速20倍.

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

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

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

osg*_*sgx 16

  1. 生成的机器代码只是jmp-ed或call-ed像往常一样的功能.有时它还需要在内存上禁用无执行标志(NX位),包含生成的代码.在linux中,这是通过mprotect(addr, size, PROT_READ | PROT_WRITE | PROT_EXEC.)In 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


dav*_*mac 6

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

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