早就聽聞編譯原理很難,而且很重要,寫一個編譯器算是合格,快放假了,寒假大概40天左右,能學個什麼程度?
由於實在不敢恭維大學老師的講課水平,不自學肯定是聽不懂的,自學懂了也就不用去上課了?那麼大概能學個什麼程度,求指點下!
本來想推薦學一點函數式編程、寫一點解釋器的,回想這個學期我自己上兩門公開課入門好像都用了兩個多月,折騰寫解釋器又花了一個月。。所以40天寫lisp好像並不適合題主,畢竟學一些困難的概念是要花不少時間的。。
跟著LLVM Tutorial: Table of Contents一步一步把東西做出來吧,有C/C++基礎就能做,前中後端的知識都有覆蓋到。40天全部用來做的話大概還有空餘,那就學點其他語言漲漲姿勢就行。。
第40天以後:
1. 看龍書/鯨書,掌握傳統命令式語言的更多優化技巧
2. 看csapp,學一點linux、彙編,然後不依賴LLVM自己寫代碼生成和JIT引擎,再繼續就是看量化研究方法之類的體系結構書了
3. 看compiling with types/compiling with continuations,入門函數式語言編譯器的技巧4. 看types and programming languages,如果習題都能做完,c++/scala之類複雜語言的類型系統也就難不倒你了,自己設計語言也能胸有成竹5. 看parsing techniques。。不過我覺得文法沒啥意思就是。。待高人補充如果你有C#的基礎,那麼腦袋的這個系列是非常棒的,從無到有的完成一個簡單語言的所有編譯過程,最後還能生成IL運行,並且所有的工具都是手動擼的,你可以了解到幾乎所有的細節。
自己動手開發編譯器(零)序言 - 裝配腦袋
看看有限狀態機什麼的lexer分分鐘出,parser學個遞歸下降就行,編譯的話就llvm或jvm或js。40天綽綽有餘,這些教材源碼什麼的應該都很多就自己找吧,雖然有點野路子 但目標至少達到了,嫌理論知識不足的話等以後能靜下心了再去補補龍書鯨書什麼的,@vczh聚聚的教材貌似也不錯,可以嘗試下(我沒看過...
短平快的方法:買 自製編程語言 跟著學跟著做。一個半月能寫一個簡單的解釋執行語言出來。
如果是真想入坑,那麼@邵成推薦的一堆東西還是得花時間去都了解一下,戰線會很長。
但學懂了會很爽,不信看vczh。(逃如果真要學習編譯系統的話, 請不要偷懶, 一步一步從金字塔底層爬上來吧!
我花了一年, 目前爬到 code generator, 但我是用上班之外的閒暇時間開發的, 你的 40 天是可以全力衝刺的。
不知道你的程度如何? 但光下面2層應該就不容易達成。有位朋友說不難, 但我卻有不同的意見, 編譯器是很難的程式, 你得要有毅力才有可能完成他。我沒用上很複雜的資料結構, c++ 裡頭的 vector, map 就已經足夠, 但 AST 的處理是比較難的部份。這只是玩具等級而已, 每一步都自己來, 不靠任何工具完成。
我在寫這個之前是寫一個 os kernel, 這樣的經驗完全沒有幫到忙, 我一樣得從頭學起, 慢慢打造所有的雛型。但是在寫這個之前, 我用 2 個月的時間完成一個 scheme interpreter, 以 sicp 4.1 那個為例子, 打造 c++ 的版本。
這是略過 interpreter 和 optimization 的部份。
https://github.com/rswier/c4
最近在看這個
500行代碼,實現了C的一個子集
特性:將代碼編譯為位元組碼,虛擬機執行
有jit分支,看了之後發現比寫生成可執行文件還簡單。
也有編譯到x86二進位文件的分支。
代碼真的很短,值得一看。題主的心態本身就不對,國內大學的老師教學水平誠然有參差不齊的現象。但我覺得也不能完全的一概而論,至少我覺得我上過的編譯原理課,雖然談不上又多深入,但是老師的講解還是很清晰的,我也在逐步完成了一門JVM上的DSL。題主不如問問學長哪個老師的課比較好一點,再去選課。還有「自學懂了也就不用去上課了」是什麼鬼,你不去怎麼知道他考什麼呢 (逃
你不是搞創新性技術,不搞教研,誰跟你說編譯原理難?我敢說說它難的99.99%是不懂編譯原理(道聽途說相當可怕,估計相當一部份人看了你這個問題也會形成"編譯很難"的觀念),至於另外極少數的人是因為研究深入(你告訴我哪種技術深入研究不難?)。 一直流傳說編寫編譯器很難,那是上個世紀六七十年代的說法(那時候根本沒有什麼演算法數據結構的概念,數據結構演算法這些理論就是在早期開發操作系統編譯器的基礎上總結出來的),距離現在50多年了,很多理論已成體系,寫個編譯器沒什麼難度,還不是那幾種普通的演算法,數據結構。
推薦個MOOC - stanford compilerhttp://class.stanford.edu/courses/Engineering/Compilers/Fall2014/about
flex+bison大概半周
llvm大概半周英語不好的話再給乃半周寒假效率低再加半周兩周寫個語言玩的話,,,應該差不多想學前端理論的話,,,剩下的三周也夠了。。。想學中端優化的話,,,好難,,,幾年吧。。。後端的話,,,就用llvm吧。。。
前端很簡單 後端難
乖乖看完Engineering A Compiler,然後寫個lisp家族的解釋器(+編譯器),專註於後端才是學習編譯原理的正道,parsing看懂就行,手寫遞歸下降基本上以堆苦力為主。還有用一個帶GC的語言可以減少你很多的工作量。
沒人提《Build Your Own Lisp》?照著擼就行了。
Build Your Own Lisp
40天內可以學習寫一個scheme子集的編譯器,首先寫一個sexpr的parser,簡單吧
然後把高級特性比如macro,first class function,first class continuation之類的全部去掉,採用dynamic scoping。
選擇一個有gc,而且支持tco的語言作為目標語言,然後鬼都知道怎麼寫了
我假設你說的編譯原理里包括解釋器。我建議你先看 http://www.cppblog.com/kevinlynx/category/9735.html (先)學習寫一門解釋型語言。不要在意40天能學成啥程度(一步步來),搞定它之後再來提問!
國外大學很多公開免費的講義,國內也有。國內偏詞法分析,語法分析,但是這部分現在完全可以直接用開源代碼定製了,國外比較注重後端的各種優化,生命周期分析,數據流分析,寄存器分配,傳播,死指令刪除啊等等,看點更多,樂趣也更多。
編譯原理這門課多注重理論的學習,要搞明白為什麼要這麼做,不同做法之間的優劣,純粹比著網上的速成教程擼個toy出來,你真覺得自己會了?
寫parser沒什麼意思,我巴不得都是sexp呢(逃
難嗎?專業飛行器設計,愛好寫代碼,一個20天的寒假(話說題主怎麼來的40天寒假?)學了編譯原理,40天後完成一個腳本外加對應的虛擬機。
推薦閱讀:
※如何寫一個簡單的編譯器?
※C語言如何支持C++重載?
※如何從Apple提供的源代碼編譯objc runtime?
※Xcode工程設置裡面編譯器選項為啥沒有GCC?