在我嘗試著記錄下這幾天所學到的關于Intentional Programming的一些東西之前,請先允許我表示一些感謝:
首先,感謝Intentional Programming的發明者,Charles Simonyi
然后,感謝Generative Programming一書的作者,以及譯者
最后,感謝易語言的發明者,吳濤
OK,The play begin
這些天突然對編譯原理感興趣了,也許是受到了myan的影響吧,想著補補計算機科學的基礎了。看了一兩頁編譯也沒多少收獲,于是想著自己是不是要弄一個什么比較酷的東西,just like MOOP。看看,AOP,看看,Context Bound Component。在決定要做些什么之后,去了一趟書店,發現了一本以前想買但是又嫌貴的書,《產生式編程》
研讀了幾章之后,我就發現了其中我最感興趣的章節了,第十一章,意圖編程(Intentional Programming)。因為我想做一些酷的東西出來,說到底就是想玩玩語言特征的組合什么的。而意圖編程就正好是做這樣的游戲的最佳平臺。當然,意圖編程又正好和徐昊一直鼓吹的元數據和MDA一路走得非常相近,更巧的是我在易語言身上發現了意圖編程的潛力或者說影子。于是乎,我與意圖編程,相愛了。
這大概能歸納這幾天的思路走向了。先是想學一點計算機的基礎,然后又不安分的想自己動手做一些語言方面的實現和游戲,然后買了《產生式編程》這本書,然后與意圖編程墜入愛河。下面就來描述一下女主角的樣子和為什么她如此誘人。
傳統的計算機語言的編譯過程大概如斯:讀入文本源代碼->詞法語法解析->抽象語法樹->語義分析->代碼生成。而按意圖編程,第一個突破之處就是揚棄了抽象語法樹之前的部分,也就是說直接對抽象語法樹編程,而沒有了文本形式的源代碼,沒有了語法解析,甚至可以說沒有了語法。
要講明白這樣對抽象語法樹的編程是如何進行的,最佳的實際演示是易語言。對于這一點,說實話,我自己都大吃一驚。雖然我當年曾經是易語言的總斑竹,但那都是高中時代的事情了,無論如何我都不否認從專業的眼光來看,易語言就是玩具。不過這次,我發現了易語言的閃光點了。我帖一張圖上來,大家就明白什么是對抽象語法樹編程了:

這是一個易語言IDE顯示源代碼時截圖。你可以看到,用表格的形式表示出了AST(抽象語法樹),而不是文本+文法的形式。從這點上來說,易語言是脫離了語法的,也是它為什么能用中文來寫程序的原因。而不是大家想象的那樣是改進了文法解析,讓parser支持了中文。
OK,這是第一步,對AST編程,而不是對Source Code編程。但是這并沒有看到什么實際上的好處,不是嗎?呵呵,是的。
現在來具體挖掘這樣做的好處。首先一個好處是,語言的設計者不需要挖空心思的設計語法了,因為不再存在語法了。而且所謂的Syntax Sugar也就不存在了,語言更加回歸本源,語言之間的爭斗就沒法在語法上簡潔一些花哨一些上斗法了。
然后一個好處是代碼的表現可以任意的酷了,可以看到表格來現實變量聲明,沒問題。用矩陣的樣子來顯示二維數組,也沒問題。現實偏微分方程什么的,都可以的。輸入也可以變得很自由。還是以易語言為例子,你輸入rg,它就可以顯示出如果出來,而且兩條分支的代碼路徑也給顯示出來了。而且你還可以輸入if,效果和rg是一樣的。
再一個好處是如果形成了標準的API,那么對于源代碼進行處理的工具,比如版本控制(不同版本文件的合并),就可以直接獲取AST,不需要重寫一遍parser了,這將是一個極大的功能與成本比的提高。
還有就是大家常說的重構了,現在要做重構就很容易了。比如就易語言吧,這么玩具的東西都支持最簡單的重構,改名。你在里面只要改一處名字,所有相關的引用都一并修改了,這就是因為AST中定義和引用是互相知道的,形成了一張graph。對于定義的修改,所有引用的也都改過來了(因為只是一個指向而已嘛)。
可見,Intentional Programming僅僅在其第一個突破上,就獲得了如此多的好處,何其可貴。btw,Charles Simonyi是第一個所見即所得編輯器的作者,也是WORD之父,可見提出這樣的代碼編輯方式是非常正常的。
接下來是Intentional Programming真正能體現其名稱意義的突破了,那就是Intention的引入。先不說Intention吧,先來看看有了第一步的工作之后,程序是什么樣子的吧。在面向了AST編碼之后,程序的形式就是一顆樹了。而樹的節點是什么?應該對應的是語言中的一些概念,比如If the else這樣的代碼塊,或者+-*/這樣的表達式。一個語言的構成除了文法之外,最重要的就是這些文法標識出來這些關鍵字,操作符了。但是你有沒有想過,為什么一個語言的關鍵字的語義是固定的,而又為什么關鍵字是不能擴充的,而又為什么我們不能擴充已經有的語言,而又為什么不能有一個平臺給我們發明自己的語言并賦給其我們希望的語義?OK,這就是Intentional Programming的第二個偉大的突破了。她揚棄了寫死關鍵字操作符的形式,并且用Intention來一統天下。如何一統天下,這是最難解釋的部分,也是最復雜的一部分。
多說無益,用圖來說明問題:

