InfoQ 网站 和 InfoQ 技术大会都专注于挖掘技术采用生命周期模型中的创新者、早期采用者以及早期大众相关的技术应用案例,致力于促进软件开发及相关领域知识与创新的传播。不同规模公司的技术在采用曲线上的确切位置可能会有所不同。
20 世纪 40 年代,世界上第一个高级编程语言 Plankalkül 在德国诞生,这甚至发生在电脑发明之前。从那开始,每年都有新的编程语言被创造出来。到目前为止,计算机领域已有上千种语言。而关于“谁是世界上最好的编程语言”这个问题的争论,也从未停止过。
编程语言的流行与否,取决于时代的需求。古早如 BASIC、Pascal、FORTRAN 和 COBOL,享受过万众瞩目,如今也走向式微。C/C++ 和 Java 等语言老而弥坚,犹有青云之志,新的版本还在不断引入现代语言特性。移动互联网时代开启,Java、Objective-C 依托于平台取得更广泛的应用;作为这些语言的替代者(或者说另一个选择),Kotlin、Swift 等语言的应用也逐渐增多,慢慢成为新的平台王者。在人工智能与大数据热潮的加持之下,Python 热度居高不下,飞入寻常百姓家。JavaScript 仍在继续流行,与此同时,越来越多的前端项目尝试使用更安全、开发效率更高的 TypeScript 重构。Go 在服务器开发领域不断开疆拓土,前景光明。Rust 也在性能敏感的领域逐渐获得应用,大有替代 C/C++ 等传统语言之势。
没有最好的语言,只有最适合的语言。
1创新者:版本常更新,同名不同命
2020 年 3 月,Java 14 如期发布,而根据其每六个月更新一个版本的发布周期,Java 15 已经在路上。频繁的升级让人有些审美疲劳,甚至有点懒得去看有什么新特性。相较而言,长期支持版本 Java 8、Java 11 以及将于 2021 年 9 月发布的 Java 17 更值得关注,相关调查报告显示,目前仍有超过半数的开发者在使用 Java 8,还有一部分开发者在使用 Java 11,至于其他短期版本的使用者则寥寥无几。
为什么没什么人用,Java 还在不断发布新版本呢?我们认为这些短期支持版本可以看做是长期支持版本的超前点播,并非为生产而创造。而语言本身也需要根据时代的需求不断引入新的特性,向社区表示自己还在与时俱进。
新特性看起来不错,为什么你的项目仍停留在 Java 8 而不去迁移到更高的版本呢?大多数时候,升级版本是一件吃力不讨好的事情。而且,就算很多团队已经用上了 Java 8,但像 Lambda 表达式等 Java 8 中引入的新特性,普及率并不高。
传统互联网时代,Java 已是王者,Spring/Guice 的出现又给 Java 续了一命,到今天,Java 与几个主流框架和库的组合已经可以覆盖大部分常规的软件开发需求。像 Kubernetes 原生 Java 框架 Quarkus 就是为云原生时代而生的。二十五载光辉岁月,Java 江山犹在。
Elixir 这门语言可能很多同学都不会读。这是一门基于 Erlang 虚拟机的函数式、面向并行的通用编程语言。有同学戏称,它拥有“Ruby 皮,Erlang 心”,且青出于蓝而胜于蓝的语言。这门语言的特性也十分有趣——函数式、面向并发、动态类型。它还会主动帮你检查文档,是不是很贴心?它究竟是不是下一个十年的语言呢?可以保持关注。另外,我们关注到一个名为 Lumen 的项目,它是 Erlang VM(又称为 BEAM)的替代实现,旨在与 WebAssembly 一起使用,其特定目标是将 Elixir 和 Erlang 带入浏览器。这是否代表着 Elixir 和 Erlang 有机会进军前端?
Elm 是一门为前端设计的函数式编程语言,官网首页细数了它的多个优点,第一条就让人疯狂心动——No Runtime Exceptions。它值得研究。Elm 的作者 Evan Czaplicki 也曾在 QCon 北京做过分享。
还有一个编程语言,微软去年开源的 Q#,虽然它没有被列在榜单上,但是此处我们还是想简单提一下。根据官方介绍,“高级编程语言 Q# 旨在应对量子信息处理的挑战,它集成于一个软件栈中,可以把量子算法编译为对量子计算机的原始操作。”一门小众中的小众语言,或许会成为量子计算领域的主流语言。
2早期采用者:Strings 有几种写法?
Go 语言很火,但没有你想象的那么火。在 TIOBE 近一两年的榜单中,Go 语言在前 20 位中,总体呈现稳中有升的趋势,今年 3 月又一次冲进前十。而在国内,没有哪个大厂不做 Kubernetes,微服务和 Serverless,这些正是云原生语言 Go 的主场。
有亲爹谷歌的扶持,有大厂背书,社区和生态持续良好发展,Go 语言的前途一片光明。因此,我们认为 Go 语言有希望越过早期采用者阶段,进入早期大众阶段。
那么,Go 会挤走 Java 成为下一个企业级编程语言吗?你可能想得有点多。虽然 Go 语言可以胜任那些业务简单和追求极致性能的项目,但是复杂业务还是要靠 Java——业务越复杂,Java 越厉害。不过能在 Java 身上啃一口,已经足以证明这个语言的优秀。
Go 目前最大的一个问题就是泛型的缺失,或许我们可以期待一下明年的更新。
如果你能挺过编译凌辱期,那就来玩一玩 Rust 吧。Rust 是一门很优秀的语言,但它的学习曲线也是真的很陡峭。
我们举个简单的例子。在 C 语言里面,Strings 有一种写法,那就是 char*,而在 Rust 语言里,有十几种写法,比茴字的写法还多。每一种写法对应不同的内存管理需求,有只读的,有可修改的,有些支持 Unicode,有些只是字节串……
Rust 为 C/C++ 用户提供了另一个不错的选择,但你不能期望它被大范围使用。一是因为众所周知的历史包袱问题,二是 Rust 本身的门槛问题,你写业务的时候,愿意同时考虑内存资源吗?Rust 恰恰要明确的管理内存。
因此,我们认为目前 Rust 还是一门发展中的语言。它有长期维护版本,会持续变好,但不会大火,短期内 Rust 都将一直呆在早期采用者阶段。它有可能会抢走一部分 Haskell 的地盘,也有可能会失去一部分用户——一些用 Rust 语言的区块链开发者转向 Go 语言。
Dart 语言的目标是成为下一代结构化 Web 开发语言,近些年因为 Flutter 的火热受到的关注度出现大幅度增长,数月前,Fuchsia 选择 Dart 作为用户 UI 界面的正式官方语言。Dart 前景广阔。
一次编写,永远运行,Erlang 是一门宝藏语言,其让人耳目一新的设计理念给很多开发者打开了新世界的大门。为什么 Erlang 没有火起来,你看看 Lisp 火起来了吗?目前,Erlang 在国内的岗位偏少,主要是游戏公司用得比较多。
与其他语言不同,WebAssembly(WASM)是一个实验性的低级汇编语言,它于 2019 年 12 月 5 日被万维网联盟(W3C)确定成为 Web 的第四种语言。它让我们可以轻松编译 C / C ++ / Rust 等高级语言,将这些语言编写的程序移植到 Web 上,这对于企业级应用意义重大。目前大部分主流浏览器均已支持 WebAssembly,这使得 WASM 的前景十分广阔。
3早期大众:都是太子,谁更稳?
同样处于早期大众阶段的 Swift 与 Kotlin 这一对比较有意思,适合拉出来一起讲。一个是 iOS 平台的太子,一个是 Android 平台的太子。
iOS 平台开发没有太多好的选择,要么 Objective-C,要么 Swift。国内很多公司 Objective-C 还是主流。Swift 语言由苹果在 WWDC14 上推出,这是一门非常简洁、易于理解和调试的语言,但是其版本割裂的问题之前一直为人诟病,这个情况一直到 Swift5 实现 ABI 稳定才有所好转。重写项目成本不低,迁移到 Swift 对商业公司没有太大的额外价值,也没给开发者带来本质上的变化,因此 Swift 想在国内大规模火起来还挺难的。为了 Swift 的发展,苹果非常用心良苦,他们在去年的 WWDC 大会上发布了 SwiftUI,一个一次编码,五端通用的全新 UI 框架。可以想象,以后会有更多从零开始的项目首选 Swift 作为开发语言。
比起 Swift,Kotlin 的太子之路就要扎实许多。
2019 年 5 月,谷歌宣布推荐 Kotlin 成为 Android 开发的首选语言。谷歌钦点 Kotlin 为太子,也是因为这门语言和 Java 很像,我们甚至可以说它是高糖版的 Java。而且,Kotlin 可以无缝使用 Java 的一切生态,开发者不需要费太多功夫就能把 Kotlin 迁移到 Java。那 Kotlin 会在 Android 平台彻底取代 Java 吗?根据 Google 去年公布的数据,在 2019 年已经有半数的职业 Android 开发者选择用 Kotlin 来开发 App 了。相信有 JetBrains 和谷歌的护航,Kotlin 的发展会越来越好。
Python 是一门简单易学的编程语言。有多简单?连小学生都开始学 Python 了。Python 是数据科学的最佳工具之一,因此它成为数据分析和机器学习领域的主力语言一点也不让人吃惊。目前来说,除了 Python,以上领域还会有更好的替换语言吗?在人工智能和大数据热潮的加持下,我们相信 Python 将很快进入晚期大众阶段。另外,目前开发者正在使用的有两个版本,Python 3.x 和 Python 2.x,二者语法存在不兼容的情况。根据调查,Python 3.x 是绝对主流版本,Python 2.x 正在逐渐变少。官方会不会发布 Python 4.x?也许会,但也有可能再发布一个 Python 3.10。
在说 TypeScript 之前,必须得说一下它的主创,传奇人物 Anders Hejlsberg,他在 Borland 开发了 Delphi,后被 Bill Gates 亲自邀请到微软,接连创造了 C#、TypeScript,还主持了.NET 的开发工作。
TypeScript 是一门 KPI 语言吗?没事儿重构一下,彰显自身价值?那你就想岔了。如今,前端项目正在变得越来越复杂,项目规模越来越大,作为 JavaScript 生态的一部分,TypeScript 的强类型约束虽然带来了开发成本的增加,但是也帮助开发者减少了写出低级 bug 的概率,减少了后期维护成本。Vue3.0、Angular 2+、VSCode、Echarts 等知名项目都在用 TypeScript 重构,不经意间,TypeScript 已经在前端领域处处开花。TypeScript,真香!
4晚期大众:小众与领域主流不冲突
C 语言是很多程序员的启蒙语言,但能驾驭 C 语言的其实很少。一直以来,C 语言都是嵌入式开发领域的绝对王者。虽然我们对 C 语言的讨论远不如 Go、Python、TypeScript 等新生语言多,可这并不代表 C 语言已经衰落,它走到今天,已经不需要炒作。我们猜想,TIOBE 今年的年度语言很大概率就是 C。
硬件不死,C 语言不死。操作系统长存,C 语言长存。
和 C 语言一样,只要互联网的底层没有大的变化,C++ 就不会衰落。不过有传言称,最让 C++ 程序员头疼的不是 C++ 岗位少,而是入职后接盘的祖传代码和外包项目。
C# 是 Windows 第一语言,它语法优美,是 Windows 相关开发的不二之选。
JavaScript 在前端领域的地位不用多说,哪怕 TypeScript 等新语言出现,也不会对它造成太大的冲击,最终的结果就是这些语言统统变成了它的头花。著名的 Atwood 定律写道——任何可以用 JavaScript 来写的应用,最终都将用 JavaScript 来写。但业界还有一句话——JavaScript 的优点是可以写任何东西,缺点是你真的这样干了。
拥簇者爱之,嫌弃者有之,不管怎样,目前 JavaScript 在浏览器端依然无可替代,有了 Node.js,它在服务器端也不容小觑。至于火不火什么的,这不是 JavaScript 会关心的事,它已经不是小孩子了。
下面来说说 PHP 语言,它是不是世界上最好的语言我们不知道,但它绝对是被黑得最惨的语言之一。在 TIOBE 榜单中,PHP 始终保持在前十的位置。echo"Hello world!"史上最简单的 hello world 出自 PHP。许多大公司最初也是成长于 LAMP(Linux-Apache-MySQL-PHP)网站架构,可以说是有初创公司的地方,就有 PHP。不管怎么说,黑红也是红,PHP 实火。
Scala 生产力很高,在大数据生态圈的地位是公认的,SQL 是所有数据库查询的语言,Groovy 在大企业中的使用率也不低,Clojure 足够动态,足够 Lisp。这几种语言虽然小众,但在各自的领域做出了成绩。
Objective-C 在 TIOBE6 月榜单中排名 21,已不在前 20 之列。苹果强推 Swift,自有的 App 很多已经采用 Swift 开发,Objective-C 被 Swift 代替可能只是个时间问题。
Ruby 是每年都要“死”一次的语言,它在某些领域有统治地位,生产力和快乐编程是它的优点,但动态一时爽,重构火葬场也是它的缺点,所以用 Ruby 编程有时候也不是那么快乐。时代一直在发展,需求也在变化,我们很想知道,Ruby 未来的路在哪里?
在这里,我们希望大家能理解一个概念,小众与领域主流并不冲突。对主流语言来说,火可以吸引更多新血液为生态建设添砖加瓦。而对于小众语言,不火也算是一件好事,没有那么多嘈杂的声音,所以可以踏实做好自己的事情,找到自己的核心竞争力,在某个领域做到无可替代。
5落伍者:过气多年,突然翻红为哪般?
最后提一下 COBOL 这门过气多年却因为今年的黑天鹅事件突然翻红的编程语言。COBOL 语言的年纪比在座的各位都大,大多数 COBOL 语言开发者已经含饴弄孙。半个世纪过去,它还默默活在银行证券以及机关系统里,但即便今年翻红了一把,也改变不了一个事实——COBOL 已在日落黄昏时。
6写在最后
编程语言,对程序员有着来自灵魂的致命吸引力。也许,一个普通程序员,他有限生命的每一分钟都在写经验重复性的业务代码,但这不会阻止他探索一门老语言,学习一门新语言,哪怕这门语言他可能永远不会在工作中用到。
百家峥嵘,各有千秋,所有的编程语言,是人类积攒了半个多世纪的财富,是专门为你们准备的礼物,秃头吧,程序员!拥抱变化,一起奔涌在代码的河流!
足够有用,是一门编程语言跨越技术采用生命周期鸿沟的必要条件,否则它只会掉落死亡之井,彻底失去炒作价值。
有疑问加站长微信联系(非本文作者)