1. 程式人生 > >從頭實現一個編譯器(基於COOL語言)

從頭實現一個編譯器(基於COOL語言)

前言

以下很多網站可能需要翻牆。

最近學校開了編譯原理的課程,為了更好的理解,我在網上找到了一門由Alex Aiken大師開設的一門Compilers的課程,有視訊,PPT,關鍵是還有程式碼實踐,也希望自己可以堅持做下去。

大概講一下,COOL這門語言的全名叫classroom object oriented language,是由斯坦福大學設計的一門用於他們教學活動的簡易版面向物件語言。詳情可參閱《COOL手冊》

很多外國大學的課都是預設大家用的Linux系統或者MacOS的,我之前在Windows上也試過去編譯、執行這些,真的很麻煩。。。而且,COOL編譯會生產一個基於MIPS架構的彙編程式。於是我裝上了Ubuntu 18.04 ,因為我Linux玩的比較菜,裝東西亂七八糟的折騰了好久。。。廢話不多說,我遇到的一些關鍵性問題,都會記錄下來的。

哦,對了,課程主頁在這==> 請點選我

開始

因為這個課開的時間好像還是2012年那會,好多資料都沒有了,連coursera上的課程都下架了,我找了好久,終於找到了一個github上的倉庫,裡面包含了課程中需要的東西==> 這是倉庫地址

課程第二章

  • 彙編程式叫coolc 它可以將.cl檔案(也就是cool語言的源程式)轉成彙編源程式。
  • 執行彙編的程式叫spim(MIPS反過來,也是很明顯了,哈哈) 它可以將.s檔案(也就是彙編源程式)執行。
  • 上面兩步可以直接執行 $ cool hello_world.cl,這樣也是可以的。

假如你直接在命令列輸入 $ cool hello_world.cl

,那肯定會報錯,告訴你找不到該命令,對呀,環境變數都還沒配置,關於這個我就不多說了,隨便baidu一下。

!!!敲重點!!!

配置好環境變數後,每次你開啟一個terminal,你就需要執行source /etc/profile(如果你只是在當前使用者配置的環境變數,就是~/.profile了)

hello world程式

class Main inherits IO {
   main(): SELF_TYPE {
	out_string("Hello, World.\n")
   };
};
  1. 轉到倉庫的bin目錄下,執行
$:~/cool-compiler-master/bin$ source /etc/profile

$ cool hello_world.cl`

這時就出現了hello_world.s檔案 在這裡插入圖片描述

  1. 執行 $ spim hello_world.s

問題出現了 在這裡插入圖片描述

這個解決辦法來自==> 解決辦法參考

trap.handler的問題也是很糟糕的,這是因為斯坦福的教授們在他們所改寫的spim程式(binary file)中引用了一個絕對路徑。 /usr/class/cs143/cool/lib/trap.handler

我是按照原作者的方法處理的:

#  因為我們的電腦裡可能根本沒這個路徑,於是建立一個
$ sudo mkdir -p /usr/class/cs143/cool/lib/    
$ sudo chown $USER /usr/class/cs143/cool/lib/   
#  連結過去
~/cool-compiler-master/bin$ ln -s /home/andy/cool-compiler-master/lib/trap.handler /usr/class/cs143/cool/lib/trap.handler
另一種辦法

我給的那個倉庫裡面是有一個trap.handler的,我們可以直接把這個貼上到/usr/class/cs143/cool/lib/目錄裡。

在這裡插入圖片描述

執行

在這裡插入圖片描述

終於成功了!!!

plus

如果你對這門課也有興趣,歡迎一起學習啊,我們還可以相互探討。我後續想想方法,把課程視訊給他下載下來。

下次繼續