請問達到怎樣的水平才能進微軟這類公司從事搞編譯器這類工作?

題主目前大三,在一所二本院校軟體工程專業學習,基本上已經學完了課程。一直以來對於編譯原理有濃厚的興趣,奈何軟體工程專業沒這門課(計科才有)。於是開始自學。目前自己是一名java程序員,也在扣有關於java虛擬機的一些知識。學習編譯原理的書也是基於java的。也許會有大牛說還是用c++吧云云。也許未來需要用到,不過我的想法是先夯實理論知識,請問各位編譯器領域的專家能否給小弟一些指點? 比如說書單‖博客‖學習方法


我對編譯的興趣是研究生才開始出現,本科畢業的時候我都不知道我對什麼有興趣。於是,那時候成績好,也就順勢保研了,然後也多給了我一定的時間來思考。就實際做編譯器來說,其實編譯原理的知識沒有想像中那麼的那麼多,但是卻又是不能沒有,因為很多時候要解決一些問題的確是需要編譯原理的知識,如語法分析的左遞歸,公共因子提取等可能是千萬個Bug才會遇到一次。

而實際編譯器開發中什麼更重要呢?我覺得其實編譯器也就是一個大的工程軟體,只是需要對語言,底層更加的熟悉,如ABI,Runtime,Linker等問題會遇到更多,更多的時候需要你有強大的內心和工程能力功底與經驗,有時候調試的心理崩潰了,會非常羨慕寫應用層的人,然後阿Q精神的說寫這樣的才能體現出智商,寫應用層的哪有這麼麻煩。

後來我也在想,我其實更大的興趣是什麼呢?其實是C++和挑戰,做編譯器也許是方便我更好的研究它,也有很大的挑戰性,也許有一天我會因為發現更大的挑戰而不做編譯器了。

書單和方法什麼的,已經有很好的答案了,我就不再說了。而寫下這些內容也有點兒胡言亂語,你隨便聽聽就好。


強烈反對@Mak Elk提到的「而那些多少天自製什麼鬼語言,也別看」這句話

中國的大學課程是說得太多做的太少,簡而言之就是不重視project,像編譯器os這種重量級課程,國外都是給你提供一些framework的代碼然後讓你慢慢從0開始搞一個成品出來。對於cs學生來說動手非常非常重要。

編譯器裡面涉及到的演算法非常多而且複雜,像龍書這種教材的理論證明很多,直接上手難度比較大而且比較乏味。這個時候不妨參考「多少天自製XX語言」這種書或者文章,先擼一遍,然後你會明白到涉及到的演算法和問題是怎麼一回事。像我在大三的時候就開始翻龍書,但是之後幾年一直卡在前幾章各種不懂,每次想嘗試去突破總覺得理解不了然後就不了了之,隔一段時間後再重複這個循環。後來自己直接擼了個玩具編譯器,再去翻龍書發現沒有像以前那樣晦澀難懂。話說回來,龍書絕對不是入門的書,哪怕compiler engineering都比龍書易懂,雖然我認為complier engineering同樣不適合入門。

輪子造多了對個人的能力提升很大,就算你只寫過玩具,搞大型項目的時候上手就快很多了。

--------------------------------------------------------------------------------------------------------------

至於進微軟搞編譯器的難度嘛,主要取決你是在天朝還是在美帝,然後再取決於你要去的是什麼組。。。


編譯原理怎麼學就不說了,這個都被人說爛了。你說到

也許會有大牛說還是用c++吧云云。也許未來需要用到,不過我的想法是先夯實理論知識

的問題,在微軟,所有編譯器要麼用C++寫,要麼用C#寫,只有typescript是typescript寫的。所以我覺得你這麼慢慢學可能來不及了。你應該花兩倍的時間,把C++也順便搞定


Dicendus vilis est. Mihi codicem ostende.


