谁是世界上最好的编程语言?--编程语言70年浅谈

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

1、编程语言发展史纵览

严谨起见本文提到的编程语言指的是「第三代高级编程语言」。

首先我们从时间维度入手聊聊编程语言。一图胜千言我们从目前主流的编程语言中挑选出流行的、具有历史影响力的语言。把它们按时间从上往下排序依据类型和指导思想进行聚类根据互相的影响使用线条指向。在补充了一些关键性的特征和评价之后我整理出下图

在这里插入图片描述

整理图的过程中我发现很多有趣的点。让我们按时间顺序从上往下讲这张图。

Fortran

1950-1959**这期间出现了第三代高级语言的鼻祖Fortran 和 Lisp。**并且在 1958 年已经提出了结构化编程、递归、异常、函数式、命令式、垃圾回收等目前常用的概念。现在用到的大部分语言特性的理论的出现比我们想象的早。

CPL

1960-1969这一阶段IBM 的 ALGO 系列语言主要是对理论概念的探索和实践经过两个版本后诞生出 ALGO60 里程碑式的作品。**这奠定了现代高级编程语言的基础。**同时这期间也有 Basic 语言降了低编程门槛并第一次引入了「类型后置」的语法以更符合人类阅读习惯。

我们继续往右看发现一个独特的系列CPL 和 BCPL。这两个语言首次阐释了「特性不是越多越好」的黄金原则。因为拉长时间看CPL 是第一个想成为大而全的语言。从 CPL 到 BCPL 到 C都是在不断的减少特性从 C 到 C++再到 C++20特性又在不断增加。这时你就会明白为什么 C++语言会对添加新特性是那么谨慎和小心但是还是阻挡不了让 C++ 变成下一个 CPL 的步伐。

1967 年诞生的 Simula64 提出了面向对象思想。面向对象思想开始发展。

Smalltalk 和 C

1970-1979**这一年诞生出两个影响力极大的语言Smalltalk 和 C。**巧合的是这两个语言都是在 1972 年发布的。Smalltalk 一定程度上继承了 Basic 远离机器、靠近人类的探索方式发扬了语言动态性的思想探索了面向对象的思想模糊了编译型语言和解释型语言的界限对后续的动态语言、脚本语言、客户端语言产生了深远的影响。

C 语言的诞生是为了满足 Unix 。当时 Unix 使用 BCPL 或 B 语言都无法满足操作系统对编程语言的要求因此 C 语言应运而生。抛开语言特性我们也能发现 C 语言的优势有非常多不但有需求开发操作系统的动机还有经验的加成尝试了 BCPL 和 B 语言积累了大量的应用经验并且遇到了好项目Unix 操作系统被最聪明的一群人使用Unix 操作系统开发工程师。这些注定了 C 语言具有强大的生命力。这期间编程语言的思想已经成熟在面向对象思想在 Smalltalk 的推动下C 语言成为下一阶段新语言的首捧。

C++

1980-1989面向对象在 GUI 领域具有独特的优势。借着这十年图形界面交互高速发展的东风面向对象思想发展进入快车道。**近十年是「面向对象思想」横行的十年。**还记得上个十年的 Smalltalk 和 C 吗Smalltalk+面向对象诞生了 SelfC 语言+面向对象诞生了 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 了做了这么多项目下来发现面向对象很多时候是过度设计的源泉。

VB

1990-1999这是编程语言发展最快速的时代。这得益于计算机平民化和图形界面的发展计算机进入千家万户、应用开发的需求激增。

编程语言的诉求开始发生变化对性能要求变弱而对安全内存安全线程安全、人性化可读性表达力低门槛、动态性等提出更高要求。首先登场的是 VisualBasic。它强化了 IDE 和编程语言的结合降低了应用开发门槛。

Python

接下来到目前仍非常火的 Python 诞生了。Python 诞生在关键字和语法越来越复杂的年代。于是反其道而行之追求简洁的语法。最具有标志性的是为了省略“{}”直接用「空格缩进」来划分代码块这种语法首创是 1966 年的ISWIM语言。

