orl*_*rlp 13 c++ jit brainfuck
我写了一个像这样工作的Brainfuck实现(C++):
这是非常快的,但现在瓶颈在于VM.它是用C++编写的,并且读取一个令牌,执行一个动作(如果你知道Brainfuck就不会有很多动作)等等.
我想要做的是剥离VM并动态生成本机机器代码(基本上是一个JIT编译器).这可以很容易地加速20倍.
这意味着步骤3将被JIT编译器替换,步骤4将被执行生成的机器代码.
我不知道从哪里开始,所以我有几个问题:
osg*_*sgx 16
生成的机器代码只是jmp-ed或call-ed像往常一样的功能.有时它还需要在内存上禁用无执行标志(NX位),包含生成的代码.在linux中,这是通过mprotect(addr, size, PROT_READ | PROT_WRITE | PROT_EXEC.)In Windows 完成的,NX称为DEP.
有一些......例如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