扔掉你手裡這本書,換《Programming Language Pragmatic》+ 《Language Implementation Patterns》+ coursera 上Stanford 的Compiler 課程(有精力的話再加本ML版的虎書)。然後「夯實理論知識」最好的辦法就是開始動手寫程序,在這個過程中你可以找別人的代碼來參考一下,也是很好的學習方式(但你得會區別好代碼和爛代碼)

另外,現在的編程語言都比C 複雜多了,直接做編譯器可能有點難,比如要寫Runtime Library。所以先學會寫解釋器很有好處,可以讓你快速理解semantics,調試Compiler,集成REPL等。這部分可以看《Essentials of Programming languages 》

以你目前的水平看完上面這些已經很不容易了,更高層的EAC、TAPL 之類的書先不說了。看看自己能不能堅持下來吧先,我已經聽太多人說對編譯有「興趣」………去微軟什麼的先別想太多。


為什麼不先夯實基礎呢,彙編不熟,操作系統理解不深刻,計算機體系結構也菜,底層知識也一臉懵逼,幾百行的代碼都hold住,一頁英文資料都看不下去,怎麼寫編譯器。更別提什麼設計閉包,中間代碼生成,數據流分析,寄存器分配,GC,代碼生成什麼的了。

困難的路越走越容易,容易的路越走越難!


&<編譯原理與實踐&>和&<計算機系統要素&>這兩本書不錯, 都不是很厚, 根據書裡面的提示, 看完這兩本書, 我就寫了自己的編譯器 https://github.com/xiang1993/jack-compiler


我和你一樣 ,大三,也喜歡編譯,但是現實中有人不看好,或者覺得對本身職業發展沒什麼用,

面試過程中,不少人面試官對我說,願意搞編譯的公司太少,而我應聘的職位恰好,是諸如伺服器後台,基礎架構師,這一類的職位,我本身對於操作系統的知識,特別是Linux的知識不是很熟練,所以就一直跪,他們也不問編譯,因為他們也不了解,搞得我很無奈。於是我轉去學web前端,一個月速成,真是學完編譯,對於語言本身這個東西是看的越來越有自己的想法了,做什麼,不做什麼,適合什麼,寫程序的風格,對於背後的機理,是有一種探索精神的,這就是學編譯的好處,沒有必要,我學這個東西為了什麼硬性的目標,無形之中幫到你也是大大的成功。

還有我的TIger是我的第一個編譯器,也就是虎書上的 https:http://github.com/whps 。

目前正在開發自己的一門語言馬上就要上線詞法部分了,這裡頭的自動機,演算法,統統都是自己寫的,甚至還寫出了一個常用的數據結構庫。這門語言致力於簡潔,但不至於歧義。

以上。


二本的話注意一下英語

讀原版書

一線的編譯器資料都是英文的

只要讀完第一本原著後就很容易了


百度 CPPGM 你值得擁有


什麼都不想說,就介紹一本英文書

Compiler Construction - Principles and Practice - by Kenneth C. Louden (記得買英文影印版,中譯本翻譯太差)

如果你有緣分真的買這本書來看,相信你的編譯之學習路程會大不一樣,龍書,虎書,犬書,鬼書,這些都先別看。後面這些書,是在你已經了解了編譯原理的整個框架後,逐步有選擇的深入才需要的。

而那些多少天自製什麼鬼語言,也別看。

* 專門對付 @ototsuyume 的回答,我介紹的這本書就是比龍書來得容易理解,也比那些「多少天自製某個語言」來的深入,最關鍵的是,他也教你從無到有做出一個語言,而且還是基於虛擬機來講代碼生成的,不必要你了解彙編指令。


想的太多,動手太少。


推薦閱讀:

Golang本身是用什麼語言寫的?
Don"t Learn C the Wrong Way ?
為什麼很多語言的實現裡面的 Lexer 都沒有使用 DFA?
基於表驅動實現的詞法分析的一點疑問?
C/C++語言有哪些不是上下文無關的語法規則?

TAG:編譯原理 | 編譯器 | 編譯 | 現代編譯原理 |