有趣的是Python 追求的简洁语法不是其成功的关键由于 IDE 的进步这种语法的形式核心价值已经消失Python 成功的关键在于其出色的扩展性和跨平台。这让 Python 长期稳坐解释型语言头把交椅并且后来的同类语言都很难超越。另一方面Python 提出的「一件事最好是只有一种方法来做」的理念贯穿语言设计也成就了其优秀的学习曲线和低门槛的优点。所以一门语言能让人快速上手也是其核心竞争力。

JavaScript Java PHP Ruby

时间来到 1995 年这一年诞生了四个我们耳熟能详的编程语言JavaScriptJavaPHPRuby。说编程语言发展最快速的时代是这个时代不为过。**Java 对 C++ 做减法、增加了安全性成为历史上最成功的语言之一。**嵌入式、客户端、后台都有 Java 的身影。但是这种成功不会持续太久。因为Java 涉及领域太多了语言特性博而不精。这注定了 Java 在 20 年后的没落。但是话又说回来能在主流编程语言连续 10 多年榜上有名 Java 已经完成了的历史使命。

JavaScript 逐渐发展为浏览器上的原生语言。乘着 Web1.0、2.0 的东风依仗和低门槛的学习成本以及解释型引擎的快速发展JavaScript 已经突破浏览器领域的限制几乎无所不能。前端开发者们拿着 JavaScript 一次又一次的向客户端和后台阵地发起冲锋。ReactNative、Node.js 等技术炙手可热。

C#

2000-2010这是 PC 互联网的高峰和移动互联网的萌芽的时代也是我们记忆深刻的时代。C# 在 2000 年首发微软基于 C++和 VB 的经验借鉴 Java 推出了浓墨重彩的 C#。我们站在历史的高度可以说.Net 是失败的框架但是这都难以掩盖 C#的光辉。C# 和 Java 同样是对 C++做减法但是在很多细节上 C# 相对 Java 更接近 C++。由于 C# 搭上了不争气的搭档.Net不像 Java 那样一开始就那么成功。塞翁失马反而让 C# 的历史包袱非常轻。

**C# 在接下来的编程语言发展中多次成为第一个吃螃蟹的人。**C#给现代语言带来了非常多理念和思想从 C#1.0 到 C#11几乎一年一个版本。这发展速度其他编程语言只能望其项背。第一次接触可空类型空安全、??运算符、dynamic 类型都是在 C#。从工程角度来看.Net 和 C# 支持跨平台。它俩动作总是慢半拍错过了 PC 互联网和移动互联网的机会只在 Windows 平台流行了。

个人认为C++作为通用语言真的太成功了。但是它已经不是一门高安全性高人性化的一门语言开发出更友好的安全的「C++」变得迫切起来。这时出现了很多新的语言蠢蠢欲试其中包括 D 语言和 Rust**D 语言是 C++编译器作者设计实践的一门新语言它吸收了很实际项目的 C++经验教训。**但是仔细了解 D 语言你会发现这就是拿 C++编译器魔改的一个「私有 C++语言」编译器。这也导致很多 C++的弊病不能彻底废除属于改良派。

Rust

过了 3 年Rust 横空出世。Rust 在理念上有很大的进步比如虽然没有垃圾回收器。但是强制使用者明确对象的所有权通过所有权编译器可以在合适的时机释放内存。**这是流行语言第一次不使用垃圾回收方式解决内存管理问题在性能上比垃圾回收有着极大的优势。**虽然性能无损但是相比垃圾回收模式更需要开发者编码时增加对象所有权的思考过程。即便如此这也比在 C++花几个星期解决内存访问异常的问题好的多。**Rust 属于改革派。重新审视 C++的应用场景对语言特性重新设计这真的是一次精彩的尝试。**个人认为Rust 也比 D 语言更加成功。

GO

到了 2007 年对后台影响深远的 Go 语言诞生。当时大部分后台开发者还是用 C++或者 Java。我们前面说了 Java 注定会被替代Go 首先在后台开发尝试吹响号角。后面还会提到 Kotlin 在客户端尝试替代 Java。

