1.1 计算机程序设计语言概述
计算机程序设计语言是人类在计算机上解决实际问题的一种编码规则工具。当一个求解问题能够用数学模型表达时,人们会考虑用某种程序设计语言将该问题的数学模型表示成计算机可以接受的程序形式,再由计算机自动处理这个程序,生成人们所需要的结果。
程序设计语言随着计算机科学的发展而发展,它由最早的机器语言形式逐步发展成为现在的接近人类自然语言的形式。
20世纪50年代的程序设计是使用机器语言或汇编语言编写的,用这样的程序设计语言设计的程序相当烦琐、复杂,不同机器使用的机器语言或汇编语言几乎完全不同。能够使用这类语言编写程序的人群极其有限,也就限制了这类计算机程序设计语言的普及和推广,必然影响计算机的普及和应用。
20世纪50年代中期研制出来的FORTRAN语言是计算机程序设计语言历史上的第一个高级程序设计语言。它在数值计算领域首次将程序设计语言以接近人类自然语言的形式呈现在人们面前,它引入了许多目前仍在使用的程序设计概念,如变量、数组、分支、循环等。20世纪50年代后期研制的ALGOL语言进一步发展了高级程序设计语言,提出了块结构的程序设计概念。即一个问题的求解程序可以由多个程序块组成,块与块之间相对独立,不同块内的变量可以同名,但互不影响。
到了20世纪60年代后期,人们设计出来的程序越来越庞大,随之而来的问题是程序越庞大,程序的可靠性越差,错误越多,并且难以维护。程序设计人员难以控制程序的运行,这就是当时的“软件危机”问题。为了解决“软件危机”问题,荷兰科学家E.W.Dijkstra在1969年首次提出了结构化程序设计的概念,这种思想强调从程序结构和风格上研究程序设计方法。后来,瑞士科学家Niklans Wirth的“算法+数据结构=程序”思想进一步发展了结构化程序设计方法,将一个大型的程序分解成多个相互独立的部分(称为模块)。模块化能够有效分解大型、复杂的问题,同时每个模块相互独立,提高了程序的维护效率。这就是面向过程的结构化程序设计思想。所谓面向过程的结构化程序设计思想是人们在求解问题时,不仅要提出求解的问题,还要精确地给出求解问题的过程(将问题的求解过程分解成多个、多级相互独立的小模块)。20世纪70年代初面世的C语言就是典型的、面向过程的结构化程序设计语言。
面向过程的结构化程序设计是从求解问题的功能入手,按照工程的标准和严格的规范将求解问题分解为若干功能模块,求解问题是实现模块功能的函数和过程的集合。由于用户的需求和硬件、软件技术的不断发展变化,按照功能划分将求解问题分解出来的模块必然是易变和不稳定的。这样开发出来的模块可重用性不高。20世纪80年代提出的面向对象的程序设计方法即是为了解决面向过程的结构化程序设计所不能解决的代码重用问题。面向对象的程序设计方法是从所处理的数据入手,以数据为中心而不是以求解问题的功能为中心来描述求解问题。它把编程问题视为一个数据集合,数据相对于功能而言,具有更好的稳定性。这就是“对象+对象+……=程序”的理论。面向对象程序设计与面向过程结构化程序设计相比,最大的区别就在于:前者关心的是所要处理的数据,而后者关心的是求解问题的功能。面向对象程序设计方法很好地解决了“软件危机”问题。
面向对象程序设计语言有两类:一类是完全面向对象的语言,另一类是兼顾面向过程和面向对象的混合式语言。
面向对象程序设计语言其实是以面向过程结构化程序设计语言为基础的。面向对象程序设计语言在构建应用程序框架、输入/输出界面等方面由系统做了大量的基础工作,应用程序设计人员只需要关注应用问题的解决;而面向过程结构化程序设计语言程序人员需要解决应用程序框架、输入/输出界面、应用问题的解决过程,并且面向过程结构化程序设计语言的程序代码与数据相互独立。
无论是面向对象程序设计语言还是面向过程结构化程序设计语言,从解决应用问题的角度来说,它们都与人类自然语言有着极其相似的语言模型,从设计语言、使用语言上,都有共同的语言模型。图1-1所示为程序设计语言模型图。
图1-1 程序设计语言模型图
读者可以了解一下一般程序设计语言的模型。通过图1-1进行理解:学习某种程序设计语言,主要是学习(见图1-1)根据词法规则用某种语言字符集中的字符构造单词;根据语法规则用单词构造语句;根据逻辑规则(任务内在的联系)用语句构成程序。读者可以根据图1-1自学其他程序设计语言。实际上,任何语言都遵从这种模式,包括自然语言(英语、汉语等)。对于自然语言,只是字符集中的字符多,构词规则复杂,语法规则更复杂,由若干语句组成的集合称为文章或文章段落而已。其实计算机程序设计语言就是从自然语言模型中简化出来的。理解了这个道理,对于学习程序设计语言是很有帮助的。
对于第一次学习某种计算机语言的读者来说,图1-1实际上是以学习人类自然语言为模型(参照对象),给出了学习某种计算机语言的模型。有了这个参照对象,读者自然知道从什么地方开始学习程序设计语言了,重点解决什么问题。