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