《C语言程序设计与实践(第2版)》——1.2 计算机与程序设计-阿里云开发者社区

开发者社区> 华章出版社> 正文

《C语言程序设计与实践(第2版)》——1.2 计算机与程序设计

简介: 计算机的功能非常强大,能做非常复杂、人脑难以胜任的许多工作。然而,从电子市场买回CPU、主板、内存、硬盘等硬件并组装好一台计算机后,你却发现这台计算机什么也做不了。究其原因,就是因为该计算机上还没有安装任何计算机程序,即软件。

本节书摘来自华章出版社《C语言程序设计与实践(第2版)》一书中的第1章,第1.2节,作者:凌云等著,更多章节内容可以访问云栖社区“华章计算机”公众号查看

1.2 计算机与程序设计

计算机的功能非常强大,能做非常复杂、人脑难以胜任的许多工作。然而,从电子市场买回CPU、主板、内存、硬盘等硬件并组装好一台计算机后,你却发现这台计算机什么也做不了。究其原因,就是因为该计算机上还没有安装任何计算机程序,即软件。硬件是计算机拥有强大功能的前提条件,但是如果没有“大脑”(也就是计算机程序)去指挥它,它将什么也做不了,所以计算机程序的存在是计算机能够工作、能够按指定要求工作的必要条件。因此,计算机程序(Program,通常简称程序)可以简单理解为人们为解决某种问题而用计算机可以识别的代码所编排的一系列加工步骤。计算机能严格按照这些步骤去执行任务。计算机只是一个机器,只能按照既定的规则工作,这个规则是为了实现某个目标而人为制订的,因此我们制订的规则必须能够让计算机“理解”,才能使其按要求去工作,人们按照计算机能够理解的“语言”来制订这些规则的过程,就是程序设计的过程。
1.2.1 指令与程序
计算机的功能强大,但是没有智能,而且每次只能完成非常简单的任务。计算机必须通过一系列的简单任务有序组合才能完成复杂任务。因此,人只能以一个简单任务接一个简单任务的方式来对计算机发出指令。这个简单任务称为计算机的指令。一条指令本身只能完成一个最基本的功能,如实现一次加法运算或一次大小的判别。不同的指令能完成不同的简单任务。但是通过对多条指令的有序组织,就能完成非常复杂的工作,这一系列计算机指令(也可理解为人的命令)的有序组合就构成了程序,对这些指令的组织过程就是编程的过程,组织规则就是编程的语法规则。
例1-2 假设计算机能识别的指令有以下四条。
Input X:输入数据到存储单元X中。
Add X Y Z:将X、Y相加并将结果存到Z中。
Inv X:将X求反后存回X。
Output X:输出X的内容。
请编写一段由上述指令组成的虚拟程序,实现以下功能:输入3个数A、B和C,求A+B-C的结果。
程序如下:

Input A;    输入第1个数据到存储单元A中
Input B;    输入第2个数据到存储单元B中
Input C;    输入第3个数据到存储单元C中
Add A B D;    将A、B相加并将结果存在D中
Inv C;
Add C D D;    将C、D相加并将结果存在D中
Output D;    输出D的内容

