专栏首页程序员成长充电站从汇编语言到高级编程语言的演变

从汇编语言到高级编程语言的演变

转载请联系授权

01

用胶带来补"漏洞"

葛丽丝·霍普博士(作为美国海军军官,她是哈佛1号计算机的首批程序员之一)也遇到了这个问题,这台机器我们在前面提过。这台巨大机电野兽在 1944 年战时建造完成,帮助盟军作战。程序写在打孔纸带上,放进计算机执行。顺便一说,如果程序里有漏洞,真的就直接用胶带来补"漏洞"

Mark 1 的指令集非常原始,甚至没有 JUMP 指令,如果代码要跑不止一次,得把带子的两端连起来 做成循环,换句话说,给 Mark 1 编程简直是噩梦。

02

第一个编译器

战后,霍普继续在计算机前沿工作,为了释放电脑的潜力,她设计了一个高级编程语言,叫"算术语言版本 0",简称"A-0"。汇编与机器指令是一一对应的,但一行高级编程语言可能会转成几十条二进制指令,为了做到这种复杂转换Hopper 在 1952 年创造了第一个编译器。编译器专门把高级语言 转成低级语言,比如汇编或机器码(CPU 可以直接执行机器码)。

尽管"使编程更简单"很诱人,但很多人对霍普的点子持怀疑态度。她曾说"我有能用的编译器,但没人愿意用,他们告诉我计算机只能做算术,不能运行程序"。

但这个点子是好的。

不久,很多人尝试创造新编程语言,如今有上百种语言!可惜的是,没有任何 A-0 的代码遗留下来。所以我们用 Python 举例(一门现代编程语言)。

假设我们想相加两个数字,保存结果。

记住,如果用汇编代码,我们得从内存取值,和寄存器打交道,以及其他底层细节。但同样的程序可以用 Python 这样写:不用管寄存器或内存位置,编译器会搞定这些细节,不用管底层细节。程序员只需要创建 代表内存地址的抽象,叫"变量",给变量取名字。现在可以把两个数 存在变量里,这里取名 A 和 B, 实际编程时你可以随便取名。然后相加两个数,把结果存在变量 C。底层操作时,编译器可能把变量 A 存在寄存器 A,但我不需要知道这些!眼不见心不烦。

这是个重要历史里程碑,但 A-0 和之后的版本没有广泛使用.

03

FORTRAN主宰了早期计算机编程

FORTRAN,名字来自 "公式翻译"。这门语言数年后由 IBM 在 1957 年发布,主宰了早期计算机编程。

FORTRAN 项目总监 John Backus 说过,"我做的大部分工作都是因为懒,我不喜欢写程序,所以我写这门语言,让编程更容易"。你懂的,典型的"懒人",创造自己的编程语言。

平均来说,FORTRAN 写的程序,比等同的手写汇编代码短 20 倍,然后 FORTRAN 编译器会把代码转成机器码。人们怀疑性能是否比得上手写代码,但因为能让程序员写程序更快,所以成了一个更经济的选择,运行速度慢一点点,编程速度大大加快。

04

COBOL的诞生

当时 IBM 在卖计算机,因此最初 FORTRAN 代码只能跑在 IBM 计算机上。1950 年代大多数编程语言和编译器,只能运行在一种计算机上。如果升级电脑,可能要重写所有代码!因此工业界,学术界,政府的计算机专家在 1959 年组建了一个联盟—数据系统语言委员会,Grace Hopper 担任顾问。开发一种通用编程语言,可以在不同机器上通用,最后诞生了一门高级,易于使用,"普通面向商业语言",简称 COBOL。

为了兼容不同底层硬件,每个计算架构需要一个 COBOL 编译器,最重要的是,这些编译器都可以接收相同 COBOL 代码。不管是什么电脑,这叫"一次编写,到处运行"。如今大多数编程语言都是这样,不必接触 CPU 特有的汇编码和机器码,不必接触 CPU 特有的汇编码和机器码,减小了使用门槛。

