1.2 C 语言
在过去的几十年,计算机技术以令人惊讶的速度发展着,当今,笔记本电脑的计算速度和存储信息的能力都远远超过了上世纪 60 年代的超大型计算机。在 20 世纪 70 年代,C 和 Pascal 这样的语言引领人们进入了结构化编程时代,这种机制把秩序和规则带进了迫切需要这种性质的领域中。提供了除结构化编程工具外,C 还能生成简洁、快速运行的程序,并提供了处理硬件问题的能力,如管理通信端口和磁盘驱动器。这些因素使 C 语言成为 20 世纪 80 年代占统治地位的编程语言。同时,20 世纪 80 年代,人们也见证了一种新的编程模式,面向对象编程(OOP)的成长。SmallTalk 和 C++ 语言具备这种功能。下面将深入地介绍 C 和 OOP。
20 世纪 70 年代早期,贝尔实验室的 Dennis Ritchie 致力于开发 UNIX 操作系统1。为完成这项工作,Ritchie 需要一种语言,它必须简洁,能够生成简洁、快速的程序,并能有效地控制硬件。在当时传统上,程序员使用汇编语言来满足这些需求,汇编语言依赖于计算机的内部机器语言。不过,汇编语言是低级(low-level)语言,即直接操作硬件,如直接访问 CPU 寄存单元和内存单元。因此,要将汇编程序移植到另一种计算机上,必须使用不同的汇编语言重新编写程序。这有点像每次购买新车时,都发现设计人员改变了控制系统的位置和功能,客户不得不重新学习驾驶这辆新车。
不过,UNIX 是为在不同的计算机(或平台)上工作而设计的,这意味着它是一种高吸语言。高级(high-level)语言致力于解决问题,而不针对特定的硬件。一种被称为编译器的特殊程序将高级语言翻译成特定计算机的内部语言。这样,就可以通过对每个平台使用不同的编译器来在不同的平台上使用同一个高级语言程序了。Ritchie 希望有一种语言能将低级语言的效率、硬件访问能力和高级语言的通用性、可移植性融合在一起,于是他在旧语言的基础上开发了 C 语言。
1.2.1 C 语言编程原理
由于 C++ 在 C 语言的基础上移植了新的编程理念,因此我们首先来看一看 C 所遵循的旧的理念。一般来说,计算机语言要处理两个概念——数据和算法。数据是程序使用和处理的信息,而算法是程序使用的方法(参见图 1.1)。C 语言与当前最主流的语言一样,在最初面世时也是过程性(procedural)语言,这意味着它强调的是编程的算法方面。从概念上说,过程化编程首先要确定计算机应采取的操作,然后使用编程语言来实现这些操作。程序命令计算机按一系列流程生成特定的结果,就像菜谱指定了厨师做蛋糕时应遵循的一系列步骤一样。
图 1-1-1 数据 + 算法 = 程序
随着程序规模的扩大,早期的程序语言(如FORTRAN 和 BASIC)都会遇到组织方面的问题。例如程序经常使用分支语句,根据某种测试的结果,执行一组或另一组指令。很多旧式程序的执行路径很混乱(被称为“意大利面条式编程”),几乎不可能通过阅读程序来理解它,修改这种程序简直是一场灾难。为了解决这种问题,计算机科学家开发了一种更有序的编程方法--结构化编程(structured programming)。C 语言具有使用这种方法的特性。例如,结构化编程将分支(决定接下来应执行哪个指令)限制为一小组行为良好的结构。C 语言的词汇表中就包含了这些结构(for 循环、while 循环、do while 循环和 if-else 语句)。
另一个新原则是自上向下(top-down)的设计。在 C 语言中,其理念是将大型程序分解成小型、便于管理的任务。如果其中的一项任务仍然过大,则将它分解为更小的任务。这一过程将一直持续下去,直到将程序划分为小型的、易于编写的模块(整理一下书房。先整理桌子、桌面、档案柜,然后整理书架。好,先从桌子开始,然后整理每个抽屉,从中间的那个抽屉开始整理。也许我都可以管理这项任务)。C 语言的设计有助于使用这种方法,它鼓励程序员开发程序单元(称为函数)来表示各个任务模块。如上所述,结构化编程技术反映了过程性编程的思想,根据执行的操作来构思一个程序。
-
UNIX 系统是一个分时系统。最早的 UNIX 系统于 1970 年问世。此前,只有面向批处理作业的操作系统,这样的系统对于需要立即得到响应的用户来说是太慢了。在 60 年代末,Kenneth Thompson 和 Dennis Ritchie 都曾参加过交互方式分时系统 Multics 的设计,而开发该系统所使用的工具是 CTSS 。这两个系统在操作系统的发展过程中都产生过重大影响。在此基础上,在对当时现有的技术进行精选提炼和发展的过程中,K.Thompson 于 1969 年在小型计算机上开发 UNIX 系统,后于 1970 年投入运行。——百度百科 ↩