過去承蒙許多學長姊向我介紹系上不同的教授、不同的課程,我才能度過這麼充實的資工系生活。所以,其實很早就想寫一些這樣的文章,希望能對學弟妹選課有一些幫助。正好今天(其實嚴格來說是昨天)是教師節,就把已經寫好的一些東西放上來吧!
在上個學期開始之前,我就知道這大概是自己讀資工系的最後一個學期了。於是我懷著期待的心情,選了一些自己一直很想好好修的課(組合語言除外)。當時修的課共有這些,依據我專注的程度排序:(推荐程度太低的課就不寫上教授的名字了... :x)
- 編譯器設計概論 徐慰中教授
lecture ★★★★★ homework ★★★★ quiz&exam ★★★★ loading ★★★★ (稍重,但合理) 推荐程度 ★★★★★
編譯器設計概論的徐老師可以算是大學生涯以來,我遇過教學最為傑出的教授之一。他是明尼蘇達大學的教授,2009年的秋季開始,會回來台灣,加入交大資工的行列。如果學弟妹有機會選到他的課,我認為這非常非常值得,一定要上~!他的講課清晰流暢,非常著重觀念的引導,具啟發性,他也很熱心回答學生的問題。專心聽老師講一堂課,勝過自己讀幾個小時的書。徐教授會親自設計所有的小考題目(關於小考的形式,我曾經寫過另外一篇文章)、大考題目、以及每一項作業;這些教學活動的目的都非常明確,就是希望幫助同學更明白編譯器設計的重要觀念。他會儘量記得每個同學的名字,掌握整班的學習狀況,會親自看每位同學的期中期末考卷,不點名。
這堂課作業是要自己寫出一個C--的編譯器(C--的意思就是功能不完整的C語言的意思),分成六個階段,除了會用到LEX和YACC以外,也要自己設計出symbol table和相關的操作功能,還有做出幾項基本C語言編譯器的功能。例如,要處理scope、接受整數和浮點數運算、要可以把if-else, for/while loop編成對應的組語code、要處理使用者自訂變數(structure)和多維陣列裡的元素、實作出function call及其formal parameter的傳遞並return值…等等。設計、實做這些功能的過程中,程式的功力一定會漸漸進步,有興趣的學生看到簡單的C語言程式通過自己的彆腳compiler執行出正確的結果,也會感到非常興奮的!:)
作業是和課程進度緊密相連的,每當要教一段新的課,老師就會把作業公布出來,讓我們一邊學習,一邊動手做。還記得做到semantic check階段的時候,因為很難,所以教授就在課堂上花了許多時間,給我們提示和指引,又回答我們的問題,令人覺得不認真一點做還真是對不起老師。
老師非常要求學生在deadline前完成規定的作業,但是,如果真的無法,老師也會放寬期限,並努力幫助大家。上學期,有一次為了如期趕出target code generation的作業(也就是產生可執行的組語程式)和同伴一起在系計中工作到天亮。大學四年以來,在系計中待到天亮的次數也就只有兩次而已(另一次是大二的SA期末project,真是痛苦的回憶呀!! >O<)。而那一次為了compiler project工作到天亮的經驗,卻是一種甜蜜的回憶。
現在,我再也不想coding到天亮了,但是我會一直懷念這堂課的。想學compiler的各位學弟妹請務必來選徐老師!:)
- 正規語言概論 蔡文祥教授
lecture ★★★★ homework ★★★ quiz&exam ★★★ loading ★★★ 推荐程度 ★★★★
蔡教授講課非常認真,非常在意同學是不是能夠在課堂上聽懂他所要教的重要觀念。他已經教了十幾年的正規語言,所以真的能夠體會學生會在哪些階段遇到瓶頸、會被哪些概念混淆…。他會不厭其煩地重覆重要的觀念,直到他認為大多數的學生都懂了為止。這門課的作業不能算少,但絕不算難,如果全都認真寫完,就可以掌握正規語言與計算理論最基本的觀念了。
在這門課上學到的概念很快就可以用在其他的課程上,像是組合語言、程式設計等等,所以修課的時候常常感到學以致用的快樂:) Turing machine的一些基礎理論的證明也令我滿興奮的!
平心而論,蔡教授的這門課的啟發性並不算很高,至少不會像「高等演算法」或是「組合數學」那樣讓學生絞盡腦汁,並從苦思的過程中體會到什麼重大心得。不過它的確能夠幫助學生充份的了解正規語言與計算理論的基礎。


沒有留言:
張貼留言