在csdn上见到一篇文章,说的是计算机自动编程,原文链接为:
http://www.csdn.net/develop/Read_Article.asp?Id=27403
觉得有些意思,也来说说计算机自动编程。
首先,把程序员解脱出来,让计算机实现自动编程的想法,是很有意义的,也不完全是天方夜谈。据我所知,可操作的“自动编程”的概念,作为遗传程序设计GP的目标,已经在演化计算(智能计算的一种)中提出了;而且,在一些相对简单而却实用的领域,已经可以有很好的实践。如我们系的老师康立山教授所举的例子,他取三峡大坝岩石的数据,曾演化设计出一段程序,对其问题获得很好的模型。
如文中所言,或许未来真可以使程序员的身份转变,他们不再是“程序员”,而不得不成为“辅助程序员”;计算机可以自动编程,所以对于一般问题,只需购买一些自动编程组件(原文如此称呼之),让辅助程序员操作一定的接口就可以由计算机完成编程工作,而且比人做的更好。
然而,科学的“自动编程”概念,还处于刚刚提出的阶段,事实上目前所做的工作,还是在相对简单的问题领域上进行的。所依据的原理,所达到的成果,和我们的目标还有很大差距。如原文所言的大规模工程上的使用,还差之千里万里。
为什么如此呢?原文中并没有深入的谈。而说到如何实现“自动编程”,原文只是说需要人工智能的发展,并利用海量网络信息。但是,其中颇为艰辛呢。
我就从高级语言C++的编程谈起。
最简单的问题领域,我们取整数的加法、减法运算。比如下面的问题:
问题. 使用C++语言,编写程序模块完成对两个整数a与b求和。
程序员对其编程,就会完成如下的一个程序:
//compute the sum of a and b
int Sum(const int a,const int b)
{
return a+b;
}
程序员完成这个编程工作,一般思考步骤为:
1,对于该问题,所用到的数据结构是整型数,C++语言提供数据类型int。两个整数为a和b。
2,对于该问题,所用到的算法为整数相加求和,C++语言提供‘+’运算操作符。
3,对于该问题,程序员对模块进行设计,模块名为Sum,输入参数为const int a和const int b,返回类型为整型数。
显然,其中1与2是程序的核心,是传统意义上的程序定义。3是程序的结构,我觉得程序的结构也是非常重要的,尤其对于近年来,计算机软件的复杂度越来越高,注意设计良好的程序结构,是必然的要求。如对于本问题,使用“函数”设计模块当然是可以的,然而使用C++类来封装也未尝不可。
所以,对于计算机程序,目前我理解的概念是:
计算机程序 = 数据结构 + 算法 + 程序结构。
这个简单的问题,由计算机自动编程来实现是否能完成?
事实上,目前演化计算的“自动编程”,是启发于“计算机程序 = 数据结构 + 算法”的思想的。我们来看一看它对上述问题的解决。
对于该问题,建立计算机自动编程的基础——两个集合:
data = { a,b },op = { + }.
计算机自动编程所得到的程序,为data与op的一种关系,我们用字符串表示。如
s1 = aa+ ;// 即 s1 = a + a ;
现在对于一个字符串s,计算机便可以进行自动设计:
s = a ; // 尚未成功
s = aa; // 尚未成功
s = aa+; // 不合要求的程序,舍弃
s = a; // 尚未成功
s = a+; // 不合法的程序,舍弃
s = a; // 尚未成功
s = ab; // 尚未成功
s = ab+; // 程序成功,退出
换言之,计算机自动编程的程序,这里定义为
计算机程序 = data * op .
当然,获得一个合要求的计算机程序,不是一个枚举的过程。演化计算的方案是使用随机策略、通过演化获得好的程序。
data和op两集合,是自动编程的基础,可相对于问题的领域与复杂度而设计(好比程序员所需要的计算机语言复杂程度也不同一般)。比如,上述的data再加入两个整型变量x,y,就完全可以设计出和Sum模块功能相等的程序。如果data和op扩充如下:
data = { a0,a1,a2,...an,n,x },op = { +,-,* }.
其中x是实型变量,那么就可以由计算机自动编程来设计多项式逼近的程序。
而且,逻辑操作如if,else,还有循环操作,都可以加入到op集合中。那么,自动编程可解决的问题领域会更大。
然而,自动编程仍只是刚刚开始。说它要代替程序员的工作,还为时尚早。
首先,计算机自动编程是基于集合data和op的,这两个集合可比于计算机自动编程的语言,但这个语言还非常的不完善。对于个别的问题可以设计一个可行的语言,但大部分问题还没有办法找到合适的语言,更不用说设计出一个较为普遍的语言。而程序员所使用的计算机语言,则已到了相当完善的程度。而OO语言出现后,程序员可以设计自己的数据类型,计算机的自动编程目前是无法做到这一点的。
比如对于上面的问题,程序员可以设计一个数据类型对整数进行封装(我们不谈它对本问题的实际意义,很显然我们重视它的抽象意义):
//define new type :Integer
class Integer {
//...
public:
//...
};
由此,程序员对于现实世界进行建模的时候,表达工具(计算机语言)是相当得力的。然而计算机自动编程的data与op,对工程计算与简单逻辑判断,可以很好的建立模型,但在深度与广度上却远远落后于程序员。
其次,我觉得计算机程序的概念,必须要加入“程序结构”的因素;程序结构的因素,对于大规模工程应用具有重要的意义,而且是程序员智慧体现的精彩处。一个复杂问题的程序,糟糕的结构,往往是致命的。比如一个全局的指针对象,就会有太多的陷阱,能让设计不好的系统彻底瘫痪。然而好的结构则不然。另外,程序员充分利用“程序结构”上的经验,总结出好的设计模式,开发出性能良好的类库、程序框架,使得程序设计的继续得以良性循环。
但目前自动编程尚没有规划这方面的问题。一开始的定义,就是基于data与op的,而data*op的过程,目前由演化计算来做,就如处于汇编语言程序设计时期的程序员,可考虑的程序结构是很少的,只能拼命般的用聪明的脑袋对付问题的复杂度。
最后,当然是目前计算机的制约。就目前自动编程的主要问题,还是难以处理的复杂度。计算机本身性能的进一步提高,好的算法进一步开发,会使得自动编程进一步发展。但问题并非孤立的,解决问题的复杂度,当然也得考虑自动编程自身理论的发展,如突破上述的界限等。
原文中还提到利用网络信息资源,与计算机的学习能力,当然,这些步骤都是必然的。自动编程肯定要面临这些学科资源。但这涉及的问题更多。集中的说,网络和分布式系统,与人工智能,都要解决大量的问题,才可在工程上更充分进入自动编程的范围。目前来看,还是智能计算与自动编程关系最为紧密,也是主要的推动学科。
这里所说的,都是从软件的角度。原文另外提到跨系统(比如windows与UNIX)的自动编程,我想这个问题程序员更为头痛些。不妨更宽泛的说,由于偶然或必然的原因,计算机体系结构目前是多种多样的,自然程序员的编程都是基于某种体系结构的计算机。一个CISC机器的程序,在RISC机器上运行肯定有问题;那么在前者上编程(无论是程序员还是自动编程),如何无缝移植到后者上去,我想这就不仅是程序设计的问题了。
原文中提出“辅助程序员”的说法,我觉得很有意思。既然编程的工作,下放给计算机,那么辅助程序员就是要管理那些进行“自动编程”的计算机了,这有些项目经理的味道了。
很显然程序员在程序设计的时候,受软件工程上的一些规律制约。而这个过程的管理,是十分复杂的;大部分项目经理都有经验的。那么,如果多个计算机在“协同自动编程”的时候,又会是个什么样子?其中有那些规律可探讨?我想虽然计算机可以自动编程了,程序员从编程的工作中解脱了;但行业对人的要求并没有降低是吗?
或许应该说,时代在发展,行业对于人的要求,永远都是在提高的。
除非,人工智能彻底的成熟,机器和人具有一样的行为方式了。人或许可以休闲了。
那么,“辅助程序员”们,你们怕不怕?这个问题就不仅仅是行业内部问题了,计算机也要薪水的话,整个社会就会关注它了。