看到了嗎?以前int,while這樣的節點的含義是由編譯器來解釋的,因而是固定的,沒法擴充的。而現在,這些節點是引用到了它們的定義節點,而這些定義就是intention,而具體int,while在語句中的出現就是intention 的instance。由于intention不是寫死在編譯器中的,是以intention庫的形式提供的,也就是說AST節點中能出現的節點種類是無限制的,從而繼不再有語法限制之后,不再有語言特征的限制了。你可以自己添加關鍵字,自己添加語言特性了。
首先,感謝Intentional Programming的發明者,Charles Simonyi
然后,感謝Generative Programming一書的作者,以及譯者
最后,感謝易語言的發明者,吳濤
OK,The play begin
這些天突然對編譯原理感興趣了,也許是受到了myan的影響吧,想著補補計算機科學的基礎了。看了一兩頁編譯也沒多少收獲,于是想著自己是不是要弄一個什么比較酷的東西,just like MOOP。看看,AOP,看看,Context Bound Component。在決定要做些什么之后,去了一趟書店,發現了一本以前想買但是又嫌貴的書,《產生式編程》
研讀了幾章之后,我就發現了其中我最感興趣的章節了,第十一章,意圖編程(Intentional Programming)。因為我想做一些酷的東西出來,說到底就是想玩玩語言特征的組合什么的。而意圖編程就正好是做這樣的游戲的最佳平臺。當然,意圖編程又正好和徐昊一直鼓吹的元數據和MDA一路走得非常相近,更巧的是我在易語言身上發現了意圖編程的潛力或者說影子。于是乎,我與意圖編程,相愛了。
這大概能歸納這幾天的思路走向了。先是想學一點計算機的基礎,然后又不安分的想自己動手做一些語言方面的實現和游戲,然后買了《產生式編程》這本書,然后與意圖編程墜入愛河。下面就來描述一下女主角的樣子和為什么她如此誘人。
傳統的計算機語言的編譯過程大概如斯:讀入文本源代碼->詞法語法解析->抽象語法樹->語義分析->代碼生成。而按意圖編程,第一個突破之處就是揚棄了抽象語法樹之前的部分,也就是說直接對抽象語法樹編程,而沒有了文本形式的源代碼,沒有了語法解析,甚至可以說沒有了語法。
要講明白這樣對抽象語法樹的編程是如何進行的,最佳的實際演示是易語言。對于這一點,說實話,我自己都大吃一驚。雖然我當年曾經是易語言的總斑竹,但那都是高中時代的事情了,無論如何我都不否認從專業的眼光來看,易語言就是玩具。不過這次,我發現了易語言的閃光點了。我帖一張圖上來,大家就明白什么是對抽象語法樹編程了:
這是一個易語言IDE顯示源代碼時截圖。你可以看到,用表格的形式表示出了AST(抽象語法樹),而不是文本+文法的形式。從這點上來說,易語言是脫離了語法的,也是它為什么能用中文來寫程序的原因。而不是大家想象的那樣是改進了文法解析,讓parser支持了中文。
OK,這是第一步,對AST編程,而不是對Source Code編程。但是這并沒有看到什么實際上的好處,不是嗎?呵呵,是的。
現在來具體挖掘這樣做的好處。首先一個好處是,語言的設計者不需要挖空心思的設計語法了,因為不再存在語法了。而且所謂的Syntax Sugar也就不存在了,語言更加回歸本源,語言之間的爭斗就沒法在語法上簡潔一些花哨一些上斗法了。
然后一個好處是代碼的表現可以任意的酷了,可以看到表格來現實變量聲明,沒問題。用矩陣的樣子來顯示二維數組,也沒問題。現實偏微分方程什么的,都可以的。輸入也可以變得很自由。還是以易語言為例子,你輸入rg,它就可以顯示出如果出來,而且兩條分支的代碼路徑也給顯示出來了。而且你還可以輸入if,效果和rg是一樣的。
再一個好處是如果形成了標準的API,那么對于源代碼進行處理的工具,比如版本控制(不同版本文件的合并),就可以直接獲取AST,不需要重寫一遍parser了,這將是一個極大的功能與成本比的提高。
還有就是大家常說的重構了,現在要做重構就很容易了。比如就易語言吧,這么玩具的東西都支持最簡單的重構,改名。你在里面只要改一處名字,所有相關的引用都一并修改了,這就是因為AST中定義和引用是互相知道的,形成了一張graph。對于定義的修改,所有引用的也都改過來了(因為只是一個指向而已嘛)。
可見,Intentional Programming僅僅在其第一個突破上,就獲得了如此多的好處,何其可貴。btw,Charles Simonyi是第一個所見即所得編輯器的作者,也是WORD之父,可見提出這樣的代碼編輯方式是非常正常的。
接下來是Intentional Programming真正能體現其名稱意義的突破了,那就是Intention的引入。先不說Intention吧,先來看看有了第一步的工作之后,程序是什么樣子的吧。在面向了AST編碼之后,程序的形式就是一顆樹了。而樹的節點是什么?應該對應的是語言中的一些概念,比如If the else這樣的代碼塊,或者+-*/這樣的表達式。一個語言的構成除了文法之外,最重要的就是這些文法標識出來這些關鍵字,操作符了。但是你有沒有想過,為什么一個語言的關鍵字的語義是固定的,而又為什么關鍵字是不能擴充的,而又為什么我們不能擴充已經有的語言,而又為什么不能有一個平臺給我們發明自己的語言并賦給其我們希望的語義?OK,這就是Intentional Programming的第二個偉大的突破了。她揚棄了寫死關鍵字操作符的形式,并且用Intention來一統天下。如何一統天下,這是最難解釋的部分,也是最復雜的一部分。
多說無益,用圖來說明問題:
看到了嗎?以前int,while這樣的節點的含義是由編譯器來解釋的,因而是固定的,沒法擴充的。而現在,這些節點是引用到了它們的定義節點,而這些定義就是intention,而具體int,while在語句中的出現就是intention 的instance。由于intention不是寫死在編譯器中的,是以intention庫的形式提供的,也就是說AST節點中能出現的節點種類是無限制的,從而繼不再有語法限制之后,不再有語言特征的限制了。你可以自己添加關鍵字,自己添加語言特性了。
浙公網安備 33010602011771號