2011-05-13 130 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