我認為這門課是一門真正與代碼做斗爭的課程,,而且編譯原理可以說是一個計算機科學的縮影。你學習它更多的是去追尋程序設計語言的本質,學完這門課程,我相信,你對你所寫的程序、程序語言都會有更深的本質認識,這樣的認識也會讓你站的高度完全不同,如果你真的學的好,我想別人看到的是語法,你看到的是背后的實現,
在歐洲教會還不允許做屍體解剖的時候就有兩類人在一起偷偷摸摸的搞人體解剖:一類是醫生,從外科手術的角度來說應該比較容易理解,不解剖根本不可能知道如何做外科手術;還一類則是畫家,他們只是為了可以更好的在描繪皮膚時體現肌肉的質感,就願意冒着被教會處罰的危險來參與人體解剖。而且即使是現在,所有的現代繪畫的教育雖然不會再像醫生那樣實際操作解剖,但是肌肉層的解剖圖仍然是必修課。
在我看來,完全不懂編譯原理的程序員,就好像是完全沒有學過人體解剖圖的畫家一樣,當然不會說一定就無法成功,但更好的基礎可以提高成功的幾率。在知道底層的情況下,對上層的描繪會更加寫實,更加生動。
從現實的方面來說,編譯原理學過之后的益處(不考慮最后都沒有入門的情況)包括:
1、可以更加容易的理解在一個語言種哪些寫法是等價的,哪些是有差異的
2、可以更加客觀的比較不同語言的差異
3、更不容易被某個特定語言的宣揚者忽悠
4、學習新的語言是效率也會更高
5、其實從語言a轉換到語言b是一個通用的需求,學好編譯原理處理此類需求時會更加游刃有余
另外還有一點,就是一直有人說不用重復造輪子,所以不需要學習編譯原理這樣的課程。我想說的是,學編譯原理不是讓你去造輪子(大多數人的實力,學了也造不出輪子),而是要讓你知道現在一共有多少種輪子可以選擇,它們特性如何?
個人不太建議一上手就拿起龍書、虎書等等來看。
學過編譯原理課程的同學應該有體會,各種文法、各種詞法語法分析算法,非常消磨人的耐心和興致;中間代碼生成和優化,其實在很多應用場景下並不重要(當然這一塊對於“編譯原理”很重要);語義分析要處理很多很多細節,特別對於比較復雜的語言;最后的指令生成,可能需要讀各種手冊,也比較枯燥。
你就可以學會但不限於下面幾種技能:
1、強大的調試能力(譬如說你用你的語言寫了個程序,出錯了,你怎么知道是編譯器搞錯、虛擬機搞錯、還是你的腳本自己搞錯了)
2、牛逼的內存管理能力(寫虛擬機,垃圾收集內存不泄露,屌!)
3、組織大量代碼的能力
4、寫庫的能力(你開發的語言沒有容器?沒有字符串?沒有多線程?沒有IO?那有什么用!)
5、混合語言開發的能力
6、開發高質量單元測試的能力
7、寫腳本產生Release文件夾的能力
編程的大部分工作,都是在處理字符串,也可以說是數字吧。
在我看來,編譯器最大的作用除了讓你深入了解語言機制外,就是培養了你嫻熟的處理字符串技能。
你會解析字符串,就已經和只會用庫的人大不相同了。像json yaml這些,蘋果平台直到ios5才有自帶的json庫。
web領域什么scss之類的,例子太多。
額外的,你擁有了一個語言編譯到另一個語言的能力,這個就很實用了。web開發領域經常出個coffeescript這樣的東西就高興壞了,社區大震動。。。。其實主要因為web領域高水平程序員比較少,會做語言編語言的事情的人一抓一大把,可惜人家大多不做web開發,你想要好東西,只能等,哈哈。。。
所以操縱語言這個超能力還是很好的,起碼lv5吧,而且反正你可以開發多種超能力,是吧
不學編譯原理,可能永遠給各種寫編譯器的人當奴隸,以為寫程序只能按照他們設計的語言哲學來做。學好了編譯原理,不一定非要自己寫語言,但是至少能把很多其他程序員覺得很酷的東西看得透徹一點,不會被程序語言的設計表象騙到太多。