《編譯原理》學習心得
前言
由於工作原因需要涉及到做一個程式碼翻譯器 (ActionScript3轉TypeScript),由此記錄和分享一下工作中的一些心得。如果你恰巧也需要做一個Lua轉JavaScript或者其它語言的轉換,本文或許可以給你一些提示或幫助。
翻譯器涉及的核心技術是編譯技術,這方面的書籍很多,有名的龍書、虎書、鯨書,我主要是參考了龍書《編譯原理》這本。簡單說說我讀完前面幾章(只包含編譯器前端)的感受:概念比較多(重要的概念記住就行,沒幾個),演算法不算很多(大概6個),演算法部分不夠詳細(幾行虛擬碼,有得演算法實現起來幾百行),一堆的理論。實用性很高,但是由於不夠詳細,實現的時候細節部分(比如可以推出空的非終結符如何處理)需要在理解演算法原理的基礎上再去寫才能寫正確。
乾貨
要自己實現一個編譯器有兩種選擇,第一種是自己實現所有的部分,包含編譯器的生成工具、編譯器的執行部分、語法規則表。第二種跟第一種的差別是編譯器的生成工具是不需要自己寫的,可以利用現有的專案,如gcc。我是選擇了第一種,全部都自己搞,這樣也可以理解的更深刻些。
編譯器的前端現在看來(被提煉之後)主要講得就是幾個概念和六個演算法。
概念: 詞法分析器、語法分析器、正規表示式、NFA、DFA、詞法單元、語法樹
演算法:1) 正規表示式 轉 NFA (詞法分析)
2) NFA 轉 DFA (詞法分析)
3) 最小化DFA狀態數 (詞法分析)
4)構造 LR0 語法 (語法分析)
5)構造 LR1 語法 (這一步只需要看,可以不用實現) (語法分析)
6)構造 LALR1 語法 (語法分析)
具體實施的話,大概需要如下步驟:
1. 購入一本編譯原理的書籍,首推《編譯原理》第三版。(別的虎書,鯨書可以百度搜尋下區別,我也沒看過,沒有發言權)
以下以《編譯原理》這本書為例,列出餘下步驟。
2. 跳過第一章,直接進入第二章(一個簡單的語法制導翻譯器),這一章不需要完全看懂,只要瞭解大概的過程和一些概念即可,至少要知道編譯器的前端是由兩個核心組成(詞法分析器和語法分析器)即可。這一章也不需要手動練習什麼。
3. 進入第三章(詞法分析),3.1 - 3.2節看看即可(瞭解有這麼一回事),學習後面的部分,可以先在草稿上演算,然後再寫成程式碼。
4. 進入第四章(語法分析),4.1 - 4.6都只需要看一下,如果有時間可以在草稿上演算LL語法分析器,重點是4.7 - 4.9,這部分也需要在草稿上進行大量的演算,特別是寫演算法的時候,需要跟演算同時進行,有時候想不通就拿個實際的例子打打草稿,基本上都是邊寫演算法邊打草稿的節奏。
5. 第五章可以不用怎麼看,如果你知道語法分析的過程中怎麼生成語法樹和處理語法結構(其實就是寫在YACC配置檔案後面的補充程式碼),這一章可以不用看。
6. 把源語言的語法結構理清楚,整理成一張圖,比如AS3的語法結構圖:(這個圖並不完全)
像這樣把語法結構先理清楚後,詞法分析中的正規表示式如何寫,以及語法分析器的語法規則如何寫已經一清二楚了。
之後就是前端的其它部分了,沒有統一的規則,大概就是把語法結構存起來之後逐步分析每一個表示式,分析出每一個表示式的型別,型別檢查等等。最後就是列印了,生成想要的語言格式。
最後附上我自制的《編譯原理》PPT,沒有弄完,弄了詞法分析部分,語法分析沒怎麼弄。http://download.csdn.net/detail/jiexiaopei_2004/8927671
相關文章
- 學習編譯原理的步驟編譯原理
- 編譯原理第二章學習總結編譯原理
- JS學習系列 01 - 編譯原理和作用域JS編譯原理
- 0909 關於編譯原理學習的想法編譯原理
- 0909初學編譯原理編譯原理
- 編譯原理編譯原理
- 學習心得
- 學習心得 TCP/IP攻擊原理分析總結TCP
- 【編譯openjdk學習筆記】編譯JDK筆記
- 學習Ant編譯指令碼編譯指令碼
- Flutter 編譯原理Flutter編譯原理
- 編譯原理概述編譯原理
- JAVA反編譯技術研究心得Java編譯
- Redis 學習心得Redis
- Github學習心得Github
- Django學習心得Django
- git學習心得Git
- Lotus學習心得(-)
- php學習心得PHP
- Guice學習心得GUI
- JavascriptAST編譯器的研究學習JavaScriptAST編譯
- 【編譯原理複習Part_2】語法分析編譯原理語法分析
- Typescript編譯原理(一)TypeScript編譯原理
- 編譯原理概覽編譯原理
- Vue 模板編譯原理Vue編譯原理
- 白話編譯原理編譯原理
- 跟vczh看例項學編譯原理——零:序言編譯原理
- Linux學習心得Linux
- APScheduler 學習心得
- Vue學習心得(1)Vue
- java實習生學習心得Java
- ZYNQ學習筆記(一): uboot 編譯筆記boot編譯
- 編譯實踐學習 Part5編譯
- 編譯實踐學習 Part1編譯
- 編譯實踐學習 Part2編譯
- [心得]Mac下編譯thrift踩坑總結Mac編譯
- 想成為首席軟體工程師?請放下編譯原理來學習彈性工程!軟體工程工程師編譯原理
- 模板函式編譯原理函式編譯原理