- 課程名稱:編譯器設計概論
- 選修年度:111上
- 授課教師:楊武老師
- 開課單位:資訊共同
- 永久課號:CSCS10012
- 學分數:3.00
- 必/選修:選修
對於絕大部分的人來說,編譯器就是一個把程式碼轉為執行檔的黑盒子。哪一個資工系的學生沒有執行過:
gcc -o a.out a.c
./a.out
然而當你將黑盒子打開,你會發現裡面的複雜程度與技術含量大大超乎你的想像!!準確的說,gcc並不只是一個編譯器,而是集合了compiler, linker 和 loader 的 toolchain。這樣系統軟體的發明是決定性的,高階語言的發明絕對是計算機科學進步最大的推手之一。唯有使用高階且抽象的語言人類才有可能構築下至作業系統上至複雜3D遊戲的數位世界。而編譯器就是連連接高階語言與低階機器語言的橋樑。這樣一門藝術卻因為入門門檻很高,而長期不被大眾所了解。其實如今大多數的硬體設計都需要與系統軟體高度配合,編譯器的設計也與微架構設計息息相關,甚至可以說,沒有模仿不來的硬體,只有做不出來的編譯器。失敗案例如PAC VLIW DSP核心的開發案例。
這學期受到疫情影響,老師上課採用實體上課為主,線上上課為輔的形式。特別的是因為課程繁重,又希望期中和期末考週可以保留完整的禮拜給我們寫程式作業和準備考試,因此一個禮拜都需要上四堂課。老師在喬加課時間的方式也很搞笑,拼了老命要調出大家都可以的時間。老師因為年紀較大的緣故(偶爾拄拐杖),講話比較小聲又蠻模糊,認真上課的同學宜坐在前排。老師上課自帶幽默,也喜歡與同學互動。不過到了學期後半段,到教室上課的同學就只剩下小貓兩三隻了。大概是因為上他的課有點難聽懂,作業又很複雜的緣故,賴在宿舍自己讀或寫作業比較有效率。
老師上課使用自製的投影片,教科書為:
C.N. Fischer, R.K. Cytron, and R.J. LeBlanc, Jr., Crafting a Compiler, Addison-Wesley, 2010.
老師說這本書算是編譯器教材裡面比較好上手的。有趣的是這本教科書的第一作者和楊武老師都出自於University of Wisconsin-Madison。期中考的範圍都可以在書中找到對應的單元,期末考的範圍就比較迷樣了,有許多只有講義才有的內容。不過我認為讀書對於了解期中考範圍還是蠻有幫助的。期中考的內容比較簡單也較好掌握,強烈建議同學們多花一些心思在準備期中考上面。期末考真的非常奇幻,不太知道老師想要考什麼,拿到考卷之後更不知道要怎麼寫QQ。老師的講義內容如下表:
編號 | 單元名稱 |
---|---|
1 | Introduction |
2 | The MICRO Language |
3 | Scanner |
4 | Grammars and Parsing |
5 | Top-Down Parsing |
6 | Bottom-Up Parsing |
7 | Syntax-Directed Translation |
8 | Symbol Table |
9 | Semantic Analysis |
10 | Intermediate Translation |
11 | Code Generation for a Virtual Machine |
12 | JVM and Code Generation |
期中考的範圍為 1 ~ 6,期末考則為 7 ~ 12。
這一堂課的重中之重就是四次程式作業。老師還開玩笑的說沒有寫完四次程式作業的同學不可以退選。這堂課的終極目標是打造一個簡易語言的編譯器,因此四個作業分別是:使用flex製作scanner,使用yacc製作parser,建立symbol table和parse tree與最後的Java bytecode code generator。助教會利用docker製造出虛擬環境,提升同學們寫作業的體驗,算是功德一件。好笑的前兩個作業的難度很低,基本上花個兩三個小時就可以搞定。正當你放下戒心,以為編譯器也太過譽,不過爾爾。作業三和四就當面襲來,殺個你措手不及。依稀記得小弟我因為學藝不精,編譯器架構設計的有問題。弄到整個禮拜都死死黏在電腦前面修修改改作業三,著實的體驗了一把竹科工程師的心酸。
楊武老師在第一次上課公布的評分標準如下:
- 期中考(30%)
- 期末考(30%)
- 程式作業 (40%)
其中前三次的程式作業助教都有提供測試資料,不存在隱藏測資,因此有繳交的同學普遍都拿到滿分。最後一個作業老師有特別指定要加入隱藏測試資料。另外還提供20分的bonus讓有興趣的同學來挑戰。不過楊武老師在計算學期成績的計算方法非常玄乎,調的一塌糊塗。因此唯一確認的就是,別被期初公布的比例騙了。
編譯器設計概論是我少數覺得修得有點痛苦的課程,繁重的作業更是一整個學期的惡夢。怎奈編譯器本來就不好念,其中錯綜復雜的理論基礎和實務上許多工程方法相互交織縱橫,讓人很難一下就將這個複雜的系統搞懂。但我認為上完這堂課,我對於這樣重要的系統軟體有更深一層的見解。或許就是因為他的使命如此的獨特且重要吧!這個複雜的系統還需要我們多多了解與鑽研,才對得起許多人口中的:Wow! Compilers are like Magic!