交大修課心得 - 編譯器設計概論
課程綱要
課程名稱:(中文授課)編譯器設計概論
授課教師:游逸平
當期課號:1165
永久課號:DCP4529
修課年度:109上 資訊共同 - 必修
使用書籍:龍書
心得
教了什麼
上課會教編譯器的設計與實作,要怎麼「從頭」做出一個編譯器:
- Lexical Analysis
- Context Free Grammar
- Top-Down Parsing
- Buttom-Up Parsing
- Syntax-Directed Translation
- Intermediate-Code
- Run-Time Environment
- Code Generation
- Control-Flow Analysis and Optimizations
- Data-Flow Analysis and Optimizations
作業比較像是用已經「做好」的工具 (flex + bison) 寫編譯器,不用自己刻 Regex、CFG、LALR… 等,前半學期教的是這些工具背後怎麼實作的
上課方式
投影片上課。章節基本上是照著龍書走的,所以如果有上課聽不懂的地方回家翻一下龍書還能找到對應的資料。
學期初的時候沒有點名,學期中後老師開始用 zuvio 點名,還會檢查 GPS 看有沒有人不在教室卻有點到名XD
考試作業
- 期中考 (22.5%),考到 Buttom-Up Parsing
- 期末考 (22.5%),考到 Control-Flow Analysis
- 課堂參與 (5%)
共 5 個 HW (50%),作業好像是去年大改了的樣子:
- HW0: Environment Setup
- 跑看看 docker 和 git 等環境
- HW1: Lexical Definition
- 用 flex 寫 regex
- HW2: Syntactic Definitions
- 用 bison 寫 context-free grammar
- HW3: Constructing Abstract Syntax Trees
- 基本上在寫 C++,透過 Visitor Pattern 把 AST 建出來
- HW4: Semantic Analyses
- 檢查語義問題
- HW5: Code Generation
- 生成 RISC-V 的 assembly code
基本上大部分是用 C++ 寫,不過有些地方如果不對 flex/bison 做設定,會沒辦法用 Plain Old Data 以外的型別 (STL 的物件…等),所以有些地方還是會看起來像 C。
作業沒有規範說一定要用 C++,因為要另外做一些設定,但我自己是全部都用 C++ 寫,感覺比較一致一點。
後記.1
老師上課我覺得上得都教的滿清楚的,作業的設計在去年大改後整體也都變得十分優質:
- 有提供 docker 的環境
- 自動測試腳本 (pytest)
- github 的繳交及批改作業方式
- 問問題的話是透過 github 的 issue 提問,十分公開透明
- 有什麼 spec 或是 bug 修正,會透過 PR merge 回學生的 repo
- 用了潮潮的 RISC-V,十分與時俱進
- 作業彼此十分連貫且完整,最後寫完會滿有成就感的
覺得寫作業的體驗增加滿多的,還滿推薦修游逸平老師開的編譯器的。
後記.2
為什麼會說「寫作業的體驗增加滿多的」呢? 因為我在大二下已經修完碩班的編譯器設計… 不過這又是另一個故事了