使用 C 三十五年,我发现了它的三种替代语言!

 

如果曾经你问我具备哪五个最核心的软件技能?那么“精通 C 语言”必然是答案之一,然而现在一切发生了天翻地覆的变化.........

点击上方“CSDN”,选择“置顶公众号”
关键时刻,第一时间送达!


【编者按】著名的计算机程序员及黑客、《大教堂与市集》的作者、《新黑客词典》("Jargon File")的维护人、Fetchmail 程序作者 Eric S. Raymond(ESR)近日在个人博客上表示 C 语言的地位在逐渐下降,甚至已经出现了一些可替代系统级编程语言 C 的其他语言。

在已经使用 C 语言 35 年之后的今天,ESR 已经不记得上一次启动一个 C 软件项目的时间了。C 的统治持续了约 30 年,期间的应用编程语言如 Java、Perl 和 Python 都没有动摇 C,部分原因是这些语言的运行时开销太大,部分是 C 成功的锁定效应。后来只有 Python 取得了显著的成功,但它及其语言家族并没有好到能真正取代 C。直到现在,ESR 才真正发现三个能取代 C 的语言——Go、Rust 和其朋友编写的一门新语言 “Cx”。但在可预见的未来,操作系统内核和设备固件仍然会用 C 编写。

以下为译文:

如今系统语言的新浪潮正在挑战 C 语言在系统编程领域的霸主地位,尤其是 Go 和 Rust。回首过往,我突然意识到自己在 C 语言方面已经拥有了 35 年的经验,这让我很吃惊。曾经我每周都会用 C 语言写代码,但是现在我已无法记起最后一次使用 C 语言创建一个新项目是什么时候了!
目前越来越多的开发者在使用更加高级的语言,但是我仍把大部分时间都花在了 NTPsec、GPSD 和 giflib 这些内容上。如果曾经你问我具备哪五个最核心的软件技能?那么“精通 C 语言”必然是答案之一,然而现在一切发生了天翻地覆的变化,我不仅不用 C 语言来编写新代码,甚至记不清何时停止了对 C 语言的深入研究和探索。
C 语言的巅峰过往
在我最开始使用汇编语言的几年之后,C 语言诞生了。而我是在 1982 年到 1985 年之间从汇编转到了 C 语言。在那之前,有多种编译型的语言此起彼伏,试图吸引众多程序员的注意力,但是当时并没有哪一种语言占据主导地位。一段时间的竞争之后,大部分的不太成熟的编程语言都逐渐消失了。FORTRAN、Pascal、COBOL 等语言要么局限于遗留代码,要么固化在某一特殊应用领域,只有 C 语言得到蓬勃发展。

之后,C 语言的辉煌持续了近三十年。中途也有一些应用程序编程语言前来搅局。比如Java、Perl、Python 以及其他编程语言,但是都不太成功。这些编程语言出现的早期,我个人也几乎不为所动,很大程度上是因为它们的运行时间开销对于硬件的实用性来说太高了。当然 C 语言的成功也源于它的锁定效应,要连接到大量已有的 C 语言程序,那么就必须用 C 语言编写新的代码(有几种脚本语言试图打破这个障碍,但是后来只有 Python 在这方面取得了成功)。
现在回想起来,我在 1997 年时第一次用脚本语言开发了一个重要的应用程序,它是一个针对源代码分发系统 Sunsite 支撑库,使用的脚本语言是 Perl。
这个应用程序几乎全是和文本打交道,只需要以人类的反应速度进行响应(差不多0.1s左右),所以在 C 语言或者其他任何没有动态分配和真正的字符串类型的语言中显然是愚蠢的。但是我认为这是一个实验,当时没有预测到几乎不会再把“int main(int argc,char ** argv)”输入到新项目的第一个文件中。

