编程语言发展史小结

348 阅读6分钟

0X00 说在前面

笔者才疏学浅,这篇文章多半是今天复习编程语言总结来的,在每个语言的语法细节上不完善,有错误和漏失的地方请指正~

0X01 溯源 TypeScript

任何一种技术都不是凭空出现的,因此循着技术发展的脉络回望其发展的历史可以解决很多困惑,也可以对技术的起源有更好的认知,当然,这同样也是我的小爱好。
因为对编程语言的发展一直很好奇,所以趁着五一假期就去看看 TypeScript 这个语言的前世今生。

0X02 远古时期的编程语言

在没有汇编语言和高级语言的时期,上古的程序员直接面对计算机的 01 数字串编程,这样的编程形式对人类极其不友好。于是汇编语言应运而生。作为一种相对来说可读性更强的语言,汇编语言同时确保了执行的效率。

然而受限于汇编程序的有限能力,汇编语言并不能为编程提供更抽象的数据结构,其直接编辑内存和使用地址指定控制流的流向的方式也非常容易出错,因此高级语言的出现成为一种趋势。 高级语言的原始形态是一种叫做 CPC Coding Scheme 的编程语言,该语言受到 Analytical Engine Order Code 的影响。(这两种上古编程语言的 wikipedia 已不可考,也没有对应的中文译名)

在 1952 年,受 CPC Coding Scheme 的影响,一种名为 Glennie AutoCode 的编程语言出生,同期 SpeedCoding 编程语言问世。它是第一个能够运行在 IBM 计算机上的高级编程语言,首先用于支持 IBM 701 机型上的浮点数计算。(插一句话,浮点数计算的需求来自计算天文坐标的需求)它通过伪指令的方式进行数学运算。在运算时,运算控制流将唤起不同的子程序。虽然它是第一个高级编程语言,但它的速度相比于机器码慢了 10-20 倍。

受 SpeedCoding 的影响,FORTRAN 在 1950s 诞生于 IBM。主要作用仍然是科学计算,并且至今仍然在科学计算和高性能计算领域使用。FORTRAN 在之后的不同版本中继续提供不同的语言特性、例如结构化编程、面向对象编程以及并发编程。FORTRAN 的出现成为后续编程语言的奠基石。

在受 FORTRAN 影响的诸多语言中,有一种叫做 ALGOL60 的语言,它是 Algorithmic Language 1960 的简写,在之前编程语言的基础上引入了代码块的概念,代表了结构化编程语言的出现。它是第一种实现了嵌套函数定义的编程语言。

与 ALGOL60 几乎同期出现的另一个语言叫做 Lisp。Lisp 一开始作为一种在程序中表示数学标记的标记语言而生。Lisp 作为最早的编程语言之一,发展迅速,很快就发展出了树形数据结构、自动内存管理、动态类型、条件控制、高阶函数和递归等概念。其中,链表作为 Lisp 的主要数据结构,Lisp 源码也是主要用列表来实现的,因此该语言能够将源代码以数据结构的方式组织和操作,为之后的宏编程创造了必要条件。其中代码和数据的转换使得 Lisp 产生了可识别的语法。

0X03 新阶段:奠定编程范式

在进入 1960s 之后,编程语言的发展进入了一个新阶段。在这一阶段里涌现出了许多新的思想和高级编程语言。

Simula 语言受 ALGOL60 的影响,在原有基础上引入了类、对象、继承和子类和协程等的概念,成为了世界上第一个面向对象编程语言。第一版本的 Simula 主要用于模拟和建模,虽然它之后成为了一种通用编程语言并且应用于许多面向对象框架设计中。

Smalltalk 继承了 Simula 的一部分思想,引入了动态类型反射的语法特点。同期出现的语言还有 Scheme 和 ML。ML 是 Meta Language 的缩写,是一种通用的函数式编程语言,引入了多态类型系统,自动指定类型以确保类型安全等语法特点。

0X04 模块化思想出现

受上一段提到的三种编程语言影响,在 1980s 出现了 Self、Perl 和 Miranda 三种编程语言(当然这一阶段出现的所有语言不止三种,这里仅列出 TypeScript 发展脉络上的语言)。在这一时期,由于 RISC 的出现,编译技术得到了重视和发展,与此同时,模块化思想和泛型特点也出现在这一阶段的语言中。

Self 语言在面向对象编程的基础上引入了原型的概念,同时兼具动态类型和即时编译的特点。Perl 语言多作为一种胶水语言,同样是动态类型的语言。Miranda 相对来说比较小众,采用了缩进风格的代码解析,并且是第一个引入纯函数编程范式的语言。

0X05 语言特性再组合

时间来到 1990s,编程语言的发展收到了同期互联网快速发展的影响,这一阶段的语言没有涌现出太多令人印象深刻的新特性,反而是原有语言特性的重新组合。

JavaScript 受 Self 语言的影响,是第一个能够在浏览器中运行的语言,它是用了 Self 中面向对象函数式编程和事件驱动的特点。同期 Ruby 受 Perl 的影响,成为了一种解释型的关注于编程效率和简洁性的语言,而 Haskell 语言受 Miranda 的影响,成为了一种静态类型具有类型推断功能的语言

0X06 TypeScript 出现

在 2012 年,受 JavaScript、Ruby 和 Haskell 语言的影响,TypeScript 出现。它在 JavaScript 的基础上引入了动态类型,支持类 C++ 的类型定义文件的存在。

0X07 结语 & 疑问

嗯,作为一个 TypeScript 的前世今生的小结,这篇文章就结束了。但我还是有很多疑惑。编程语言的发展史与其说是语言的发展史,不如说是不同语言对应的核心库和运行时环境的发展史。因为对于高级语言来说,所有代码都需要经过编译/解释程序和汇编程序转换成机器代码才能运行。从低级语言到高级语言的差别之一就是抽象程度不同。那么再天马行空一点,可以认为流程图也是一种表示流程的抽象程度很高的语言、对于前端来说,页面也是一种抽象程度很高的语言(这里的抽象程度都相对于机器码来说)。那么最近大热的低代码是否本质就是一种更高级的抽象语言向高级语言的转换呢?