近日,TIOBE 公布了 2020 年 5 月的编程语言排行榜,C 语言时隔 5 年重返榜首,Java 和 Python 分列二、三位。
 
  前段时间,B 站推出的青年节演讲视频《后浪》在朋友圈刷屏,看着“后浪”们丰富多彩的生活,同事们纷纷自嘲自己就是被拍在沙滩上的那一个,被生活疯狂蹂躏。然而在编程语言界,“后浪”们掀起的波澜则十分有限。与近年来陆续涌现的新兴编程语言相比,那些出道即巅峰、一巅几十年的“前浪”们,似乎还没有要退位让贤的意思。
 
  在 TIOBE 公布的最新编程语言排行榜中,排名前十的语言中有 8 个诞生于上个世纪 90 年代,最“年轻”的是诞生于 2001 年的 C#,而位于榜首的 C 语言距今已有 48 年的历史。如果我们再来纵观自 2002 年以来的编程语言排行榜,基本上也还是这些老牌编程语言的身影,尤其是 C 与 Java 这两位“前浪”老大哥的江湖地位一直难以撼动。
 
  数十年来,陆续出现的新兴编程语言不在少数,其中不乏一些以取代某种老语言为目的而设计的,那么这些编程语言界的“后浪”们,是否能够追上“前浪”们的脚步呢?下面不妨让我们来看看这些年编程界的知名“后浪”们。
 
  诞生于 2009 年的 Go 语言堪称编程语言中的“星二代”。Go 的早期作者有三人,分别是 Rob Pike,Ken Thompson 和 Robert Griesemer,每一位的来头可都不小。Rob Pike 曾是贝尔实验室的 Unix 团队以及 Plan 9 操作系统计划的成员,与 Thompson 共事多年,并共创出广泛使用的 UTF-8 字元编码;Ken Thompson 则是 B 语言、C 语言的作者,Unix 之父,1983 年图灵奖和 1998 年美国国家技术奖得主;而 Robert Griesemer 在开发 Go 之前是 Google V8、Chubby 和 HotSpot JVM 的主要贡献者。
 
  2007 年,Rob Pike 认为 C++ 在 Google 分布式编译平台上的编译过程太过漫长,于是他和 Robert Griesemer 开始探讨 “简化编程语言相比于在臃肿的语言上不断增加新特性,会是更大的进步”。两人一拍即合,随即说服了身边的 Ken Thompson,三人决定要捣鼓一门新语言。几天后,他们在 Google 内部发起了一个叫 Golang 的项目 。很快,一个在 C 语言基础上进行了优化的新语言诞生了,这就是 Go 。 
 
  作为一个设计目的就是为了取代 C/C++ 的新语言,Go 的语法在很多地方借鉴了 C/C++ 。比如用花括号作为定界符,以分号作为语句结束等等,这使得 Go 很容易就能被精通 C/C++ 的开发人员接受。而在沿袭 C/C++ 基本语法的基础上,Go 新加入了很多针对当下流行的分布式系统的实用功能,比如超轻量级的线程 goroutine,在高并发的系统中,可以按照多线程的方式写程序,从而保证逻辑的清晰和简单,又可以获得非常高的性能。而同样的事情在 C++ 中则需要调用第三方框架,如果用多线程,会导致系统线程过多带来大量的上下文切换 overhead;如果采用基于消息的架构,虽然可以获得较高的效率,但程序逻辑会被打散,可读性和可维护性较差。
 
  此外,Go 语言作为 Google 大力支持的“亲儿子”,拥有编译、测试、调试、性能分析等一整套成熟的工具,编译效率极高,再加上其还内置了 http、json、xml、正则表达式等很多后端系统开发中常用的库,可以说是一门已经非常成熟的工程化开发语言。而在这方面,C++ 则需要用到大量的第三方开源工具或库,在工程上需要花费更多的精力进行技术选型,同时也不利于后期维护。
 
  基于上述的优点,Go 语言被公认为非常适合构建命令行实用程序和网络服务等,尤其是云计算场景下的高并发应用,如今广泛流行的容器引擎 Docker、容器编排系统 Kubernetes 都是用 Go 编写的,Go 也因此被一些人称为“容器语言”。 
 
  虽然 Go 在很多方面已经超越 C/C++,并且在云原生相关领域占有了一席之地,但是仍然难以撼动 C/C++ 语言在大量工业基础设施终端的地位。C/C++ 的优势仍然在于它的运行效率,如果是低级设备驱动程序、内核空间操作系统组件以及其他需要严格控制内存布局和管理的任务,C 依然是不二之选。 
 
  目前,Go 在各种权威编程语言排行榜上都名列前茅,且一直呈上升趋势,在云原生建设如火如荼地当下,Go 至少在“云”这一领域已经完成了对前辈的超越。
 
  前浪 C++(1979) VS 后浪 Rust(2010)
 
  Rust 是继 Go 之后另一个试图取代 C/C++ 的新语言。2010 年前后,随着大规模业务的拓展和分布式计算的流行,Graydon Hoare 也和 Rob Pike 一样看到了 C++ 等传统编程语言在高并发场景下的缺陷,试图创造更优秀的语言来替代它们。Rust 原本是 Graydon 从 2006 年开始捣鼓的个人项目,随后该项目得到了 Mozzila 基金会的资助,而 Graydon 本人也于 2009 年加入 Mozzila 公司,带领团队完善 Rust 语言的开发。2010 年,Mozzila 正式对外透露了 Rust 的存在。2013 年,Mozzila 基金会宣布将与三星合作,使用 Rust 语言开发一款浏览器引擎 Servo,成为首个使用 Rust 编写的大型项目。2015 年,Rust 首个 1.0 正式版发布。
 
  Rust 最初是 Mozilla 为了解决软件在语言级别上无法真正利用多核计算带来的性能提升而创建的,这一点与 Go 有些类似。相比前辈 C++,Rust 在代码安全这一特性上下足了功夫。比如内存安全方面,Rust 在安全代码里不容许空指针、悬垂指针和数据竞争,这些问题在编译阶段就无法通过。Rust 社区核心开发者 Nichols 表示:“之前,我们只能使用 C 或者 C++ 才能编写具有较低内存占用空间的高质量代码。但是,在生产代码中使用这些语言需要你手动管理内存并了解可能导致未定义行为的所有方法。”Nichols 指出,不断扩展的 CVE 代码漏洞数据库证明,即使是最优秀的程序员也疲于应对层出不穷的代码漏洞。“为了确保你安全地使用内存,Rust 编译器非常严格,这样你就可以专注于你真正想要解决的问题。”  
 
  尽管 Rust 凭借其代码安全的特性获得了部分开发者的青睐,但由于其无论是在性能还是语法上,均不足以颠覆 C/C++,再加上其学习曲线并不平滑,因此与“家大业大”的 Go 相比,Rust 在前期的发展不温不火。直到去年 7 月,微软突然宣布将拥抱 Rust,探索用 Rust 作为 C/C++ 和其他语言的安全替代方案,以此来改善应用程序的安全状况。微软认为 Rust 是目前业界系统编程的最佳选择,原因不仅是它能够以内存安全的方式编写系统级程序,还在于其精密性。
 
  微软此举让 Rust 在开发者中的地位直线上升,越来越多的企业和个人开始关注并重视代码安全的问题,从而重新审视这门新语言,这主要体现在 2020 年以来围绕 Rust 语言发生的几件事情:Linux 内核维护者表示愿意接受用 Rust 开发 Linux 驱动;AWS 宣布赞助 Rust;微软更进一步,在今年年初开发并开源了受 Rust 启发的新编程语言 Verona;最近,苹果也站出来拥抱它,计划将部分 C 代码移植到 Rust 。 
 
  目前,Rust 语言的发展总体来说仍然比较缓慢,根据最新的一份调查报告显示,大多数不愿意接受 Rust 的开发者认为,Rust 目前的问题主要在于学习曲线陡峭、缺少所需的库、缺乏 IDE 支持等。可以说,Rust 的发展仍然任重道远。 
 
  前浪 Objective-C(1986) VS 后浪 Swift(2014)
 
  Swift 是为数不多的成功把“前浪”拍在沙滩上的“后浪”。
 
  2010 年,或许是受到竞争对手 Google 推出 Go 的启示,Apple 高层也决定开发一套新的编程语言,用以替代使用了数十年的 Objective-C,而最早接到这个任务的人正是 Chris Lattner。Chris 在大学还没毕业的时候就成为了业内知名的编译器专家,其硕士期间发表的论文奠定了 LLVM 框架的发展基础。在加入 Apple 公司以后,Chris 创造的 LLVM + Clang 成为了 Apple 软件产品的编译框架。而 Swift 语言就是 Chris 继 LLVM 与 Clang 之后的又一力作。 
 
  Swift 是一门博采众长的现代语言,在设计的过程中,Chris 参考了 Objective-C、Rust、Haskell、Ruby、Python、C# 等语言的优点,最终形成了 Swift 的语法特性。与前辈 OC 相比,Swift 的语法更加简洁,例如行尾不再需要分号,if/else 语句也不需要括弧,调用方法时 [ ] 也不再嵌套,支持字符串插入,省略了 OC 中的 %s,%d,%@ 等等。同时,Swift 把 oc 头文件 .h 和实现文件 .m 合并成了一个代码文件 .swift,使得 Swift 代码更易于维护。最重要的是,擅长优化的苹果工程师让 Swift 的运行速度能够逼近 C++,是 OC 运行速度的近 1.4 倍。在 Swift 诞生以后,苹果软件的开发者只需要维护原来一半量的代码文件,大大提高了开发效率,降低了维护成本。
 
  目前,Swift 几乎已经完全取代 Objective-C ,成为苹果旗下 MacOS 、iOS 的主流开发语言,很多刚刚入行的 iOS 新人开发者甚至没有接触过 Objective-C 。不出意外的话,Objective-C 很有可能在不久的将来被人们逐渐遗忘。然而 Swift 团队的目标似乎远不止于干掉老大哥这么简单,在即将发布的 5.3 版本中,Swift 将增加对 Windows 和其他 Linux 发行版 PC 操作系统的支持(目前仅支持 MacOS 和 Ubuntu),至于其后续发展如何,我们还将持续关注。
 
  前浪 JavaScript(1995) VS 后浪 Dart (2011)
 
  Dart 是 Google 工程师们继 Go 之后造的又一个轮子。与 Go 类似,Dart 最初也是一群 Google 工程师觉得 JavaScript 不太行,因此想要重新造一个更好的语言取代它,于是就有了 Dart 。
 
  Google 工程师认为,JS 当初从设计到发布的时间极短(仅为 7 个月),在语言规范和谨慎性方面存在先天不足,比如语法过于松散、缺乏模块化能力、核心库不完备、编程语言范型不明确等,且难以用改良的方式来修复。事实上,Google 工程师多年来也为改善 JavaScript 的性能做出了诸多贡献,特别是通过 V8 引擎强化了 JIT 对 JS 的编译能力,从而让 Chrome 浏览器的性能一骑绝尘。 这足以说明当时的 JavaScript 在 Google 工程师眼里确实存在很多问题。
 
  Dart 最初也是作为一种在浏览器中运行的脚本语言而生,Google 还专门在 Chrome 中内置了一个 DartVM 引擎用来对 Dart 进行推广 。得益于 Chrome 庞大的用户体量,这一举措让 Dart 积累了规模可观的早期用户群体。
 
  原以为在 Google 的保驾护航下,Dart 能够稳步发展并最终赶超 JavaScript。然而令 Google 没想到的是,半路竟杀出了一个 Node.js 。Node.js 是一个 JavaScript 运行环境,它让 JavaScript 可以开发后端程序,实现几乎其他后端语言实现的所有功能,这意味着 JavaS