1.2 编程语言分类
在1.1节的“编程语言极简史”中列出的语言都是所谓的“高级语言”。这仅仅是编程语言的一类,并且不是“历史悠久”的那一族,也不是计算机能够直接识别和运行的。面向计算机的语言是“史前时代”就已经产生的“机器语言”和“汇编语言”。
1.2.1 机器语言
机器语言(Machine Language)是用二进制代码表示的计算机能够直接识别和执行的机器指令集合。
如果读者学习过有关计算机硬件知识,就知道计算机内部是由集成电路(Integrated Circuit,简称IC)组成的,包括CPU和内存等。IC有很多引脚(见图1-2-1),只有直流电压0V或5V两个状态。也就是说,IC的一个引脚只能表示两个状态。
IC的这种特性正好与二进制相对应。计算机就将一系列的二进制数字转变为对应电压,从而使计算机的电子器件受到驱动,完成指定运算(见图1-2-2)。
图1-2-1 CPU的引脚
图1-2-2 IC的引脚和二进制
“史前时代”的程序员不得不使用机器语言来工作。他们将用0、1编写的程序打在纸带或卡片上,1打孔,0不打孔,再将程序通过纸带机或卡片机输入到计算机中进行运算。
这是一件多么富有挑战性的事情。
比如,“Hello World”,如果用机器语言表示,即二进制代码,应该是这样的:
如果写成了下面这样,打印的就不是“Hello World”了。
读者是否可以找出错误来?
显然,机器语言对于人“不友好”。用机器语言写程序,或许可以献上敬意,但不值得效仿。
另外,因为机器语言是计算机的设计生产者通过硬件结构赋予计算机的操作功能,所以不同型号计算机的机器语言会有所差别。除了少数专业人员,绝大多数编程者不需要学习机器语言。
所以,对人“友好”的语言应运而生。
1.2.2 汇编语言
汇编语言(Assembly Language)是二进制代码的文本形式,即使用便于记忆的书写格式表达机器语言的指令。
图1-2-3所示的汇编语言示例就是在64位Linux操作系统上运行的。
图1-2-3 汇编语言示例
看不懂图1-2-3中的代码也没有关系。在此只是请读者看一看汇编语言的基本“模样”,并非要求理解它。
每种汇编语言专用于某种计算机系统,不能在不同系统之间移植。
汇编语言相对于机器语言而言,已经是人可读、可编写的一种编程语言了。但它还非常靠近机器语言,用汇编语言“告诉”计算机干什么和计算机所干的之间(几乎)是一一对应的,即汇编语言的一条指令对应着一条机器指令。所以,汇编语言依然属于“低级语言”。
尽管如此,汇编语言现在依然有用武之地,因为它有自身的特点,比如目标程序占用内存少、运行效率高等——当然,这些优点的代价就是开发效率低。在某些特定任务中,还是少不了汇编语言的。
但,本书不以此为内容,而是介绍“高级语言”。
1.2.3 高级语言
“高级语言”(High-level Programming Language)是面向人的语言——It is for Humans(见图1-2-4)。
图1-2-4 高级语言和低级语言
(源自http://justcode.me/assembly/introduction-assembly-language-examples/)
之所以冠以“高级”之名,是因为这种语言使用了大量的英语单词,对开发者而言,更容易理解。最重要的是,高级语言摆脱了“硬件的拖累”,不需要与机器语言的指令对应,借助操作系统实现了对硬件的抽象。即使开发者“对硬件一窍不通”,也能利用高级语言开发程序。
图1-2-5中展示了一段Python程序,其作用是创建一个名为hello.txt的文件,并向这个文件中写入了“Hello World”。这个操作如果直接面对硬件,需要向磁盘的I/O指定扇区位置写入数据。但在这段代码中,丝毫没有扇区的影子。这是因为Python语言借助操作系统,将这个流程抽象为创建文件的open函数和写入文件的write函数,并且使用with实现自动关闭的功能。
图1-2-5 创建并写入文件内容
所以,此语言才“高级”(见图1-2-6)。
图1-2-6 自然语言和不同的高级语言比较
自20世纪50年代的Fortran语言开始,人类已经发明了好多种高级语言,它们各有千秋,就如同人类自然语言五花八门那样。每种高级语言都是针对某种“编程”行为,兼顾开发者的知识结构,以及程序的应用场景,制订了特有的语法规则。
虽然高级语言的语法规则各异,但它们都必须使用“语句”进行表达。高级语言中的“语句”是对计算机指令的抽象(见图1-2-5),不与机器语言一一对应,“是给人看的”,计算机不能直接识别和执行。比如“a=b+1”,要让计算机能够执行,必须“翻译”为机器语言的三条指令(见图1-2-7)。
图1-2-7 汇编语言与高级语言比较
计算机是如何“翻译”的?