《編程語言實現(xiàn)模式》旨在傳授開發(fā)語言應用(工具)的經(jīng)驗和理念,幫助讀者構建自己的語言應用。這里的語言應用并非特指用編譯器或解釋器實現(xiàn)編程語言,而是泛指任何處理、分析、翻譯輸入文件的程序,比如配置文件讀取器、數(shù)據(jù)讀取器、模型驅動的代碼生成器、源碼到源碼的翻譯器、源碼分析工具、解釋器,以及諸如此類的工具。為此,作者舉例講解已有語言應用的工作機制,拆解、歸納出31種易于理解且常用的設計模式(每種都包括通用數(shù)據(jù)結構、算法、策略)。雖然示例是用Java編寫的,但相信讀者可以觸類旁通,利用這些設計模式構建針對其他編程語言(既包括特定領域語言,也包括通用編程語言)的應用。
雖然《編程語言實現(xiàn)模式》不專門討論如何設計編程語言,但讀者在閱讀的過程中將吸收豐富的相關知識。比較不同編程語言的特點、了解編程語言的發(fā)展歷史是學習設計編程語言的好途徑。
隨著你不斷編寫語言應用,這個過程中所蘊涵的模式就會逐漸變得清晰而明朗。其實,大多數(shù)的語言應用在架構上都是相似的。每次編寫語言應用的時候,我都不斷告訴自己:“先建立解析器,用它在內(nèi)存中把數(shù)據(jù)結構建立起來。然后從中抽取信息,必要時還要改變其結構。最后再寫一個能根據(jù)這些信息自動輸出代碼或者報告的工具”?窗,這不就是模式?在這些任務中總能發(fā)現(xiàn)一些相似的算法和數(shù)據(jù)結構。
一旦掌握了這些語言實現(xiàn)的設計模式或者架構,編寫起語言應用來就得心應手了。如果你想快速掌握編寫語言應用的能力,這本書正適合你。本書奉行實用主義,從本質(zhì)上挖掘并提煉語言應用中的設計模式。你會了解模式的重要性,學習如何實現(xiàn)這些模式,如何組合這些模式。很快你就能成為開發(fā)語言應用的行家里手!
創(chuàng)造新的語言其實不需要深厚的理論知識做鋪墊。你可能不信,畢竟所有語言應用方面的書都會占用大量的篇幅講解編譯器知識。我承認,為通用編程語言編寫編譯器確實需要扎實的計算機科學知識。然而,大多數(shù)程序員并不需要編寫這種編譯器。因此本書的重心是解決程序員平時最可能遇到的問題:配置文件讀取、數(shù)據(jù)讀取、模型驅動的代碼生成、源代碼之間的翻譯、源代碼分析和解釋器的實現(xiàn)。同理,我們沒有使用Scheme等學術界推崇的語言,而是跟隨業(yè)界的發(fā)展采用Java編寫所有的示例,以便你能快速地在實際項目中大顯身手。
Terence Parr是美國舊金山大學的計算機教授、研究生導師,他一直致力于從事ANTLR項目(antlr.org)和模板引擎(stringtemplate.org)的設計和開發(fā)工作。Terence曾擔任IBM、洛克希德馬丁、Next、雷諾汽車等公司的技術顧問,另著有《ANTLR權威指南》。
第1部分 讀取輸入
第1章 初探語言應用
1.1 大局觀
1.2 模式概覽
1.3 深入淺出語言應用
1.4 為語言應用選擇合適的模式
第2章 基本解析模式
2.1 識別式子的結構
2.2 構建遞歸下降語法解析器
2.3 使用文法DSL來構建語法解析器
2.4 詞法單元和句子
第3章 高階解析模式
3.1 利用任意多的向前看符號進行解析
3.2 記憶式解析
3.3 采用語義信息指導解析過程
第2部分 分析輸入
第4章 從語法樹構建中間表示
4.1 為什么要構建樹
4.2 構建抽象語法樹
4.3 簡要介紹ANTLR
4.4 使用ANTLR文法構建AST
第5章 遍歷并改寫樹形結構
5.1 遍歷樹以及訪問順序
5.2 封裝訪問節(jié)點的代碼
5.3 根據(jù)文法自動生成訪問者
5.4 將遍歷與匹配解耦
第6章 記錄并識別程序中的符號
6.1 收集程序實體的信息
6.2 根據(jù)作用域劃分符號
6.3 解析符號
第7章 管理數(shù)據(jù)聚集的符號表
7.1 為結構體構建作用域樹
7.2 為類構建作用域樹
第8章 靜態(tài)類型檢查
第3部分 解釋執(zhí)行
第9章 構建高級解釋器
9.1 高級解釋器存儲系統(tǒng)的設計
9.2 高級解釋器中的符號記錄
9.3 處理指令
第10章 構建字節(jié)碼解釋器
10.1 設計字節(jié)碼解釋器
10.2 定義匯編語言語法
10.3 字節(jié)碼機器的架構
10.4 如何深入
第4部分 生成輸出
第11章 語言的翻譯
11.1 語法制導的翻譯
11.2 基于規(guī)則的翻譯
11.3 模型驅動的翻譯
11.4 創(chuàng)建嵌套的輸出模型
第12章 使用模板生成DSL
12.1 熟悉StringTemplate
12.2 StringTemplate的性質(zhì)
12.2 從一個簡單的輸入模型生成模板
12.4 在輸入模型不同的情況下復用模板
12.5 使用樹文法來創(chuàng)建模板
12.6 對數(shù)據(jù)列表使用模板
12.7 編寫可改變輸出結果的翻譯器
第13章 知識匯總
13.1 在蛋白質(zhì)結構中查找模式
13.2 使用腳本構建三維場景
13.3 處理XML
13.4 讀取通用的配置文件
13.5 對代碼進行微調(diào)
13.6 為Java添加新的類型
13.7 美化源代碼
13.8 編譯為機器碼
參考文獻
索引