1999 年我创建了 SNG(http://sng.sourceforge.net/)这个项目,这个应该算是我使用 C 语言编写的最后一个新项目,在 20 世纪之后我再也没有用 C 语言编写过新项目,我的角色是已有的 C 语言项目的维护者,比如 GPSD 或 NTPsec 项目。

创建 SNG 项目之后的很长时间我都坚持使用 C 语言编写项目代码,但是回想起来这是一个失误。因为遵循摩尔定律的硬件世界发展非常迅速,计算机运算速度越来越快,价格却越来越便宜,使像 Perl 这样的语言的运行时间开销不再是问题。三年之后,一个机会摆在面前,那就是用 Python 替代 C 语言来开发 SNG 项目,显然,我毫不犹豫。
相比 C 语言来讲,我个人更喜欢 Python
1997 年学习 Python 是我编程生涯的转折点。Python 真的太美妙了——就像我早年使用 的 Lisp 一样,它拥有丰富的库和一个完整的 POSIX,带有非常强大的对象系统。Python 并不排斥 C 语言并试图将其驱逐出我的技能树,之后我的开发方式就是只要能够用 Python 实现的一律用 Python,只能用 C 语言实现的我才使用 C 语言。

曾经我谈过《Perl 语言的教训》,其中心思想是:任何新的语言,如果没有一个完整的像 C 语言一样拥有基于 POSIX 语义的绑定,那么这个语言必将失败。计算机历史上充斥着大量失败的编程语言,归根结底就是这些编程语言的发明者没有把握这种必要性。

这样的说法可能有点夸张。但是使用 Python 编程确实非常简单,使用 Python 时我从来不用担心内存管理问题和 core-dump 问题,而这些问题对于 C 程序员来说简直就是家常便饭。很不明显的是,在 20 世纪 90 年代后期,应用程序中的成本与风险之间的折衷以及常写的非内核系统服务代码通常倾向于支付具有自动管理的语言的开销,以便消除那类缺陷。不久之前(当然迟至1990年),经常是无法承受的开销,摩尔定律还没有足够的周期来生效。

当我摆脱 C 代码迁移到 Python 时非常兴奋,这是一个大大减少程序复杂度的策略。我开始将其应用于 GPSD,并在 NTPsec中系统地进行。Python 的使用是我能够将 NTP 的大部分代码库削减四分之一的重要原因。

但本文不在这里讨论 Python。在 2000 年之前,并不是只有 Python 能够结束用 C 语言开启新项目的生涯,当时的编程语言非常多,任何新的学院派的动态语言都可能将我从 C 语言中拉出来。就在那段时间,其实我也写了很多 Java 代码。
其他语言的挑战
如今我回顾编程生涯的一些转变并将其写出来,那是因为我不认为只有自己有这样的经历,我的经历应该会引起很多人的共鸣。我相信同样的转变可能在本世纪之交改变了许多 C 语言老手的编码习惯,只是我们大多数人在当时还没有意识到这一点。

总得来说,怎样的语言可以挑战 C 语言呢?个人认为具备以下几点:

  • 简单的过滤器:这是说服 C 语言老手替换掉 C 语言最基本的理由;
  • 自动翻译器:将 C 转换成新的语言,直接沿用你已经使用 C 语言实现的功能,那么 C 语言老手会很高兴。
Python 和与之类似的语言不够好。比如尝试在 Python 上实现 NTPsec 将会是一场灾难,将会因 GC 导致的高运行时开销和延迟因变化而取消。Python 对于只能以人类速度响应单个用户的代码来说是足够好的,但通常不会用于需要以机器速度响应的代码(特别是在大量多用户负载下)。这不只是我的个人判断,谷歌作为 Python 的主要支持者也有同样的瓶颈。


Go 被设计为类 C。这非常糟糕,我们实际上没有一个自动代码提升器,但是想到在 Go 中使用我所有的系统工具并不会令我恐慌。其实我对这个主意很满意。我的 C 编码仍然在很大程度上适用,我也得到了垃圾收集和并发功能。

我想在“C 语言过时的原因”中加入 Rust ,但是我试图用该语言编写代码时,发现自己对 Rust 的了解还不够(http://esr.ibiblio.org/?p=7303),或许还需要五年的积累。

此外,还有另外一个。 我有一个朋友正在研究一种他称之为“Cx”的语言——类型安全性的影响很小的 C 语言, 他的项目的目标是明确地产生一个代码提升者,在最少的人力帮助下,可以提取传统的 C 代码库。在此我并不会过渡地吹嘘他,避免他飘飘然,但是这个方法对我来说听起来确实很合理。

在 2017 年即将结束的时候,我们有一个相对成熟的语言,看起来像 C 的大部分应用程序,但是要完全成熟可能还需要几年。我从事编程三十年 ,大部分时间都在这个领域工作,曾经并没有任何可信的 C 语言继承者,也没有任何关于系统编程后 C 技术平台的真实愿景。现在我们有三个这样的愿景,此时,我再说一遍:还有很长的路要走。
C 语言是否即将被取代?
不,在可预见的未来,我认为它将继续保持住它在操作系统内核和设备固件的有力地位,非常稳固。在这些领域,性能是非常重要的。
现在得以开放的部分就是我经常从事的那些——像 GPSD 和 NTPsec 这样的项目,系统服务和守护进程由于历史原因已经用 C 写好了。其他的典型例子就是 DNS 服务器和邮件传输代理——系统程序需要以机器速度进行通信和处理事务,而不是人的速度。

现在可以瞥见一些以往用 C 实现的代码将被那些具有强大内存安全特性的语言替代。Go、Rust 或者 Cx,以及其他语言,C 语言的应用领域确实在是缩小。就像,如果我现在重新开发 NTP 程序,我会毫不犹豫地选择 Go 来开发。
争议
对此,不同网友也发表了自己的看法:

@Nokinside:我认为与 C 语言相比, C++ 会被 Rust 和 Go 语言取代掉更多的应用领域。因为现在很难找到如 C 语言一样可以覆盖尽可能多的低级编程需求的编程语言。

@tengyft:不认为 Go 是一种系统级编程语言,Go 的领域与 C 不一样。Rust 是一种系统级编程语言,如果不是它那较怪异的语法,也许会比现在更流行。

@句龙胤:C 只会比 Go 这些莫名其妙的东西长久,现在这些所谓拳打 C/C++,脚踢 Java 的语言,无一例外都是可以被随时换掉的过眼云烟。具体为什么?因为语言在十几年前就已经停滞了,没有什么发展,这些所谓的新一代语言,无非就是内置不同的库而已。就比如 OOP,现在有 OOP 的下一代吗?根本没有发展出来,语言核心根本就没半点进步,几十年如一日,没有突破。这几十年就只是玩表面而已。

对此,你怎么看呢?欢迎在下方留言,分享你的见解。

原文链接:http://esr.ibiblio.org/?p=7711

作者:Eric Raymond

译者:安翔

责编:苏宓

————— END —————
这是一个转型 AI 的励志故事,从非科班到拿下竞赛一等奖
逃离北京?作为程序员的我在工作两个月的今天,露宿街头
数百种编程语言,而我为什么要学 Python?


    关注 CSDN


微信扫一扫关注公众号

0 个评论

要回复文章请先登录注册