Brainfuck interpreter and jit-compiler in Java

同事之前介紹我一個奇怪的語言,叫做 brainfuck (名字不是很雅,不知道是不是暗示寫程式寫到頭腦發狂...),以下簡稱 bf,說要用 c 語言實做它的 compiler,我聽了覺得有趣,心想反正之前也沒有寫過 compiler,不如就拿這個語言當練習寫個 Java 版的 compiler 吧!

於是就有了這個 project - bfj ,一開始先實做 interpreter,做了些許的 optimization,大約快十倍,後來加入 just-in-time compiler,大約快 5 ~ 10 倍。

在 jit 模式下執行,程式會先把 bf 的 source code 讀進來轉成 IR,做該有的優化,之後轉成 Java bytecode 再 load 進來,然後 JVM 會再跟據 bytecode 執行的狀況把重複執行的部份轉成 native code 來執行。

雖然執行的方式有點迂迴,其他的語言我不敢說,不過在Java上目前我還沒看到更快的實做。

補充一下,動態產生 Java bytecode 的部份用到了之前提過的 ASM,dynamic codegen 的技巧在系統需要提供動態行為但是又不想失去效能的情況下常被用到,比方說 spring 跟 hibernate 這兩個 framwork 都需要動態建立許多 proxy ,這個時候就會用這種技巧來產生取代由 reflection 達成的功能以加快速度。hibernate 跟 spring 用的是 cglib,而 cglib 底層也是用了 ASM。

這裡有篇文章比較了 reflection 跟 codegen 速度上的分別。

另外還有個叫 JPC 的 project 是用 Java 寫了一個 x86 PC 模擬器,也是用這種方法實做出來的,目前的速度可以玩一些以前的 PC Game,蠻屌的,我個人覺得啦。

留言

Unknown寫道…
Jserv 大大給我過一個 BF 的 complier
是用 sed 把所有的 pointer 代換成 shellcode...

只有鬼斧神工可以形容呀

這個網誌中的熱門文章

Chrome 小字典

How to avoid OOM on Android