如何想學點編譯原理,又不想直接看龍虎之類的書籍,太多理論,乾燥?


推薦Niklaus Wirth根據他在ETH的講義修改而成的 Compiler Construction

一百多頁的篇幅, 編譯器從前端到後端代碼生成優化


我來猜測一下題主的意圖:

1、想快速了解編譯器的框架,從全局視角看看編譯器由哪些部分組成,每個部分有什麼作用

2、想快速實現一個自己的編譯器

如果我猜中了,推薦題主一個好資源

手把手教你構建 C 語言編譯器

引用文章的幾段話介紹一下這個項目

有一次在 Github 上看到了一個項目(當時很火的),名叫 c4,號稱用 4 個函數來實現了一個小的 C 語言編譯器。它最讓我震驚的是能夠自舉,即能自己編譯自己。並且它用很少的代碼就完成了一個功能相當完善的 C 語言編譯器。

一般的編譯器相關的教程要麼就十分簡單(如實現四則運算),要麼就是藉助了自動生成的工具(如 flex/bison)。而 c4 的代碼完全是手工實現的,不用外部工具。可惜的是它的代碼初衷是代碼最小化,所以寫得很亂,很難懂。所以本項目的主要目的:

實現一個功能完善的 C 語言編譯器

通過教程來說明這個過程。

c4 大致500+行。重寫的代碼歷時一周,總共代碼加註釋1400行。項目地址: Write a C Interpreter。

聲明:本項目中的代碼邏輯絕大多數取自 c4 ,但確為自己重寫。

推薦理由:

1、只需要懂點C語法和知道編譯是什麼就能看懂

2、只涉及編譯原理知識的最小集,也就是你能夠花費最少的精力來了解編譯原理的全貌(至少了解前端是沒問題的)

2、它實現了一個功能強大的C解釋器(沒寫錯,不是編譯器,但是這並不影響你學習編譯原理)

3、這個解釋器能夠自舉,也就是解釋器的源碼能夠被解釋器本身來解釋執行

4、代碼規模1000+,適合新手

5、整個教程也沒幾頁,適合沒有耐心啃書的同學

題外話:

1、如果題主看不懂,有一種方法是耐心把代碼抄一遍,結合文章理解代碼邏輯,最終還是能弄懂的

2、編譯原理是一門實踐性很強的學科。以前輪子哥說過,編碼功底好的看完龍書能大致寫個編譯器,但畢竟不是所有人都適合這種學習方式。可是,如果先學習一個編譯器的代碼實現,再回過頭去理解其中的理論知識,對一些不太有耐心啃書的人來說可能會事半功倍。

3、如果題主只是抱著玩票的性質,這個教程看完也就差不多了。如果以後想深入研究或者從事相關工作,該啃的書還是要啃的。


《The Implementation of Functional Programming Language》


鄙人很理解你呀,龍書確實太理論了,我基本上翻不了20頁就能看睡著。

而號稱實踐的虎書,雖說有大量的偽代碼和代碼片段,但是沒有理論支持很難把他們組織起來形成成果,更別說那一上來大篇幅的正則表達式,狀態轉移圖和自動機理論看得你一頭黑人問號。加之目前市場上很多能輕易獲取的書籍和資料大多都使用的yacclex antlr pyl等自動化工具。這對於一個以學習為目的而非以最少代價實現dsl為目標的心態是不一樣的。以學習為目的的心態是不希望藉助這些生成工具而希望親自參與編譯活動中的各種邊邊角角。遞進規約如何體現到代碼層面?左關聯和右關聯又怎麼通過具體的函數來說明?語法規則如何落地成解析函數?遞歸下降到底是在下降神碼?具體語法樹和抽象語法樹又是什麼一種數據結構存在於內存中?抽象語法樹的多次遍歷究竟是為了什麼?棧式上下文是不是真的好實現?「php究竟TMD是不是世界上最好的語言」?藍翔挖掘機是不是真的比五月花屌?你希望get my hands dirty,卻發現根本沒有泥巴讓你玩耍,因為你在大連也沒有家。

噹噹噹噹~現在向你推薦一個傢伙的博客,直白的語言詼諧的配圖,智障如我也能看得明明白白,可謂實踐性極強,而且真正的裸寫各種邊邊角角,一向拒人千里的編譯原理彷彿被層層剝皮。你將學會如何用python編寫一個pascal解釋器(打不開是因為裡面引用了一段google analysis的js,直接終止載入就好了)

