对自动编程感兴趣,已经有2个多月了,想把这些想法在这里整理一下。
说叫自动编程,其实,能把编程的效率提高一个数量级就很不的了,就是找到了所谓的银弹,这个领域内的方法很多(Intentional programming, MDA, generative programming, language-oriented programming意图编程,模型驱动架构,产生式编程,面向语言编程),这个领域现在是世界性的热点。国外很多强手,都想有所突破。包括,开发了word 和excel原来微软的谁,谁,谁。。。开发了著名IntelliJ IDEA 的谁谁,谁,真是强手如云呀。但是,要看到word 、Intellij 这些东西,都是没有智能的软件。。。
要是Lisp 语言的开发者(人工智能的领军人物?我懒得去查了,我接触过他的论文。他对围棋软件有什么什么评价),来开发这个那真是令人生畏。。。
拉远点,先说人的行为和程序的关系,人的行为是什么?本质就是一步一步地做,如果说有一件事你不会做,那就是某一步,或某几不,你不知道是怎么做的,如果说,某个事情你会做,就是能把这个事情,分解成简单的行动方法(猩猩去取屋顶上挂的香蕉:先搬来一个箱子,再摞上一个箱子,爬上去,取到香蕉,放到嘴里。。。。),一步,一步,你都能做的来, 更复杂的是,你一边做,环境和情况同时在变化,怎么办?if 这个条件 {我就这么做}
Else {怎样,怎样}, 同样的事情一大堆怎么办? While(没完){重复做,if(情况有变){怎么怎么处理},再接照怎样怎样做},人在干事情的时候,脑袋里分明执行的就是一个程序。
不是吗?
再回头来说,自动编程,说是自动编程,你总得输入点什么,所以永远是半自动编程。输入的是什么,输入的是比我们所用的通用编程语言(象C、C++,C#)更高一级的,更抽象的指令集产生的结果可以是这些通用语言或直接就是机器语言。我们现有的通用语言的缺点是,程序员要在你的头脑中,把你的意思翻译成通用语言(C 之类),这个翻译过程就很不舒服,你不能有一点的含糊,和错误,前后的完整性一点问题也不能有,计算机没有丝毫的逻辑修补能力,所以这是一个及其费时、费力的交流过程。你可以用一会就能把一个程序向程序员交待清楚(如有语误和含糊,问题不大),和程序员交流的时候,你可以只说重点的和关键之处,而要开发这个程序(程序员向计算机交待清楚),可能好几个星期。人机交流的效率,如果用通用的开发语言,真是太低了。这是写程序,改程序更是这样,你先要找到已经“加密”(程序员就是加密者)在程序里的意图(intentional programming),然后把你的意图影射到通用的语言(例如C)里,也是耗力的过程(即使你有文档的帮助,大部分的时候文档又不能及时同步)
所以我们编程序的时候,希望的是输入计算机的是更高级抽象语言,而不是现在效率低的通用语言。通用语言的语句也好,函数也好,都是一些具体的指令或指令集,特点是没有丝毫含糊之处,这样用起来对人脑的压力在有的时候就很大。我们想找到的高级抽象语言(Intentional programming, generative programming, language-oriented programming这些东西的目标)就一定要具更高抽象度,和模糊的特点。否则你如果要说的清清楚楚,明明白白,一点都不拉,这不就是通用语言吗?(C, C++,C#等)如果你要叫一个人某个事情,对方又毫无知识背景,这时候的交流,就很象和机器的交流了(碰到情况就怎样是:if(XXX) 就去做YYY。 碰到需要重复的就是: WHILE(没做完){。。。。。。。。}。 对语言来说,所谓的抽象必然导致模糊(没有全说,有的地方必然安默认的方式处理,还有的地方要背景知识来修补逻辑)。这种抽象的语言(也可以说是一种银弹---在什么什么时间里把软件的开发效率提高一个数量级)的语句到底要表达的是什么?也可以叫它为意图(intentional programming),说到底是任务,计算必须有能力把交给它的任务,分解成子任务。。。最后到可执行的机器码。这种把高层次的任务,逐步分解的能力,也是机器人所应具备的,一个领域的突破会导致另一个领域的突破。告诉计算机一步一步做是有计算机以来所有语言的特色。而纯基于目的或任务的计算机语言一直也没有出现,为什么?也不可能出现,当人和人交流的时候,对方如果毫无知识背景,你说的话,也就很类似现在的计算机语言了,人把自己的 数学思考,一定要表达成语言的话,现在的计算机语言也是不错的选择。人交流的时候,有背景知识,常识,以及众多的词汇。
DSL(领域专用语言)怎么样? 先搞一个META-DSL开发环境,你如果要在某一领域开发,先用这个开发环境开发一个 DSL(或用别人的),再用DSL开发你要的东西,听起来很诱人(听说有有了不少成功的DSL)。但一个明显的问题就是部分开发是跨领域的,问题好像不能轻易解决。
现有的基于模块的开发系统怎么样?genexus有很长的开发历史,用它开发企业应用不需要编程, speed designer等等 (自动生成部分asp.net程序),这些东西都不理想。每个模块你如果想增加更能,只能求助于现有的编程语言,如果谁搞出一个基于模块(类库?)+抽象语言+开发环境(IDE),而且模块(类库)的扩展(功能扩展!)和创建,都完全依赖于这种抽象语言。另外用这个系统也能够构建出和本身IDE类似的IDE,实在是一个进步。我想这种抽象的语言如果构造出来,里边现有的通用语言的影子是挥之不去的。能用OlivaNova(一种自动商用软件代码生成系统能构造出其本身的各个模块(OlivaNova modeler 之类)吗?功能限制明显在这里嘛,什么叫商用软件? 外延是没有边界的。我想如果发明出来,这种抽象的语言里边现有的通用语言的影子是挥之不去的。就像我说的,当对方没有知识背景的时候,人的语言就很近似于现在的计算机语言了。好了,累了,以后接着写。想说的还有很多。QQ:67892551 MSN:hnlee65@hotmail.com http://blog.csdn.net/hnlee65/ 保留版权,可以完整转载。