6.6、智能时代软件发展
天下事物发展一分为二,软硬件技术也不例外,第二次工业革命电磁理论,石破天惊,在后期推动了计算机技术的进步。为第四次科技革命的发展做好了硬件的铺垫。在硬件大力发展背后,智能时代软件的号角吹响了。
人类在智能科技方面的探索没有终点,也很难找到起点。人工智能探索过程中,软件方面有着天翻地覆的变化,下面从编程语言、运算平台、机器学习库等方面分别进行阐述。
6.6.1、人工智能编程语言
人工智能编程语言是一类适应于人工智能和知识工程领域的、具有符号处理和逻辑推理能力的计算机程序设计语言。能够用它来编写程序求解非数值计算、知识处理、推理、规划、决策等具有智能的各种复杂问题。
事实上,已经有多种对应于各种不同知识表示方式的人工智能编程语言。按所对应的知识表示方式不同。可以区分为以下几类:
A、对应于产生式规则知识表示的语言。例如,由美国卡耐基·梅农大学的C·L·福基(C。L。Forgy)等人1977年开发的OPS(official production system),当时用它来为DEC公司开发了一个解决VAX计算机系统配置问题的专家系统X1/XCON。
B、对应于逻辑公式知识表示的语言。一种已广为应用的逻辑语言就是PROLOG。1970年由法国马塞大学的 A。柯迈豪埃(Alain Colmerauer)所开发的。
C、对应于框架或语义网知识表示的语言。这是“面向对象”的(object-oriented)语言。其中一个有代表性的语种就是Smalltalk。1980年首创,后来版本不断更新。
D、对应于函数知识表示或函数式程序设计风格的语言的列表处理语言。函数式编程语言,理论上很完美,建立在坚实的数学基础之上,对于人工智能问题,在常规计算机上很难实现。20世纪50年代末,麻省理工学院的约翰·麦卡锡等人首先开发的列表处理语言LISP(LISt Processing)迄今仍然广泛用于编写人工智能应用程序,特别是用于开发专家系统。
人工智能编程语言有共同特点,语言都面向要解决的问题、结合知识表示、完全脱离当代计算机的诺依曼结构特性而独立设计的;处于比面向过程的高级编程语言更高的抽象层次。
用这些语言编写的程序,在现代计算机环境中,无论是解释或编译执行,往往效率很低。尤其程序规模很大、复杂时,浪费大量系统资源,系统性能往往会下降到难以容忍的地步。
6.6.1.1、LISP
20世纪50年代后期,麻省理工学院的John McCarthy就开始了人工智能的研究,当时致力于设计一个用表处理的递归系统,在20世纪60年代初研制出了LISP语言。
LISP语言是一个用于处理符号表达式的、相当简单的函数式程序设计语言,以数学中的函数与函数作用的概念作为设计原理,奠定了函数式语言的基础。
LISP语言是完全非von Neumann风格的,它没有使用ALGOL60等语言中所采用的可修改变量、赋值语句、转向语句等von Neumann结构语言中的有关概念。LISP程序与其数据结构采用了相同的结构形式与处理方式。
LISP方便地编写解释程序。LISP语言除了用s一表达式来统一处理数据与程序外,还引入了前缀运算符表示法、递归数据结构、递归控制结构以及新的条件表达式形式。
6.6.1.2、Prolog
Prolog(Programming in Logic)是一种逻辑编程语言,建立在逻辑学的理论基础之上,最初被运用于自然语言等研究领域。现已广泛应用在人工智能的研究中,可以用来建造专家系统、自然语言理解、智能知识库等。
对一些应用程序的编写很有帮助,能够比其它语言更快速开发程序,Prolog的编程方法更像是使用逻辑语言来描述程序。
Prolog具有鲜明的逻辑编程语言特色,包括:没有特定的运行顺序,运行顺序是由计算机决定的,而不是程序员;程序中没有if、when、case、for这样的控制流程语句;Prolog程序和数据高度统一,其程序实际上是一个智能数据库;具有强大的递归功能。
1981年日本*宣布第5代计算机系统(FGCS)项目以Prolog为基础语言以来,Prolog成为了人工智能研究领域的主导语言。
6.6.1.3、OPS83
OPS83是应用于专家系统的程序设计语言,支持OPS早期版本,也支持PASCAL或C这些常规程序设计语言所具有的过程设计能力。它不是对所有程序设计任务都适宜,OPS83较之OPS的早期版本,对许多问题处理的更目然、更有效。
OPS是由美国宾夕法尼亚州卡内基一梅隆大学的C.L.Forgy等人开发。最早版本是在1975年开发的,之后几经修改形成了OPSl、OPS2(1978)、OPS4(1979)、OPS5(1981)多种版本,1986年出现了OPS83。
OSP83采用产生式系统的知识表示模式和正向精确推理方式。它提供了两种交互环境:一是和用户的界面;二是和知识工程师的界面(调试环境)。OPS83包括三个主要部分:知识库、推理机和工作存贮器。
知识库又称规则库。每条规则均以0PS83语言来表示。OPS83的推理过程由若干“识别一动作”周期组成。每个周期包括三个动作或阶段:匹配、冲突解决(或选择)和执行。
匹配是数据和已有规则的匹配。匹配的结果形成了冲突集。是所有满足条件的规则的集合。然后,推理机从冲突集中选择规则执行。工作存贮器(Work Memory,WM)用来存贮推理机在推理过程中的初始状态、中间状态和目标等信息。
各个模块可作为独立的文件存放在存贮器中,单独编译,然后连接在一起运行。数据类型、语句、子程序等与一般程序设计语言类似,使用OPS83的知识工程师有一个类似于过程描述型语言的编程环境。
6.6.1.4、Python
1989年圣诞节期间,荷兰人吉多·范罗苏姆(Guido van Rossum),在阿姆斯特丹,为了打发圣诞节的无趣,决心开发一个新的脚本解释程序,作为ABC语言的继承。还受到了Modula-3的影响,结合了Unix shell和C的习惯。
Guido本人看来,ABC语言优美强大,为非专业程序员设计。但是ABC语言并没有成功,究其原因,Guido认为是其非开放造成的。Guido在Python中避免这一错误。同时,他还想实现在ABC中闪现过但未曾实现的东西。
Python语法和动态类型,以及解释型语言的本质,使它成为多数平台上写脚本和快速开发应用的编程语言,随着版本的更新和语言新功能的添加,逐渐被用于独立的、大型项目的开发。
Python解释器易于扩展,可以使用C或C++(或者其它可以通过C调用的语言)扩展新的功能和数据类型。Python 也可用于可定制化软件中的扩展程序语言。丰富的标准库,提供了适用于各个主要系统平台的源码或机器码。
由于Python语言的简洁性、易读性以及可扩展性,在国内外用Python做科学计算的研究机构日益增多,很多知名大学已经采用Python来教授程序设计课程。例如卡耐基梅隆大学、麻省理工学院等。
众多开源的科学计算软件包都提供了Python的调用接口,例如著名的计算机视觉库OpenCV、三维可视化库VTK、医学图像处理库ITK。Python专用的科学计算扩展库十分流行,例如如下3个经典的科学计算扩展库:NumPy、SciPy和matplotlib,它们分别为Python提供了快速数组处理、数值运算以及绘图功能。
Python语言及其众多的扩展库所构成的开发环境适合工程技术、科研人员处理实验数据、制作图表,甚至开发科学计算应用程序,并可用于机器学习领域。
让人惊奇的是,Python今天成为人工智能应用层上最主要的外部接口,尤其在图形图像领域,使用尤其广泛,例如TensorFlow和PyTorch等。这应该是Guido所不曾想到的。
6.6.1.4、启示
诚然,编程语言很多,描述这段历史时,应该认识到的是,不同的编程语言与当时的硬件环境、软件理论相照应。在今天,只需要一概而过,对于深度研发,有一定认知的必要。
人工智能是一场科技革命,不仅仅是理论的发展,更是实践的应用,随着硬件技术的进步,人工智能理念的变幻,软件方面也将有很大的发展。
编程语言发展上,人工智能有很大的发展,编程语言与硬件系统紧密结合,编程语言与框架模式协作并行,才会有更大的突破。在未来,人工智能方面编程语言的发展,有这样三个思索。
A、研制与某种语言完全适应的新一代计算机。例如LlSP机、数据流机、PROLOG机、面向对象的体系结构等。但举步维艰、前景渺茫。以诺依曼机为核心的现代通用计算机已经广泛普及而且性能不断提高,积累了巨大的软件资源。任何与现代计算机不兼容的专用机,最多满足特殊需求,难以与现代通用计算机抗衡。在没有很大商业机会的前提下,这种办法是不可能实现的。
B、把不同风格的编程语言结合起来,发展复合语言或嵌入式语言,取长补短,使系统性能得以进一步提高。把面向对象语言的设计思路融汇到常用的面向过程的高级语言中。C++语言就是一个突出的例子。这种改变相对来说影响较小,毕竟不是脱胎换骨。
C、用面向问题的人工智能编程语言的特点,先选择某种语言编写出一个简洁明了而易于调试的程序原型。通过验证、调试,再仿照这个原型,改编为某种面向过程的高级语言程序,例如C或C++,达到提高最终应用系统开发质量和执行效率的目的。用PROLOG、 LISP、OPS等来开发专家系统原型,已有不少先例。在技术变幻的前提下,这种方式有一定的价值。
计算机发展史上,基于冯·诺伊曼的硬件系统很难发生变化,计算机编程语言的发展从未停止。我们得到一个启示,思想最容易在软件方面实现,而计算机编程语言的发展也就不足为奇。
关于计算机体系结构的发展,有一定价值的是,在未来,量子计算机的体系结构将会是一个重要的方向。随着量子技术的进步,对于商业而言,再次掀起市场的沧海桑田,腥风血雨。