由例1-2可以看出,通过指令的有序组合,能完成单条指令无法完成的工作。上述程序中的指令是假设的,事实上,不同CPU支持的指令集也不同(由CPU硬件生产商决定提供哪些指令)。有点硬件常识的读者都知道,计算机的CPU和内存等都是集成电路,其能存储和处理的对象只能是0、1组成的数字序列。因此这些指令也必须以0、1序列表示,最终程序在计算机中也是以0、1组成的指令码(用0、1序列编码表示的计算机指令)来表示的,这个序列能够被计算机CPU所识别。程序与数据均存储在存储器中。运行程序时,将准备运行的指令从内存调入CPU中,由CPU处理这条指令。CPU依次处理内存中的所有指令,这就是程序的运行过程。
1.2.2 程序与程序设计
计算机程序是人们为解决某种问题用计算机可以识别的代码编排的一系列数据处理步骤,是计算机能识别的一系列指令的集合。计算机能严格按照这些步骤和指令去操作。程序设计就是针对实际问题,根据计算机的特点,编排能解决这些问题的步骤。程序是结果和目标,程序设计是过程。
1.2.3 程序设计和程序设计语言
程序设计是按指定要求编排计算机能识别的特定指令组合的过程,而程序设计语言是为方便人进行程序设计而提供的一种手段,是人与计算机交流的语言。程序设计语言随着计算机技术的发展而不断发展。
计算机能直接识别的是由“0”和“1”组成的二进制数——二进制是计算机语言的基础。一开始,人们只能用计算机能直接理解的语言去命令计算机工作,即写出一串串由“0”和“1”组成的指令序列交给计算机执行,这种语言称为机器语言。使用机器语言编写程序是一项十分痛苦的工作,特别是在程序有错需要查找、修改时更是如此。而且,由于每台计算机的指令系统往往各不相同,因此在一台计算机上执行的程序,要想在另一台计算机上执行,必须重新修改程序,这就造成了重复工作。所以,现在已经很少有人用机器语言直接写程序。
为了减轻使用机器语言编程的痛苦,人们进行了一种有益的改进:用一些简洁的英文字母、有一定含义的符号串来替代一个特定指令的二进制串,比如,用“ADD”代表加法,用“SUB”代表减法,用“MOV”代表数据传递等,这样一来,人们很容易读懂并理解程序在干什么,从而使得纠错及维护都变得方便了,这种程序设计语言称为汇编语言,即第二代计算机语言。然而对于计算机而言,它只认识“0”和“1”组成的指令,并不认识这些符号,这就需要一个专门的程序来将这些符号翻译成计算机能直接识别和理解的二进制数的机器语言,完成这种工作的程序被称为汇编程序,它充当的就是一个翻译者的角色。汇编语言同样十分依赖于机器硬件,移植性不好,但效率很高。现代的桌面计算机,功能已经非常强大,效率已经不是首要关注目标。所以,通常只有在资源受限的嵌入式环境或与硬件相关的程序设计(如驱动程序)过程中,汇编语言才会作为一种首选的软件开发语言。
虽然机器语言发展到汇编语言已经有了很大的进步,但是由于每条指令完成的工作非常有限,因此编程过程仍然很烦琐,语义表达仍然比较费力。于是,人们期望有更加方便、功能更加强大的高级编程语言。这种高级语言应该接近于数学语言或人的自然语言,同时又不依赖于计算机硬件,编出的程序能在所有机器上通用。C语言就是一种能满足这种要求的语言,它既有高级语言的通用性又有底层语言的高效性,展示出了强大的生命力,几十年来一直被广泛应用。许多高校也将C语言作为计算机专业和相关专业的重要必修课,作为高校在校学生接触的第一门编程语言。同样,计算机本身并不“认识”C语言程序,因此需要将C语言程序先翻译成汇编程序,再将汇编程序翻译成机器语言,这个过程往往由编译程序来完成。
为了使程序设计更加接近自然语言的表达,方便用户实现功能,包括C语言在内的所有程序设计语言必须具有数据表达和数据处理(称为控制)这两方面的能力。
1.数据表达
为了充分有效地表达各种各样的数据,人们通常会对常见数据进行归纳总结,确定其共性,最终尽可能地将所有数据抽象为若干种类型。数据类型(data type)就是对某些具有共同特点的数据集合的总称。如常说的整数、实数就是数据类型的例子。
在程序设计语言中,一般都事先定义几种基本的数据类型供程序员直接使用,如C语言中的整型、浮点型、字符型等。这些基本数据类型在程序中的具体对象主要有两种形式:常量(constant)和变量(variable)。常量在程序中是不变的,例如,987是一个整型常量。对于变量,则可对其做一些相关的操作,例如,改变它的值。
同时,为了使程序员能更充分地表达各种复杂的数据,C等程序设计语言还提供了丰富的构造新数据类型的手段,如数组(array)、结构(struct)、联合(union)、文件(file)和指针(pointer)等。
2.数据处理的流程控制
高级程序设计语言除了能有效地表达各种各样的数据外,还必须能对数据进行有效的处理,提供一种手段来表达数据处理的过程,即程序的控制过程。
一种比较典型的程序设计方法是:将复杂程序划分为若干个相互独立的模块,使每个模块的工作变得单一而明确,在设计一个模块时不受其他模块的影响。同时,通过现有模块积木式地扩展又可以形成复杂的、更大的程序模块或程序。这种程序设计方法就是结构化程序设计方法,C语言就是典型的采用这种设计方法的语言。按照结构化程序设计的观点,任何程序都可以将模块通过三种基本的控制结构(顺序、选择和循环)的组合来实现。
当要处理的问题比较复杂时,为了增强程序的可读性和可维护性,我们常常将程序分为若干个相对独立的子模块,在C语言中,子模块的实现通过函数完成。
1.2.4 程序设计过程
采用高级程序设计语言,指挥计算机完成特定功能,解决实际问题的程序设计过程通常包括以下几个步骤:
1)明确功能需求。程序员通过交流和资料归纳,总结和明确系统的具体功能要求,并用自然语言描述出来。
2)系统分析。根据功能要求,分析解决问题的基本思路和方法,也就是常说的算法设计。
3)编写程序。程序员根据系统分析和程序结构编写程序。这一过程我们称为编程,最后将所编写的程序存入一个或多个文件,这些文件称为源文件。一般把用C按照其语法规则编写的未经编译的字符序列称为源程序(source code,又称源代码)。
4)编译程序。通过编译工具,将编写好的源文件编译成计算机可以识别的指令集合,最后形成可执行的程序。这一过程包括编译和链接。计算机硬件能理解的只有计算机的指令,也就是0、1组成的指令码,用程序设计语言编写的程序不能被计算机直接接受,这就需要一个软件将相应的程序“翻译”成计算机能直接理解的指令序列。对C语言等许多高级程序设计语言来说,这种软件就是编译器(compiler),因此编译器充当着类似于“翻译”的角色,其精通两种语言:机器语言和高级程序设计语言。编译器首先要对源程序进行词法分析,然后进行语法与语义分析,最后生成可执行的代码。
5)程序调试。运行程序,检查其有没有按要求完成指定的工作,如果没有,则回到第3步和第4步,修改源程序,形成可执行程序,再检查,直到获得正确结果。
为了使程序编辑(Edit)、编译(Compile)、调试(Debug)等过程简单,方便操作,许多程序设计语言都有相应的编程环境(称为集成开发环境IDE)。程序员可以直接在该环境中完成程序编辑、代码编译,如果程序出错还可以提供错误提示、可视化的快捷有效的调试工具等。所以,在IDE环境下,程序员可以专注于程序设计本身,而不用关心编辑、编译的操作方法。
在Windows操作系统下,C语言的集成开发环境主要有:
1)Borland公司的Turbo C环境。
2)Microsoft公司的Visual C++环境。
在Linux操作系统下,C语言的集成开发环境主要有:
1)Eclipse。
2)GCC、g++等开源工具。
本书所有示例和实验均在Visual C++ 6.0环境下进行。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:

华章出版社

官方博客
官网链接