Skip to content

1. 程序和编程语言

程序(Program)告诉计算机应如何完成一个计算任务,这里的计算可以是数学运算,比如解方程,也可以是符号运算,比如查找和替换文档中的某个单词。从根本上说,计算机是由数字电路组成的运算机器,只能对数字做运算,程序之所以能做符号运算,是因为符号在计算机内部也是用数字表示的。此外,程序还可以处理声音和图像,声音和图像在计算机内部必然也是用数字表示的,这些数字经过专门的硬件设备转换成人可以听到、看到的声音和图像。

程序由一系列指令(Instruction)组成,指令是指示计算机做某种运算的命令,通常包括以下几类:

  • 输入(Input):从键盘、文件或者其它设备获取数据。
  • 输出(Output):把数据显示到屏幕,或者存入一个文件,或者发送到其它设备。
  • 基本运算:执行最基本的数学运算(加减乘除)和数据存取。
  • 测试和分支:测试某个条件,然后根据不同的测试结果执行不同的后续指令。
  • 循环:重复执行一系列操作。

对于程序来说,有上面这几类指令就足够了。你曾用过的任何一个程序,不管它有多么复杂,都是由这几类指令组成的。程序是那么的复杂,而编写程序可以用的指令却只有这么简单的几种,这中间巨大的落差就要由程序员去填了,所以编写程序理应是一件相当复杂的工作。编写程序可以说就是这样一个过程:把复杂的任务分解成子任务,把子任务再分解成更简单的任务,层层分解,直到最后简单得可以用以上指令来完成。

编程语言(Programming Language)分为低级语言(Low-level Language)和高级语言(High-level Language)。机器语言(Machine Language)和汇编语言(Assembly Language)属于低级语言,直接用计算机指令编写程序。而C、C++、Java、Python等属于高级语言,用语句(Statement)编写程序,语句是计算机指令的抽象表示。

一个语句的三种表示

编程语言表示形式
C语言a=b+1;
汇编语言mov 0x804a01c,%eax
add $0x1,%eax
mov %eax,0x804a018
机器语言a1 1c a0 04 08
83 c0 01
a3 18 a0 04 08

计算机只能对数字做运算,符号、声音、图像在计算机内部都要用数字表示,指令也不例外,上表中的机器语言完全由十六进制数字组成。最早的程序员都是直接用机器语言编程,但是很麻烦,需要查大量的表格来确定每个数字表示什么意思,编写出来的程序很不直观,而且容易出错,于是有了汇编语言,把机器语言中一组一组的数字用助记符(Mnemonic)表示,直接用这些助记符写出汇编程序,然后让汇编器(Assembler)去查表把助记符替换成数字,也就把汇编语言翻译成了机器语言。

编译执行的过程

  1. 用文本编辑器写一个C程序,保存成文件(例如 program.c
  2. 运行编译器进行编译
  3. 生成可执行文件(例如 a.out
  4. 操作系统加载并执行该文件

解释执行的过程

解释执行的语言(如Shell脚本)不需要先生成可执行文件,而是由解释器(Interpreter)直接解释执行每一行命令。

编程语言的发展

  • 第一代语言(1GL):机器语言
  • 第二代语言(2GL):汇编语言
  • 第三代语言(3GL):C、C++、Java、Python等
  • 第四代语言(4GL)和第五代语言(5GL):更多是描述要做什么(Declarative)而不描述具体一步一步怎么做(Imperative)

习题

  1. 解释执行的语言相比编译执行的语言有什么优缺点?

这是我们的第一个思考题。本书的思考题通常要求读者系统地总结当前小节的知识,结合以前的知识,并经过一定的推理,然后作答。本书强调的是基本概念,读者应该抓住概念的定义和概念之间的关系来总结。

希望读者掌握以概念为中心的阅读思考习惯,每读一节就总结一套概念之间的关系图画在书上空白处。如果读到后面某一节看到一个讲过的概念,但是记不清在哪一节讲过了,没关系,书后的索引可以帮你找到它是在哪一节定义的。