學習編譯原理只是研究lex和yacc嗎?

這學期上編譯原理課,兩個實驗(寫個lex和yacc),估計教學內容也就上到詞法分析和語法分析這兩塊了。

難道編譯原理不用涉及怎麼生成彙編語言嗎……


不是 不過對於非編譯方向的絕大部分人來說 大概也就前端的姿勢可以使用率比較高一點吧

雖然對於編譯來說前端只是小節 大頭都在優化上


xtlisk的專欄 - CSDN博客

講造語言的事情,不涉及lex和yacc,很多內容和教材也不沾邊,但這也只是個人悟出來的冰山一角而已


師傅領進門

修行靠擼碼 :)


這是課程設計問題,實際上 Parsing 只是編譯原理中很小的一部分,這也是為什麼某場上古程序員戰爭會出現「咱倆比賽寫 Tokenizer 和 Grammar Analyzer」。

等你真正做個語言,用到的也是「編譯原理」的知識,但是就有你說的那些東西了。

而且還有很多玄學的東西,比如類型推導(尤其是互遞歸時的推導),閉包捕獲的檢測(我覺得應該編譯成函數然後捕獲變數 call by reference), label return 和 label break ,各種常量摺疊,宏,overloading 和 subtyping 同時存在時的蛋疼,etc

而且你也可以自己弄虛擬機,就自己設計彙編(其實應該叫位元組碼)了,或者用別人寫的 VM ,比如宇宙毒瘤 JVM ,或者政治不正確的 CLR ,這種其實不能算是涉及彙編

Native 語言現在一般也不生成彙編,都用 LLVM 了,只有某個很有情懷的人會忍著渣優化手寫生成彙編

強烈譴責在自己回答里推銷自己語言的某人

希望這次評論區不要再冒些星際玩家


其實本科學編譯原理和做那幾個實驗的真正目的,不是讓你去用yacc,而是讓你去寫出一個yacc來。書里什麼都手把手教給你了,你就剩把他翻譯成C++了。很容易的。

