程序和编程语言
《Linux C 编程一站式学习》是亚嵌教育的宋劲杉老师编写的开源 C 语言学习书籍,笔者从中收获了很多知识,以下是笔者的读书笔记。
计算机是人们为了计算复杂的数学运算而被制造出来的。其工作流程为,先从程序员那获取计算任务,之后将计算任务分析、计算,最后将计算结果输出给程序员。
那程序员是如何将计算任务告知给计算机的呢?
答案是通过编写一个程序(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;
语句在汇编和机器语言中的表示形式如下:
在 C 语言中:
a = b + 1;
在汇编语言中:
mov 0x804a01c, %eax
add $0x1, %eax
mov %eax, 0x804a01c
在机器语言中:
a1 1c a0 04 08
83 c0 01
a3 18 a0 04 08
由于计算机只能理解数字,因此早期的程序员只能使用机器语言来编写程序,但是使用这种语言来编写程序很麻烦,因为需要查找大量的表格来确定每个数字代表着什么意思,所以汇编语言出现了。在汇编语言中,每一种指令都对应着一个相应的助记符(Mnemonic),程序员通过使用助记符的方式来编写汇编程序,之后将编写好的汇编程序提交给汇编器(Assembler),由汇编器来查表将助记符替换成数字,从而将汇编语言翻译成机器语言。
但是使用汇编语言编写的程序有一个缺点,那就是不具有可移植性(Portable)。因为不同的计算机平台可能对应着不同的计算机体系结构,而不同的计算机体系结构对应着不同的指令集(Instruction Set)。这意为着如果一个程序要在体系结构不相同的计算机平台上运行,那么程序员就需要为每一种平台编写一个符合该平台指令集版本的程序。
因此,高级语言出现了。与低级语言直接使用机器指令来编写程序不同,高级语言使用语句来编写程序。语句是对机器指令的抽象,因此使用高级语言编写的程序更具有可读性。而且高级语言还具有低级语言所不具有的可移植性或平台无关性(Platform Independent)。要实现可移植性,只需要在每种计算机平台上提供相应的高级语言编译器即可。
以 C 语言为例,其编译执行过程如下:
程序员使用 C 语言编写程序
将写好的 C 程序提交给 C 编译器
C 编译器将 C 程序编译成可执行文件
操作系统的加载器加载运行新生成的可执行文件
在编程语言的发展过程中,机器语言被称为第一代编程语言(1GL,1st Generation Programming Language),汇编语言被称为第二代编程语言(2GL,2nd Generation Programming Language),C、C++、Java、Python 等被称为第三代编程语言(3GL, 3rd Generation Programming Language),目前还有 4GL 或 5GL 的概念。3GL 的编程语言属于命令式(Imperative)语言,4GL 和 5GL 的编程语言属于声明式(Declarative)语言。命令式语言使用语句告诉计算机每一步具体怎么做,而声明式语言更多描述的是要做什么,至于怎么做,由编译器决定。