序三
在武俠小說中,“天下武功出少林”,少林寺的“七十二絕技”名揚天下。但是真正能學會并掌握七十二絕技的人屈指可數,主要原因是學習周期太長。以七十二絕技中的“一指禪”為例,據說五代時期的法慧禪師花費36年學成,排名第一;南宋的靈興禪師花費39年學成,排名第二;而韋爵爺的澄觀師侄花費42年學成,排名第三。如果一項絕技真的需要幾十年甚至上百年的時間才能掌握,那么只能說明這項絕技沒有實用價值,或者學習它的人沒有掌握科學的學習方法。
其實少林寺的七十二絕技是有科學、高效的學習方法的,這個方法由《天龍八部》中的鳩摩智發現并實踐。鳩摩智經過研究發現,少林寺的七十二絕技招式雖然厲害,但是其內部的“驅動引擎”性能極低(預熱就需要幾十年時間),而稍微強一點兒的“易筋經引擎”又涉及知識產權問題不對外開放授權,因此,如何為七十二絕技定制一個合適的“內功”驅動引擎就成了一個關鍵問題。經過不懈努力,鳩摩智終于發現可以將“逍遙派”的“小無相功”作為驅動七十二絕技的內功引擎,從而開辟了一條武學“彎道超車”的新捷徑。
在軟件開發領域同樣存在幾個“圣地”——數據庫、操作系統和編譯器,其中編譯器的開發技術被稱為軟件開發的“屠龍之技”,號稱“龍書”的《編譯原理》的封面正是一個騎士在和巨龍搏斗的畫面。
編譯器開發的相關理論類似于武俠小說中的“內功心法”,編譯器界面的編程語言類似于少林寺的七十二絕技:二者都名揚天下,但學習周期太長,真正能夠熟練掌握的人屈指可數。普通程序員以傳統方式從頭發明或實現一整套實用的編程語言難于登天:不僅要學習涉及諸多編譯方面的理論,還要通過大量的編碼工作解決各種細節問題。自制編程語言愛好者不只是想要掌握“龍書”的理論,更想要有一門自己可控的編程語言,因此我們同樣需要尋找一條自制編程語言的捷徑。
Go語言作為一門將自身的編譯器內置到標準庫的主流通用編譯型編程語言,其與語法樹相關的包的設計與實現堪稱編程藝術和編譯理論相結合的典范,是“Unix之父”等老一輩軟件工程師畢生的藝術結晶。Go語言的語法比較簡單(只有25個關鍵字),非常適合作為自制編程語言的基礎參考語言。開源社區已經從Go語言語法樹發展出了諸多擴展語言:GopherJS項目將Go語言帶入了前端開發領域,TinyGo則將Go語言帶入了單片機等微系統的開發領域,國內的七牛公司針對數據科學領域定制了Go+語言。這些基于Go語言的定制語言的一個共通之處就是都基于Go語言語法樹進行再加工處理。因此,只要能熟練掌握Go語言語法樹的使用方法,就能跨過繁雜的詞法分析、語法分析等步驟,直接使用“龍書”中的高深理論,進入語言特性定制領域。這將極大地降低自定義編程語言的門檻。
為了真正開啟自制編程語言的旅程,同時讓Go語言語法樹真正落地產生生產力,本書最后引入了我們定制的凹(讀音“wā”)語言。凹語言的定制過程類似于自己組裝一臺計算機,在語言能夠獨立工作前并不自己創造新的核心模塊,而是基于已有的軟件模塊進行改造和拼裝,最終得到的依然是自主可控的語言。在語言可以初步工作之后,可以進一步根據需求優化局部細節或者對語言的語法做局部的重新設計,這樣語言的每個階段的實現難度都不會很大。我們的目標不只是制造一門“玩具語言”——凹語言的語法樹解析和語義分析都是工業級的,如果我們可以在后端接入LLVM,就很容易將其進一步改造為實用的編程語言。
隨著計算機的普及,我國程序員已經在追趕并緊跟世界前沿技術的發展。但是,目前與最古老的編程語言/編譯相關的技術圖書還停留在講述幾十年前的理論或者講述如何構建一些缺乏實用價值的玩具語言階段,理論和實踐嚴重脫節。與經典著作“龍書”相比,“龍書”深刻地講解了編譯技術用到的理論知識;而本書立足于理論與實踐的結合,教授讀者利用現成的工具,快速創建一門實用的編程語言。希望本書可以為我國編程語言和編譯器的自主化提供力所能及的幫助。
最后,希望各位讀者能夠定制自己的編程語言,并使用定制的語言快樂地編程。
柴樹杉
螞蟻集團高級軟件技術專家
- C程序設計簡明教程(第二版)
- Mastering Natural Language Processing with Python
- Node Cookbook(Second Edition)
- Node.js從入門到精通
- SEO教程:搜索引擎優化入門與進階(第3版)
- Java高手是怎樣煉成的:原理、方法與實踐
- Python數據可視化之matplotlib實踐
- 計算機軟件項目實訓指導
- Learning Redis
- F# for Machine Learning Essentials
- R語言數據處理及可視化分析
- INSTANT Fancybox
- PHP程序設計
- Python數據結構與算法分析(第2版)
- Harbor權威指南:容器鏡像、Helm Chart等云原生制品的管理與實踐