等最近把GacUI的幾個最後的功能做完之後嗎,為了出GacStudio,我還得重構一次我自己的yacc,不僅要解決Parse,還要解決ToString,還有順便把代碼和AST之間互相更新的那部分也順手給生成了。做出來之後,AST就可以作為代碼字元串的一個view存在了,改了AST告訴你字元串的diff在哪裡,改了字元串告訴你AST的diff在哪裡。寫IDE再也不用蛋疼了(逃

有空到時候再寫幾篇專欄。


當然不是了。

國內絕大部分(幾乎找不出一個例外)計算機專業本科開的編譯原理根本就不講原理。

就按國內正常的教學水平,能把前端的原理講明白就不錯了。後端更難講啊,後端是多種多樣的,需要的東西各有不同,別蒙我,編譯到CPU,GPU,FPGA後端真的能一樣么?

我在 各減平均各自乘相加除以項數開方 中提到了,自稱寫parser的winter能和自稱寫type inference的王垠吵起來,兩個互相看不起寫另外一種的,他們還都是正經的計算機科班出來的,對編譯原理就這點認識,國內計算機教學水平可見一斑。假如真的講了編譯原理的話,他們一定知道從原理上看,兩者是統一的,這都能互相看不起,是要鬧笑話的。真正荒誕的是,知乎上卻都在看熱鬧,而不是看笑話。我也給出了一個非常簡單的例子,在那個例子里,兩者是就是融合在一起的。

前端一小部分就是關於這個的。lex/yacc,從原理上看,只是針對某些具體問題的優化。還有SSA,polyhedral model什麼的,這裡就不多說了。反正真正學過前端的都懂的。


我也是新手,很慚愧,去年(2016)勉強算是上過編譯原理的初級課程。

我們學校 CS 426 Compiler Construction 的課程基於 LLVM,因為我上的時候教授是 Vikram Adve 。

課程主要流程結構是這樣的:

  1. Intermediate Representations
  2. Runtime Environments.
  3. Intermediate Code Generation
  4. Optimization Basics
  5. Dataflow Analysis
  6. Global Optimizations
  7. Register Allocation
  8. Instruction Scheduling

lex 和 yacc 完全沒教怎麼用,只是在寫第一個作業的時候用到過差不多的,然後就再也沒用過了。

我們的作業主要就是編寫 Cool Language 的 Compiler。我回想一下我寫過的 MPs 啊:

  1. 好像是搭建 llvm,使用 flex 和 bison 編寫 Cool Language 的 parser。
  2. 編寫 Cool Language 的 Intermediate Code Generator。簡單來講就是編譯出 LLVM IR。
  3. 接著上一個作業繼續寫 Code Generator。
  4. 和上面的作業沒關係了,主要是編寫和 LLVM Backend 相關的 Dataflow Optimization:LLCM(Loop-Invariant Code Motion)以及 ADCE(Aggressive Dead Code Elimination)。
  5. 編寫基於 Graph Coloring 的 Register Allocator。

所以前三個作業是編譯器前端相關的,後兩個是編譯器後端相關的。

使用 lex 以及 yacc 只是前端的一小部分而已。

編譯器也是個大坑。

結論:

學習編譯原理不只是研究 lex 和 yacc。


好像不是這樣的。本科編譯原理課要求實現包含詞法分析,語法分析和語義分析三個部分的C語言編譯器,要動態展現三個部分運行結果,並在源代碼中提示編譯出錯位置(當初還因為這個課程項目發了倆paper)。

master的編譯原理課下學期選,好期待。

------ 補充:好多人私信具體細節,真的忘的差不多了T T,找了幾張放在論文上的圖 ------

嗯,大概就是這樣。


因為簡單,,,所以普遍大部分老師都只講前端那一點點的內容。。。

讓那些老師講中段的優化部分,,,怕不是除了專門做編譯優化或程序分析的那些老師以外,,,老師自己就不怎麼會。。。乃讓他們腫么教。。。

後端的目標代碼生成和寄存器分配也是像前端那樣的現成的演算法,,,但是太偏向硬體了,,,所以軟體老師一般講的可能會比較少。。。

總體上來說,,,編譯過程裡面最重要也最具有技術含量的就是中段的編譯優化部分。。。但是這一部分也是跟數學相關性最高最難理解和講明白的部分。。。很多東西都是講淺了講不明白,,,講深了不容易理解,,,另外課時也不夠用。。。所以乾脆就只講前端就好,,,留作業也方便內容也簡單好備課好講。。。


人生苦短,學個操作系統難道要完整的從頭擼一個?有時間當然可以,但是時間真的不夠用。


不是.只是國內cs本科基礎教育薄弱,讓你誤以為編譯器只有這些前端的東西.


個人覺得yacc挺不錯,學會用還是很有用的。編譯後端要配合計算機體系結構和語言來才有意義,這真是要花不少精力才能入個門。當年剛入了門,課程就結束了,算是開了眼,但離掌握還很遠,後來也忘了很多。但也養成了看spec的習慣,算是芝麻吧。


roslyn的實現就沒用到lex,一看就知道是手寫的。很多語言為了針對性優化編譯器性能,詞法分析是手寫的。所以你學編譯原理(以詞法分析為例子),不僅需要學會怎麼用lex(這太簡單了),重點是那些理論(NFA,DFA,以及為什麼這樣建模),還有理論如何實際應用(看看真實的語言的詞法分析實現),還有就是看 @vczh 的博客,雖然已經有點歷史了,但是能了(mo)解(bai)大牛的思路啊(逃


我航本科編譯是不用yacc和lex,從頭自己寫一個小編譯器


語言轉換最複雜的部分,就是把文本代碼轉換成計算機語言能描述的數據結構。完成了這一步,想寫成什麼形式,還不是任你揉捏?

lex和yacc只是完成這一步的一種工具。

彙編本身是一大語系,語法繁多,計算模型也和高級語言相去甚遠,需要符號映射。

屬於代碼展開的範疇。


請問大兄弟貴庚,二老身體是否安康啊?

今天你吃了嗎?


我覺得這個問題,可能回答的人不多。因為有這種實力的人,沒必要給你答題吧。

那麼請珍稀我給你的回答,點個咱吧 。

我的出現是為了讓你覺醒。

編譯原理這門課已經出來幾十年了。但是書,還是那幾本,什麼龍叔,狗書的。弄得那麼厚。

不停地給你,介紹各種新名詞,還不對路,都是老外的命名方式。和思想。

然後走馬觀花,這門課就畢業了。

我希望你們院的老教授最好,搞個中文環境,把lex和yacc,改成中文名字,可以解析中文漢字。比如放個出師表,立馬就變成代碼執行了。

看到這裡估計你會大驚,默默地再也不看這個帖子了。

所有人都像你這樣,你往下走,不還是老外那一套嘛。人家比你早發展幾百年,你能出其右?

充其量就是個馬前卒而已。


我現在自學仿造yacc和lex。還有開源代碼。造一個自己的解析器。希望先把lua和c代碼 無損解析 到我的中間件上面,編輯完脈絡之後,再原路返還回去,成為可以執行的代碼。

你想想,同樣是大學生,你們將來怎麼跟我們競爭?

現在是clang和llvm如日中天啊。怎麼辦你自己看吧。

我認識的幾個在讀的大學生,他們是邊上課,幾個寢室,研究libclang提供的便利,用來解析c和cpp的詞和語法。不知道你們那裡是怎麼搞的。

別太落後了,要不然進同樣的企業,高下立現,誰幹什麼崗位,可是靠實力說話的。

如果你們大學寢室的學生,還沉浸在老子天下第一,不合作的態度,還是那句話,三個臭皮匠,頂一個諸葛亮啊。

如果,你沒那個環境,同學們為了那顆技能樹還在產生分歧,各自為戰,我只能說。。。

還是先給我點贊吧。 敢研究這個問題的人,寥寥無幾啊。你不點,,,我這些乾貨,就沉默了。


編譯原理,可以研究很多東西。問題是,如果把編譯原理一展開,關鍵字滿屏,基礎理論幾百萬知識點。一細分,整個系的人都傻眼。就是整個系聯合,6個月,就那麼幾節課,只能夠略懂的皮毛。腦圖統一了嗎?思維導圖用什麼工具?我看了,網上那些腦圖,質量參差不齊。

yacc和lex其實就是 代碼生成器的一種

那麼問題來了,既然學到c,你會寫c的yacc嗎。


推薦閱讀:

sibling call是什麼?
現在的編譯器的inline策略是怎樣的?
devcpp編譯生成一個無許可權運行的exe,並且無法再次修改編譯也無法刪除exe,如何解決?
誰看完過龍書虎書鯨書?全部看完是不是就有能力寫一個C語言的編譯器了?
c++有哪些像__gcd這樣的編譯器自帶函數?

TAG:編譯原理 | 編譯器 | 中間表示編譯原理 |