Let』s Build A Simple Interpreter. Part 1.ruslanspivak.com圖標

只是。。。這傢伙更新的實在太慢啦。等你把這個系列看完,敲完基本上就明白編譯前端是怎麼回事了,也大致明白了虎書上面前半部分在說什麼了(當然,我還是建議你直接跳過那一堆正則的章節)。看完這個教程之後,相信你已經按捺不住內心的激動,畢竟那些一跳三尺高動不動叫囂要你tokenizer,parser來一套的知乎約架黨應該能被你按在地面上摩擦、摩擦、似魔鬼的步伐,所以你大吼道「還有誰???」,說罷轉身拔出你那40米大刀準備怒剛一波龍書,且慢,我們做事情嘛講究的是一個循序漸進,畢竟像我們這種智障不比那些天賦異稟學會一隻兔子加一隻兔子之後就能積出曲面面積的人。所以隆重請出下一個系列lox language。

Crafting Interpreterswww.craftinginterpreters.com

這個系列相比上一個系列措辭要學術很多,專業術語也多了起來,沒有那種詼諧娛樂的風格會相對吃力。好在它完結了,擁有完整的函數,類,多態,控制流以及gc的實現。這個系列看完,虎書其實已經浮雲了。接下來,正面怒剛龍書?別別別,再把你40米屠龍刀插回去。接下來我建議你還是通過另一個項目來學習,它實現的短小精悍,帶有一個完整的虛擬機實現。可以編譯成位元組碼的pl0(pascal子集)實現。配合虎書後半章節+gdb一路調試來進行來學習,可謂事半功倍。

cwalk/PL0-Compilergithub.com圖標

在此之後嘛,勇敢的少年喲,去創造奇蹟吧!


個人覺得現在最好的書是 編譯器設計(第二版),中文版翻譯的很好。


Engineering a Compiler

三大浪漫現在已經基本上算屠龍技了,不會也不要強求自己


順便輪子哥博客三連,拿來入門挺好的

跟vczh看實例學編譯原理--零:序言

可配置語法分析器開發紀事(一)--構造語法樹

如何設計一門語言(一)--什麼是坑(a)


《Programming Language Pragmatics》

對應的中文版叫《程序設計語言——實踐之路》記得看第二版裘宗燕翻譯,第三版中文版翻譯是一坨屎。有能力看上面原版。


可以看些沒那麼難理解的書,比如

《自製編譯器》([日]青木峰郎)【摘要 書評 試讀】- 京東圖書item.jd.com圖標

或者這本:

《可變目標C編譯器:設計與實現》([美]克里斯多夫W.弗雷澤,[美]戴維 R.漢森)【摘要 書評 試讀】- 京東圖書item.jd.com圖標


IntelliJ IDEA SDK Docs 的

Custom Language Support 章節

先開發IDE,再開發編譯器。

這是墜吼的

開頭那張圖是我的語言的IntelliJ插件

https://github.com/lice-lang/lice-intellij

或者IntelliJ插件倉庫搜索「Lice」

我做了個視頻:http://www.bilibili.com/video/av18223568/


http://blog.csdn.net/xtlisk


LLVM歡迎您來實戰 http://www.zhihu.com/question/265322662

理論和學歷很重要,實戰更重要,見過龍三背得很溜的,所以show me your patch,讓benchmark說話 :)


隨便翻

野路子學

可以看看sicp

學學lisp,寫個闊以用的解釋器出來啊

或者輪子哥說的《函數式語言的實現》這一類的書

比如那啥。。。手擼遞歸下降parser之類的啊

不過編譯原理最重要的最難的不在parser

而是各種優化啊,像什麼常量摺疊,函數內聯之類的


LEMON語法分析生成器(LALR 1類型)源代碼情景分析item.jd.com圖標

把lemon的代碼全讀一遍。然後自己修改lemon/bison.


我的做法是看公開課+看書,然後實踐,跟著大佬的blog摸索...當然路子是這樣,還在摸索中。


LLVM每日談zhuanlan.zhihu.com圖標

我的一個專欄,記錄了自己摸索過程中的一些感悟和小知識點。希望能對你有幫助。


最近看了兩個在線的教程,算是稍微懂了一點。

一個是Peter Norvig的lispy

另一個是crafting an intepreter

希望有幫助


分頁阅读: 1 2