在我尝试着记录下这几天所学到的关于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节点中能出现的节点种类是无限制的,从而继不再有语法限制之后,不再有语言特征的限制了。你可以自己添加关键字,自己添加语言特性了。
posted on 2004-10-01 20:53  taowen  阅读(1157)  评论(0编辑  收藏  举报