交大修課心得 - 編譯器設計概論

課程綱要

課程名稱:(中文授課)編譯器設計概論

授課教師:游逸平

當期課號: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

為什麼會說「寫作業的體驗增加滿多的」呢? 因為我在大二下已經修完碩班的編譯器設計… 不過這又是另一個故事了

comments powered by Disqus