1970-1979:这一年诞生出两个影响力极大的语言:Smalltalk 和 C。巧合的是这两个语言都是在 1972 年发布的。Smalltalk 一定程度上继承了 Basic 远离机器靠近人类的探索,发扬了语言动态性的思想,探索了面向对象的思想,模糊了编译型语言和解释型语言的界限,对后续的动态语言,脚本语言,客户端语言产生了深远的影响。
C 语言的诞生是为了满足 Unix 而设计的,当时 Unix 使用 BCPL 或 B 语言都无法满足操作系统对编程语言的要求,因此 C 语言应运而生。抛开语言特性,我们也能发现 C 语言的优势有非常多:不但有需求(开发操作系统的动机),还有经验的加成(尝试了 BCPL 和 B 语言,积累了大量的应用经验),并且遇到了好项目(Unix 操作系统),被最聪明的一群人使用(Unix 操作系统开发工程师),注定了 C 语言具有强大的生命力。这期间编程语言的思想已经成熟,面向对象思想在 Smalltalk 的推动下,成为下一阶段新语言首捧的特性。
1980-1989:由于面向对象在 GUI 领域具有独特的优势,借着这十年图形界面交互的高速发展的东风,面向对象思想发展进入快车道。这十年是面向对象思想横行的十年。还记得上个十年的 Smalltalk 和 C 吗?Smalltalk+面向对象诞生了 Self;C 语言+面向对象诞生了 C++;而 Smalltalk+C 语言+面向对象诞生了 Objective-C。苹果公司选择 Objective-C 作为其生态原生语言,使得我们在 2022 年还在写 Objective-C 的代码;C++和 Objective-C 对 C 语言的 100%兼容,使得这两个语言可以充分继承 C 语言的生态和人才,但是 Objective-C 的语法实在太别扭了,Objective-C 的关键字数量众多,并且语法没有一致性可言,在没有 IDE 补全环境下是最难写的语言。 C++保留了 C 语言的语法习惯和设计原则,从 C 切换到 C++几乎没有学习成本,并复用了 C 的生态,这使得 C++迅速流行起来。面向对象的思想在当时来看是实用且先进的,但是现在我们发现基于面向对象思想后面发展的各种设计模式开始把代码玩出花来了,需要学习设计模式的就那几个架构师,但是现在人手一本设计模式,把大象放到冰箱里这么简单事情都要先写一堆的抽象,把看代码把人绕晕...... 当然,这是面向对象思潮的后话了。这也导致后来很多人投向简单直接的 C 了(做了这么多项目下来,发现面向对象很多时候是过度设计的源泉)。
1990-1999:这是编程语言发展最快速的时代,得益于计算机平民化和图形界面的发展,计算机进入千家万户,应用开发的需求激增,编程语言的诉求开始发生变化:对性能要求变弱,而对安全(内存安全,线程安全),人性化(可读性,表达力,低门槛),动态性等提出更高要求。首先登场的是 VisualBasic,强化了 IDE 和编程语言的结合,降低了应用开发门槛。
前面我们从时间维度简单的从上往下捋了一遍,不难看出,主流通用编程语言主要受 2 个成熟语言(Smalltack 和 C 语言,且都诞生于 1972 年)的影响,有的语言被某个影响深一些,有的两者都汲取;接着主要往更安全、人性化、跨平台这三个方向进行发展,而在性能,语法,重用生态、扩展性,IDE 友好等多维度各有发展、取舍、借鉴。
同时我们也发现:编译型和解释型语言边界逐渐模糊,语法流行交替更迭,语法语义更加明确,语言的目标领域更加细化。别看近十几年新语言出了那么多,语法花里胡哨,其实很多语言同质化严重,类型后置也是早就玩过的,每个时代流行不同罢了。前面我们顺着时间简单过了一遍图中的部分语言,图中的信息远不止我们这里讨论的内容,限于篇幅还请点开大图品读。
展望未来二十年发展趋势
还是那句话,编程语言的发展离不开计算机领域其他技术的发展。编程语言发展至今,特性的互相借鉴的情况越来越普遍,语言生态互通也更常见(如直接兼容,或者 Bridging 技术),编译型和解释型界限也越来越模糊(比如 Dart 既能编译运行也能解释运行,还能边解释运行边编译),语言之间的性能差异也越来越小(V8 引擎,JIT,硬件性能提高),语言之间的互相转换也开始普遍(Kotlin to Java to JavaScript,Dart to Javascript),甚至在 AI 的加持下,准确的把具有垃圾回收语言(如 Kotlin)往没有垃圾回收语言(如 C)的转换也变得可能。
如果使用 AI 做预处理,静态检查和类型安全的语言没有了优势;如果使用 AI 辅助编程,我们甚至发现我们不是在写代码,而是在跟 AI 聊天(如最近很火的 chatGPT)!这时你还会纠结 AI 在使用什么编程语言吗?高级编程语言发展的黄金时代即将落幕,我们很难再看到像垃圾回收,空安全,异步等让我们兴奋不已的新语言特性了。当然,编程语言还是会继续往更安全、人性化(可读性、可写性)、跨平台这三个方向进行发展,但是 AI 辅助编程的出现让编程语言的使用者发生了一些变化,编程语言将同时被人类和 AI 共同使用,基于这个方向,那么编程语言的可读性(精简、语义准确)和跨平台会更加重要。
使用Copilot从js转换为python让我们继续展望,二十年后的发展趋势是什么?
探讨这个问题,我们要回到编程语言的初心:什么是编程语言?
编程语言是被标准化的,用来向计算机发出指令,让程序员利用计算机能力的工具。
简而言之,编程语言只是我们利用计算机能力的工具,小白用户能理解按钮,图片,短视频;计算机能理解汇编指令,这时需要一群聪明的人把用户需求转换为机器代码,这群人用编程语言让这项工作变得简单;二十年后我们还需要一群人专门设计交互、视觉、框架、代码来架起小白用户使用计算机的桥梁吗?到那时的人们也许分不清 AI 和计算机的区别了,到那时利用计算机的能力也许就像我们现在跟同事说话交流一样简单。
也许你会觉得 AI 也需要编程语言去实现,以方便后续的维护和迭代,但是也许那时 AI 已经具备自己维护自己代码的能力了,那时也许人类已经看不懂什么是 C++、Python,只有 AI 懂了,甚至 AI 自己发明新的编程语言编写了下一代的 AI(AI 可能已经觉得可读性是个包袱了,直接写机器代码不是更爽?)。就如第一个 C 语言编译器是用汇编写的,后面 C 语言编译器是用 C 语言写的一样。我们前面讨论的大部分的编程语言注定回到了历史的垃圾桶里,本来无一物,何处惹尘埃。 编程语言将在历史的发展中失去了作用和价值,成为未来博物馆中一个陈列的展品,向世人展示人类过去经历的苦难。