自己动手开发编译器(我们的朋友 -- 装配脑袋走了)
編者: 昨天在微信群里得知 我們的朋友--裝配腦袋(施凡老師),因白血病離我們而去,自從得病以來,施老師在積極的接受治療,8.27 得到的消息還是比較讓人開心的,大家都在期待著他能夠重出江湖。裝配腦袋一直在從事一個編譯器項目,在博客園的博客里有個系列《自己動手開發編譯器》,今天特意發一篇他寫的這個系列的序言,表達對他的敬意。
好久沒寫博客了,一來是自己懶,二來是最近一段時間都沒有做什么自己認為可以分享的東西。這幾天剛好重拾了一個一直打算做但沒做的編譯器類庫,算是積累了一點小小的經驗吧。本來我已經發到了Github上,也在微博上零星介紹了一些,但是我最終意識到,如果不寫一個詳細的文檔,別人就不能容易地學習、了解和使用它。甚至于我自己也可能會把這次研究出來的小小成果給忘了。所以,必須下決心動一動筆頭,也算是對老長時間不些博客的彌補吧。
本篇是系列的第零篇,我首先要介紹一下些這個系列的目的。從很久以來,編譯器的技術就是計算機科學的基礎。我想編程語言在大家軟件開發生活中的重要性不言而喻。那么,為什么我們需要了解編譯器內部的原理呢?有很多原因:首先,編譯原理是一門經過長期實踐完善的理論,它涵蓋了很多算法,都是非常經典的算法。從前端到后端,編譯器設計到的很多算法,都很強大、快速。比如我們經常要用到的正則表達式解析字符串的算法。通過學習編譯原理,可以更加深刻地理解和應用這些算法。比如明白正則表達式能夠表示何種語言,不能表示何種語言,何時性能最好,何時性能不好等,這樣就能夠在實踐中更加科學地加以采用。其次,我們處在一個編程語言爆發的時代,我們所熟悉的語言每個版本都有新特性,更不要說各種新型語言、腳本、DSL和其他基于格式化文本的協議層出不窮。掌握一些編譯原理的知識能讓我們在這個時代更具有主動性。大家都知道,老趙最近開發的Jscex,它給javascript引入了優美的異步編程模型。相信大家不僅想崇拜老趙,更想知道為什么他能開發出這種創新的技術吧?其實很多知識就來自于編譯原理。最后,我想說下我自己的學習目的。大家最近都知道C#5就快要出來了,在感嘆變化之快的同時,是否也有一絲遺憾,那就是自己心目中的語言特性還是沒有出現在C#5中呢?我相信各位有些人對編程語言的發展是感興趣的,那么就不要停留在對各個語言特性品頭論足的階段了,動手來實現自己心中的想法吧!只有實踐,才能知道自己的想法是不是對的,是不是有價值。實踐是最好的學習方式。我想各位起碼在大學期間都學過了編譯原理這門課程,但是還有許多實際問題值得挑戰,比如C#和VB等語言的源文件里支持中文,甚至變量和函數都可以用中文,那么怎么做才能在編程語言里支持中文?在大學學習的時候,也許沒有處理過面向對象語言,那么面向對象語言有什么不同?有很多重載方法的時候,如何挑選一個最合適的?甚至再進階一步可以考慮如何實現一個支持泛型的編程語言?Lambda表達式捕獲變量是怎么做到的等等。至于編譯器后端,那更是一個廣闊的話題,涉及的技術可能幫助你深入操作系統和硬件的內部。
在一般人眼里,編譯原理是個比較難掌握的理論體系。首先必須承認編譯器涉及的技術非常廣泛,每一種又可以非常深入,確實像個無底洞。所以這次我采用一個實際的例子,編寫一個簡單但具有基本功能的編程語言,在這個過程中逐個了解其中的技術。這樣就可以邊學習邊實踐。建議感興趣的同學跟著動手實踐,體會其中的樂趣。我并不會完全重復編譯原理書本中的理論,而是會面向對現代編譯器中的實際問題進行討論。我想讓我這個系列具有較高的實踐價值。
本系列將會圍繞我開發的一個編譯器開發庫——VBF.Compilers來進行。這個庫涉及編譯器前端各個階段所需要的工具,如詞法分析器、語法分析器的構造,以及讀取源文件、記錄編譯錯誤的輔助設施等。完全由我來開發。有人可能要問我為何不用些現成的工具,比如ANTLR之類的呢?首先這些現成工具都有一些小毛病,不能令我完全滿意;其次我的VBF與這些工具不同,它是一個純粹的類庫,只需要在VB或C#中引用,然后用VB或C#的語法來編寫,就可以寫出各種編譯器模塊來。比起依靠一堆工具框架的,我更喜歡類庫這種形式。另外我的類庫中也包含了我的一些小小創新,希望能給編譯器開發帶來一些方便。在這個系列里,我會兼顧VBF.Compilers的實現原理和其用法。大家如果想快一點實踐呢,可以直接使用我的類庫;如果不喜歡我的類庫呢,也可以自己實現或者用別的代替,總之看大家的興趣了。作為例子,我會在這個系列中實現一個C#語言的極小子集miniSharp,它的語法大家都再熟悉不過了,各位有興趣可以對其隨意擴展。
VBF.Compilers類庫和例子的源代碼已經全部上傳至Github:https://github.com/Ninputer/VBF? 請大家自行用git下載最新的代碼。(注,請別擔心,它雖然叫”VBF“但其實100%是C#開發的……)。 另外歡迎大家關注我的微博:http://weibo.com/ninputer?我會經常在上面播報開發狀態,另有許多其他豐富的信息~
好,那就請大家期待我這一系列的文章吧。
我有多想多想多想看一眼
你最后那天在我身邊
那熟悉的臉
我們再也看不到你的微博更新和GitHub代碼滾動,希望在天堂可以繼續用程序裝配腦袋,再用腦袋裝配程序
愿逝者往生,愿身邊的朋友健康平安
原文地址:http://www.cnblogs.com/Ninputer/archive/2011/06/06/2073908.html
.NET社區新聞,深度好文,微信中搜索dotNET跨平臺或掃描二維碼關注
總結
以上是生活随笔為你收集整理的自己动手开发编译器(我们的朋友 -- 装配脑袋走了)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 依赖注入的威力,.NET Core的魅力
- 下一篇: 微服务意味着分布式系统