这节课来探讨编程语言,首先会讨论计算机指令及指令执行过程,然后再说说编程语言的发展过程。
一、计算机如何执行一个程序?
1、计算机指令集
计算机的核心是CPU,当前主流的计算机CPU主要为AMD公司和INTEL公司生成的CPU,它们都有一套相同的计算机指令集,指令集由多条计算机指令构成,计算机的一条指令就是CPU可以直接执行的一个操作,多条指令构成了计算机指令集。
2、计算机指令
一条计算机指令由操作码和地址码构成,操作码定义了该指令的具体操作,地址码给出操作数的地址,指令涉及到N个操作数,则需要给出N个操作数的地址。指令的操作码为二进制数,指令译码后可以被CPU直接执行,上图给出了4个二进制位的操作码,实际上CPU指令的操作码一般为8位、16位、32位或64位。
指令的操作码定义了指令的具体操作。例如1011为存取指令(或传输指令),该指令涉及到两个操作数,指令的具体操作是将存储单元地址为26H的数据,传输到AX寄存器。寄存器是CPU内部用来存放数据或指令的存储区域,寄存器是CPU内部的元件,拥有非常高的读写速度,所以在寄存器之间的数据传送非常快。
3、指令的执行过程

上图是CPU执行指令涉及到寄存器、运算器、程序计数器、指令译码器、数据缓存、指令缓存等部件,这些部件都在CPU内部。
待执行的指令序列被加载到指令缓存区,指令操作的数据也被加载到数据缓存区。寄存器用来临时存储指令、数据或运算结果。程序计数器用来存储放置在指令缓存区,并且将要执行该指令的地址,一条指令执行完成后,程序计数器做加1操作,指向下一条待执行的指令。
指令译码器的主要作用是分析指令,确定指令的操作性质和方法,然后才能控制计算机其他各部件协同完成指令表达的功能。

计算机执行指令的具体过程为:首先从缓存取指令,送到指令寄存器,然后由指令译码器分析指令,发出指令执行的控制信号,指令执行完成,程序计数器加1,指向下一个指令的地址。
二、从编程语言到计算机指令
通过编程语言编写程序,再到计算机指令是一个什么样的过程呢?
最早的编程语言是机器语言,使用二进制数直接编写计算机指令,编写的程序也称为二进制代码,二进制代码可以直接在计算机上执行。
后来出现了汇编语言,汇编语言使用简单易记的助记符表示计算机指令,程序员可以直接用助记符来编写汇编代码,汇编代码不能直接在计算机上执行,需要一个转换程序,将汇编代码转换为机器代码。
再后来出现了高级语言,如C、Java、Python等。使用高级语言编写的程序称为源代码,源代码要通过编译程序转换为汇编代码,汇编代码再转换为机器代码。一些高级脚本语言可以直接将源代码解释为机器代码,直接在计算机上执行,如Python语言。
1、初级编程语言
假设编写一个计算直线方程的程序,给出方程的斜率、系数和变量X的值,求方程的值,将计算结果存储到以Y为地址的存储单元中。
直线方程为 Y = A * X + B
其中A、X、B已经分别存储到A、X、B存储单元,计算机指令可以直接寻址到该存储单元。A单元的存储地址为26H,X的存储地址为34H,B的存储地址为36H,Y的存储地址为56H。计算直线方程的流程如下图所示。

程序首先读取A单元的数据到AX寄存器,然后计算AX寄存器与X单元数据的乘积,将乘积结构存储到A单元,读取A单元的数据到AX寄存器,再计算AX寄存器与B单元的和,将计算结果存储到Y单元。
根据流程图使用机器语言编写的计算机指令序列(指令为模拟指令,主要是为了说明编程语言的演变过程):

上面表格的内容就是用机器语言编写的计算直线方程的计算机指令序列,是不是特别难记、难懂,完全是看天书的感觉。为了提高编程的工作效率,在1949年,人们将助记符和机器代码关联起来,并编写了转换程序,转换程序可以把助记符转换为机器代码,这就是汇编语言。汇编语言助记符与计算机指令的映射关系如下图所示:

助记符MOV表示计算机“1011”,该指令为存取指令,助记符ADD表示计算机指令“0011”,该指令为加法指令,等等……。
使用汇编语言编写的程序代码:

用助记符代替了机器码,编程是不是相对简单了一些,转换程序可以帮助编程人员从繁重的机器码编写劳动中解脱出来,转换程序也称之为汇编编译程序,其工作原理如下图所示:

汇编语言相对机器语言来说,编程效率和可读性都有了较大提高。但编写程序还是过于繁琐,并且汇编语言对应一条条指令集,当指令集改变时,就得修改相应汇编语言,导致其可移植性和维护性很差,不能跨平台使用。
2、高级编程语言
在20世纪50年代,出现了第一批高级语言,包括FORTRAN 、LISP、COBOL等语言,随后相继出现了C语言、C#、Java、PHP、Perl等高级语言。高级语言的优点是其语法和结构更类似人类语言,并且由于远离对硬件的直接操作,使得一般人经过学习之后都可以掌握编程技术。
使用C和Java语言编写的计算直线方程的代码:

使用高级语言编写的代码已经非常接近人类语言了,而且也容易理解。使用高级语言编写的程序要在计算机上执行,必须要把源代码转换为机器代码,其转换程序称为该语言的编译程序,例如C语言的转换程序可以称之为C语言编译程序,C语言编写的程序编译为Windows程序的工作过如下图所示:

编写完成的C语言源代码,首先经过编译预处理器规范代码和预编译,然后通过编译器转换为汇编代码,再由汇编器转换为机器代码,最后由链接器将有关的机器代码文件进行相互链接,构建Windows程序。
三、小结
编程语言是人们与计算机的交流工具,各种编程语言语法规则虽有不同,但其核心思想都是人们通过编程语言来控制计算机,让计算机帮助人们解决各类问题。
学习编程语言目的是掌握利用计算机解决问题的能力,包括分析问题、算法设计、数据架构等能力,有了这些能力,只要学会一种编程语言,其它语言都可以无师自通。