# 2016q3 Homework5 (jit-compiler) contributed by <`HaoTse`>, <`shelly4123`> --- ## 作業要求 - 提出改善內建 benchmark suite 效能的機制,並且要能夠充分解釋行為,需要一併透過 gnuplot 自動產生效能分析圖表 - 參考以下實做,對 Brainfuck 程式語言進行擴充,使其能夠支援 concurrency / parallelism。需要有程式語言的規格描述並且驗證。 - [ ] [Bukkake](https://bitbucket.org/wjmelements/bukkake): A parallel brainfuck JIT in C - [ ] [Brainfuck Process Extensions](http://www.kjkoster.org/BFPX/Brainfuck_Process_Extensions.html) - [ ] [Parallel Brainfuck](https://github.com/cmdli/parallel-brainfuck) - [ ] [Concurrent Brainfuck](http://www.schabi.de/cbf/) --- ## Brainfuck 程式語言 Brainfuck 程式語言只有八個運算字元,但不論基本數學運算,或是迴圈等等他都能勝任,以下是此語言的運算符號及意義。 ![](https://hackpad-attachments.s3.amazonaws.com/mimihalo.hackpad.com_fF2g9dyypfz_p.478178_1445700611617_undefined) 在 [brainfuck optimization strategies](http://calmerthanyouare.org/2015/01/07/optimizing-brainfuck.html) 提到以下最佳化策略: * Contraction * Clear loops * Copy loops * Multiplication loops * Operation offsets * Scan loops --- ## 程式執行 按照 `README` 指示,安裝以下套件 ```shell sudo apt-get update sudo apt-get install build-essential sudo apt-get install gcc-5-multilib sudo apt-get install lua5.2 lua-bitop sudo apt-get install gcc-arm-linux-gnueabihf sudo apt-get install qemu-user ``` 執行結果 ```shell $ make $ ./interpreter progs/hello.b Hello World! ``` 未優化效能 ```shell $ make bench-jit-x64 Executing Brainf*ck benchmark suite. Be patient. progs/awib.b GOOD 101.7ms progs/mandelbrot.b GOOD 4257.1ms progs/hanoi.b GOOD 10897.8ms make bench-jit-x64 15.27s user 0.00s system 98% cpu 15.464 total ``` - `hello.b` 程式碼解釋 執行結果會印出 Hello World! 以印出 `Hello` 為例: - 假設有無限多個array,都初始化成0。 - 從 ASCII 來看 H = 72、e = 101、l = 108、o = 111。 - code 是從一個 array[0] 開始,最前面的 10 個 `+` 就是將 array[0] 的值加了 10。 - 到了 `[` 判斷 array[0] 是否為 0,否所以繼續執行 `[` 之後的東西。 - 進到回圈將目前位置移到 array[1] 並將他加了 7,再將 array[2] 加 10,array[3] 加 3,array[4] 加 1。 - 接著 4 個 < 和 1 個 `-` 表示將目前位置移回 array[0] 並減 1。 - 也就是說 `[]` 裡的動作會重複 10 遍(直到 array[0] 的值等於0為止),執行完後 array[0] = 0、array[1] = 70、array[2] = 100、array[3] = 30、array[4] = 10。 - 接著將 array[1] 加 2 並印出來 (72)、array[2] 加 1 並印出來 (101)、array[2] 再加 7 印出來 2 次 (108)、array[2] 再加 3 再印出來 (111)。 ``` ++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.> ``` 翻譯為對應的 c code 如下 ```clike= array[5] = {0}; array[0] = 10; do { array[1] += 7; array[2] += 10; array[3] += 3; array[4] += 1; } while(array[0]--); //array[1] = 70, array[2] = 100, array[3] = 30, array[4] = 10 array[1] += 2; //print("H"); array[2] += 1; //print("e"); array[2] += 7; //print("l"); //print("l"); array[2] += 3; //print("o"); ``` --- ## 參考資料 ###### tags: `HaoTse` `shelly4123` `team11` `sysprog21` `jit-compiler`