**Go 的诞生是一个非常好的时间节点。**除了剔除很多 Java 的弊病还直击应用场景的痛点在性能多核网络并发上着重发力前进了一大步

另外Go 在工程上的成功展示其了语法特性上的新尝试Go 语言是近代第一个捡起类型后置的语言提供了丰富的语法糖如:=使得代码简短并语义明确这直接影响了后面的 SwiftRust、Kotlin 等有着改革雄心的语言。Go 的成功除了 Go 的优秀因素外我们也发现瞄准细分应用场景的语言在工程上是非常具有活力的。

Kotlin VS Swift

2011-2020这是移动互联网的快速发展时代最需要的是提高移动端高生产力语言。首先登场的是 Android 平台的 Kotlin。Kotlin 是 JVM 语言能直接复用 JVM 的生态。Kotlin 和 Java 有点像当年的 Objective-C 和 C但是不像 Objective-C 和 C 能混编。Kotlin 重新设计了语法规则大大提高了可读性和安全性。3 年后苹果公司也交出 Swift 的答卷。Swift 被简单的形容为 「没有 C 的 Objective-C」。Objective-C 花了 30 年终于摒弃了 C 语言的影响。

新的语言不能没有成熟生态的支持。和 Kotlin 与 Java 同是 JVM 语言不同Swift 使用桥接Bridging的方法得以复用 Objective-C 的生态。这未尝不是一次创新的尝试可以让 Swift 没有任何包袱而重新设计。Kotlin 和 Swift 都选择了更适合于阅读的类型后置——更简洁的语法更丰富的语法提高可读性和语义准确性。对于现有的大型项目的开发人员来说从 Java 到 Kotlin 或者从 Objective-C 到 Swift 有点难以适应。开个玩笑我们被 C 风格语言「荼毒」了这么久突然不荼毒了会很不习惯。

**在这个时期诞生的 Dart 旨意成为 Javascript 的接班人。**但是其关注度不多。随着 Flutter 的火热Dart 也进入了大众的视野。Dart 与 Kotlin、Swift 彻底断舍离 C 风格Dart 仍然选择 C 语言风格。

TypeScript

Dart 没有很好地成为 JavaScript 的接班人谁能想到下一年的 TypeScript 火起来了TypeScript 选择和 Dart 不同的方法接班——相比 Dart 激烈的方式TypeScript 完全兼容 JavaScript。TypeScript 还增加一些语法让编译器把错误提前暴露大大增强了 JavaScript 的安全性给 JavaScript 狠狠的续了一命让 JavaScript 可以继续「荼毒」程序员们。话说回来Dart 在安全性、性能方面都给 JavaScript 带来了巨大的进步也祝福 Dart 最终能顺利接班。

Carbon

2021-今虽然新语言在诞生但我们也不能忽视每个编程语言都在不断的发展和变化。在 2022 年谷歌推出的 Carbon旨在修复 C++的几个明显缺点提高 C++的可读性、安全性并平滑语言的学习曲线。Carbon 和 D 语言有点相似属于对 C++现代化的改良派但是和 D 语言不同的是Carbon 有个好父亲并且通过「双向互操作性」融入 C++生态也抛弃 了C++的历史包袱并使得语言的语法可以重新设计。

从 Java 被逐渐替代的经验教训中我们发现目前 C++在应用层正处于城池渐失的状态。我们应该明白应用层和底层框架的需求不同不应该从顶到底都使用一套语言。现在 C++ 所失之城池就是新语言非常好的机会。抓住应用层的安全、人性化、和与 C++ 的双向互操作性Carbon 确实是准确找到了定位。简而言之谷歌的 Carbon 还是备受期待的。

