十一、编程语言发展史

之前我们将重点放在硬件——组成计算机的物理组件,比如电、电路、寄存机、RAM、ALU、CPU,但是在硬件层面编程非常麻烦(打孔纸卡、插线板、面板编程)。所以程序员想要使用一种更加通用的方式进行编程,一种“更软的”媒介——软件
第8集我们讲了一个简单的程序,在内存地址0存放了00101110。前4位是操作码OPCODE,表示LOAD_A指令;1110是内存地址14,所以这8位编码的意思是“读取内存地址14,放入寄存器A”。这8位二进制编码就是计算机可以处理的编码,也是处理器的“母语”,是二进制只能理解的内容。处理器的母语就叫做“机器语言”或者“机器码”。
在计算机早期阶段,必须用机器码写程序。早期的程序员会先在纸上写一个程序的高层次描述,叫做“伪代码”——一种用自然语言尽可能精简地表示执行程序的描述方式。然后我们可以使用“操作码表”将伪代码转换为二进制机器码,然后再将程序输入计算机并运行。
在这里插入图片描述
但是很明显,这种手工查表译码的方式是非常复杂和麻烦的。于是程序员开发出一种新语言——更有可读性、更高层次的编程语言。每个操作码分配一个简单名字,叫做“助记符”,然后在助记符之后紧跟数据,形成完成指令。这样子与其用1和0写代码,程序员可以直接写”LOAD_A 14”——当然,CPU是看不懂”LOAD_A 14”的,因为它只能看懂二进制机器码,于是程序员想到一个办法,写了一个二进制程序。这个二进制程序可以读懂文字指令并自动转换为二进制指令,这个程序的名字就叫做“汇编器”:汇编器读取用“汇编语言”写的程序,然后转成“机器码”。”LOAD_A 14”就被称为一条汇编指令
随着时间推移,汇编器有着越来越多功能,编程变得越来越容易。汇编器的其中一个自动功能就是自动分析JUMP的地址。如下所示:JUMP NEGATIVE指令跳转到地址5,然后普通的JUMP指令跳到地址2。这样写的问题就是如果在程序的开头多加一点代码,那么JUMP的地址就要全部重写。如下面第二张图所示:
在这里插入图片描述
在这里插入图片描述
所以汇编器跳转时不用跳转到一个固定的地址,而是插入相应的标签提供给你进行跳转。当程序被传入汇编器,汇编器会自己找到跳转地址。这样程序员就可以专心编程而不用关心底层的细节——例如什么数据或者指令存储在什么地址上。如下图所示:
在这里插入图片描述
引入标签,可以隐瞒不必要的细节来让程序做更加复杂的工作。凭借这一点我们又提升了一层抽象。虽然引入了标签实现了自动跳转,但是汇编指令终归也只是对机器码的修饰。一般来说一条汇编指令对应一条机器指令,因此汇编码和底层硬件的连接很紧密。程序员使用汇编指令时还需要思考用什么样的寄存器以及内存地址的相关问题。如果需要一个额外的数很可能就要修改很多的代码。尤其是在打孔纸片输入代码的时代里,修改代码需要直接在打孔纸片上加孔或者补孔。Grace Hopper参与了哈佛1号计算机的程序编写,那个时候计算机甚至没有jump指令,想要循环一块代码就需要将一系列打孔纸片首尾连接,十分麻烦。
为了解决编程与底层硬件联系过于紧密的问题,Hopper设计了一个高级编程语言,叫做“算术语言版本0”,简称“A-0”。汇编和机器指令是一一对应的,但是一行高级编程语言可能会转换成几十条二进制指令。为了做到这种转换,Hopper在1952年设计了第一个编译器。编译器的功能是将高级语言转换成低级语言,比如汇编码或机器码。此后越来越多的人尝试创造新的编程语言,如今已经有上百种编程语言。
这里我们用Python作为例子举例。假设我们想相加两个数字并保存结果——如果使用汇编代码,我们需要与各种寄存器与内存地址打交道,需要把握一定的底层细节。但是同样的程序用Python可以这样写,不用在乎寄存器或者内存的位置——这些细节由编译器搞定。
在这里插入图片描述
那么程序员需要关心什么呢?程序员只需要创建代表内存地址的抽象,叫做“变量”,并给变量命名。就如上图一样,这里给变量取名为A和B——实际编程时你可以随便取名+然后将结果存于变量C中。在底层操作时,编译器可能把变量A存在寄存器A、也可能是寄存器B,但是我们不用关心这些细节。IBM于1957年发布了语言FORTRAN,这门语言主宰了早期的项目编程。FORTRAN所写的程序比等同的手写汇编代码短20倍。虽然牺牲了一点点的运行速度,但是让程序员编写程序的速度大大加快。
但是当时的FORTRAN只能在IBM的电脑上使用,且每升级一次电脑,整个代码编写模式就要重新更新。因此当时政府联合学术界成立了一个数据结构委员会,并开发了一种通用编程语言,可以在不同的机器上通用,最后诞生了一门高级的、易于使用的“普通面向商业语言”,叫做COBOL。为了兼容不同的底层硬件,每个计算机需要对应其计算机的COBOL编译器,而这些编译器都可以接受相同的COBOL代码——不管是什么样的计算机。这就叫做“一次编写,到处运行(write once,run anywhere)”——这也是如今大多数编程语言的特点,他们不必接触CPU特有的汇编码与机器码、不需要与计算机硬件和底层相关的知识,减小了使用门槛。现在各行各业的人都可以使用编程将计算机用于工作中。同时编程的抽象化也让计算机的专家可以进行更为复杂的程序编写,一条程序用汇编编写可能需要上百万行,但是用现代高级编程语言可能只需要数万行搞定。比较有名的现代编程语言包括C,C++,Java,Python,Go等等。
以下是本集的总结:
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值