想編寫一個虎書中的編譯器,該如何上手?
書里(java版)提供了代碼的框架,然而現在仍然不知道該如何上手。
開發平台是linux嗎?是不是安裝完相關軟體,直接在框架里填充就可以了?
先肯定一下題主讀了書之後想確實實現出書上的知識點,鞏固學習成果的做法 ^_^
虎書光粗略讀一遍根本領略不到其中的內容,一定要動手實現才行。
想來題主問的這個問題是許多想動手實踐虎書練習的人共通的…我一開始也困惑了一會兒。其實這裡有三個問題:- 虎書配套代碼的編譯器自身可以在什麼平台上運行?
- 配套代碼的編譯器將Tiger源碼編譯成目標代碼之後,目標代碼可以在什麼平台上運行?
- 「相關軟體」是啥?
針對第一個問題:
這隻涉及編譯器自身。題主讀的是Java版的虎書。書所附帶的框架代碼的編譯器部分全是純Java的,很自然的可以在任意能運行Java的平台上運行。Windows,Linux,Mac或任意能跑Java的*-nix都行。
針對第二個問題:
這涉及讀者自己實現哪個平台的目標代碼生成,以及框架代碼中的運行時部分。
配套代碼的運行時部分是一個runtime.c——它可能有平台相關的問題,不過它基本上是用標準C寫的所以也還好。讀者自己實現好目標代碼生成之後,要自己做幾個額外步驟產生一個完整的可執行文件:
- 用基於配套框架代碼實現Tiger編譯器,將Tiger源碼編譯到目標代碼;
- 這裡既可以在編譯器里只生成到彙編然後用一個外部的彙編器將其進一步轉換為目標代碼,也可以在編譯器內直接生成目標代碼;
- 用一個標準C編譯器將配套框架代碼的runtime.c編譯為目標代碼;
- 用一個鏈接器將Tiger目標代碼與runtime目標代碼鏈接成一個完整的可執行文件。
虎書標配的目標平台是MIPS(其它RISC也行但作者對MIPS情有獨鍾),並且推薦使用SPIM模擬器來執行生成的MIPS代碼。SPIM模擬器可以在Windows及各種*-nix上運行——這可能是題主最關心的地方。SPIM模擬器的老官網頁面在此:SPIM MIPS Simulator
這在虎書的官網有具體說明:Using SPIM with Modern Compiler Implementation。其中非常重點的地方是:A normal Tiger compiler takes a file myprog.tig and produces a file myprog.s, which is then assembled and linked with a runtime.o object file derived from a runtime.c.
這裡說的就是前面提到的額外步驟。然而讀者要將runtime.c編譯為MIPS目標代碼或許有點麻煩,所以作者提供了一個事先編譯好的runtime.s,方便讀者使用SPIM模擬器。
使用方法是:Instead of link-loading, it is necessary to concatenate the Tiger-compiler output file myprog.s with runtime.s (either one can go first) and load the combined file into the SPIM simulator.
將Tiger目標代碼與上述runtime.s文本合併為一個新的.s文件,然後用SPIM模擬器載入執行該文件。
針對第三個問題:
其實解決了前倆問題,剩下的就很明顯了。所謂「相關軟體」就是:
- 一個Java Development Kit(JDK):Oracle Technology Network for Java Developers
- SPIM模擬器:SPIM MIPS Simulator(舊官網) 或 spim mips simulator(新官網)
- 虎書配套代碼:Tiger Compiler Modules for Programming Exercises
接下來題主就只需要按照框架填充代碼就行了。遇到啥具體問題再來提問吧 ^_^
前端代碼如果不想用書中所推薦的JLex與CUP的話手寫完全沒問題的。順帶一提,斯坦福大學的CS143編譯原理入門課的課程作業使用SPIM的方式跟虎書是一模一樣的。關於這個課程可以參考我另一個回答:斯坦福大學編譯原理課程質量怎麼樣? - RednaxelaFX 的回答
P.S. 為啥此類問題的題主那麼多匿名的…不方便交友啊 &>_&<編譯原理 - 網易雲課堂這門課就是按照虎書擼編譯器
有其它版本啊,C語言的也有,實在不行換本書啊...你先把書看懂,仔細看,看的過程就知道怎麼上手,從你的問題來推測,估計你連書都沒怎麼翻,就想馬上靠魔法出來一個編譯器爽爽,刷刷成就感。
推薦閱讀:
※如何學習JIT,能提供一些系統全面的路線和材料嗎?
※早就聽聞編譯原理很難,而且很重要,寫一個編譯器算是合格,快放假了,寒假大概40天左右,能學個什麼程度?
※如何寫一個簡單的編譯器?