除了在应用层 C++ 有待进步在底层场景上的C++也有很大的进步空间。2022 年Herb Sutter 的实验项目 CppFront 值得一提。简单来说CppFront 通过给 C++增加一层预处理语法规则cpp2) 来提高 C++的易用性和安全性。和 Rust、Carbon 不同Herb Sutter 的这个实验项目不是寻找 C++的代替者而是 「寻找突破界限的方法」使 C++ 本身向前发展并加倍努力使用 C++而不是切换到其他东西。这是个为 C++标准探路的实验项目有丰富的理论和实验下一代 C++标准必然能焕发出新的活力。但是也别太奢望 C++能回到从前那样样能手的辉煌历史的经验告诉我们大而全的语言最后都会被替代。

我们从时间维度简单的从上往下捋了一遍不难看出主流通用编程语言主要受 2 个成熟语言Smalltack 和 C 语言且都诞生于 1972 年的影响。有的语言被某个影响深一些有的两者都汲取接着主要往更安全、人性化、跨平台这三个方向进行发展而在性能语法重用生态、扩展性IDE 友好等多维度各有发展、取舍、借鉴。

同时我们也发现**编译型和解释型语言边界逐渐模糊语法流行交替更迭语法语义更加明确语言的目标领域更加细化。**别看近十几年新语言出了那么多语法花里胡哨其实很多语言同质化严重。类型后置也是早就玩过的每个时代流行不同罢了。前面我们顺着时间简单过了一遍图中的部分语言这张大图可以帮助各位梳理思路。

在这里插入图片描述

2、 编程语言未来二十年发展趋势

**编程语言的发展离不开计算机领域其他技术的发展。**编程语言发展至今特性的互相借鉴的情况越来越普遍语言生态互通也更常见如直接兼容或者 Bridging 技术编译型和解释型界限也越来越模糊比如 Dart 既能编译运行也能解释运行还能边解释运行边编译语言之间的性能差异也越来越小V8 引擎JIT硬件性能提高语言之间的互相转换也开始普遍Kotlin to Java to JavaScriptDart to Javascript。甚至在 AI 的加持下准确的把具有垃圾回收语言如 Kotlin往没有垃圾回收语言如 C的转换也变得可能。

如果使用 AI 做预处理静态检查和类型安全的语言没有了优势。如果使用 AI 辅助编程我们甚至发现我们不是在写代码而是在跟 AI 聊天如最近很火的 chatGPT)这时你还会纠结 AI 在使用什么编程语言吗高级编程语言发展的黄金时代即将落幕。我们很难再看到像垃圾回收、空安全、异步等让我们兴奋不已的新语言特性了。当然编程语言还是会继续往更安全、人性化可读性、可写性、跨平台这三个方向进行发展。

但是 AI 辅助编程的出现让编程语言的使用者发生了一些变化编程语言将同时被人类和 AI 共同使用——基于这个方向编程语言的可读性精简、语义准确和跨平台会更加重要。

3、长期展望二十年后的发展趋势是什么

探讨这个问题我们要回到编程语言的初心什么是编程语言编程语言是被标准化的、用来向计算机发出指令、让程序员利用计算机能力的工具。

简而言之编程语言只是我们利用计算机能力的工具。小白用户能理解按钮、图片、短视频计算机能理解汇编指令。这时需要一群聪明的人把用户需求转换为机器代码这群人用编程语言让这项工作变得简单。

二十年后我们还需要一群人专门设计交互、视觉、框架、代码来架起小白用户使用计算机的桥梁吗也许到那时的人们也许分不清 AI 和计算机的区别了到那时利用计算机的能力也许就像我们现在跟同事说话交流一样简单。

也许你会觉得 AI 也需要编程语言去实现以方便后续的维护和迭代。但是也许那时 AI 已经具备自己维护代码的能力了也许人类已经看不懂什么是 C++、Python只有 AI 懂了甚至 AI 自己发明新的编程语言编写了下一代的 AIAI 可能已经觉得可读性是个包袱了直接写机器代码不是更爽。就如第一个 C 语言编译器是用汇编写的后面 C 语言编译器是用 C 语言写的一样。我们前面讨论的大部分的编程语言注定回到了历史的垃圾桶里。本来无一物何处惹尘埃。

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6