05

计算机成为大众化工具

在高级编程语言出现之前,编程只是计算机专家和爱好者才会做的事,而且通常是主职。但现在,科学家,工程师,医生,经济学家,教师等等,都可以把计算机用于工作。

感谢这些语言,计算机科学从深奥学科变成了大众化工具。同时,编程的抽象也让计算机专家,现在叫"专业程序员",制作更复杂的程序。如果用汇编写可能要上百万行。

06

编程语言的飞速发展

当然,计算机的历史没有在 1959 年结束,编程语言设计的黄金时代才刚刚开始。和硬件一起飞速发展。

在 1960 年代,有 ALGOL, LISP 和 BASIC 等语言;

70年代有:Pascal,C 和 Smalltalk;

80年代有:C++,Objective-C 和 Perl;

90年代有:Python,Ruby 和 Java;

新千年 Swift, C#, Go 在崛起;

有些语言你可能听起来耳熟 - 很多现在还存在,你现在用的浏览器很可能是 C++ 或 Objective-C 写的,我刚才说的编程语言名字 只是冰山一角。新的编程语言在不断诞生,新语言想用更聪明的抽象,让某些方面更容易或更强大或利用新技术和新平台带来的优势,让更多人能快速做出美妙的事情。

许多人认为编程的"圣杯"是直接用英文,直接对计算机说话,然后它会理解并执行,这种智能系统目前只存在于科幻小说。

本文分享自微信公众号 - 程序员成长充电站(qianpangzi8),作者:钱胖子

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-06-04

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 程序如何"进入"计算机

    你应该记得在前面,我们一步步讲了例子程序,当时为了简单,我们假设程序已经魔法般在内存里了,但事实是,程序需要加载进内存,这不是魔法,是计算机科学!

    硬核编程
  • 计算机怎么做到存储内容的(二)

    寄存器能存一个数字,这个数字有多少位,叫"位宽",早期电脑用 8 位寄存器,然后是 16 位,32 位,如今许多计算机都有 64 位宽的寄存器。写入寄存器前,要...

    硬核编程
  • XOR—布尔逻辑和逻辑门(三)

    XOR 就像普通 OR,但有一个区别:如果 2 个输入都是 true,XOR 输出 false。想要 XOR 输出 true ,一个输入必须是 true,另一个...

    硬核编程
  • 再谈mysql锁机制及原理—锁的诠释

    加锁是实现数据库并发控制的一个非常重要的技术。当事务在对某个数据对象进行操作前,先向系统发出请求,对其加锁。加锁后事务就对该数据对象有了一定的控制,在该事务释放...

    周陆军
  • 奖励推进:基于最大因果熵原理的转换政策

    原文标题:Reward Advancement: Transforming Policy under Maximum Causal Entropy Princi...

    Jarvis Cocker
  • ClassLoader(一)- 介绍

    讲到bootstrap class loader就不得不说三种常见的ClassLoader实现。

    颇忒脱
  • R语言:TCGA数据分析一

    在RANseqGene中case ID 为大写的,而Clincial中为小写的。需要对case ID 做转换。

    努力在北京混出人样
  • Asp.Net Web API(四)

        如果Web API控制器抛出一个未捕捉的异常,会发生什么呢?在默认情况下,大多数异常都会转换为一个带有状态码500的内部服务器错误的HTTP响应。

    莫问今朝
  • 夜深了才敢说这 3.8 个关于程序媛的小秘密

    这是哈佛大学天文学家皮克林发出的招聘,当时 Computer 专指从事复杂的数学计算工作的人。

    HyperAI超神经
  • python清除函数占用的内存

    原理是,locals()会列出当前所有局部变量,手动的把当前函数生成的开销都给清空掉即可释放掉内存。

    py3study

扫码关注云+社区

领取腾讯云代金券