与围棋相比,我有一句话概括了我对Rust的看法:“围棋是C程序员设计新的编程语言的结果,Rust是C++程序员设计新的编程语言的结果”。这不仅仅是一个比喻--围棋是由Plan9校友设计的,这是一个用C语言编写的操作系统,是围棋许多功能的灵感来源,而Rust是由Mozilla的人设计的--Mozilla的旗舰产品是世界上最大的C++代码库之一。
优秀C++程序员的价值观与优秀C程序员的价值观是不相容的1.如果您有相同的ASC++目标,那么Ruust是一个不错的C++替代品,但是如果您没有相同的目标,那么设计也会有非常相似的缺点。Rust和C++都是我喜欢称之为“厨房水槽”的编程语言,它们的简单性很明显。这些语言通过添加更多语言功能来解决问题。像C这样的语言通过编写更多的C代码来解决问题。
我根据这些语言每年增加功能的速度,对这些语言变得更加复杂的速度做了一些餐巾纸上的估计。我的方法不是很科学,但我确信这一点得到了理解。
C:每年0.73个新特性,以维基百科上的C11文章中的项目符号数量来衡量,该文章总结了C99的变化,并对C18没有引入新特性的事实进行了调整。
Go:每年2个新功能,以维基百科上列出的新Go版本的新功能数量来衡量。
C++:每年11.3个新特性,以总结C++14变化的C++17文章中的项目符号数量来衡量。
锈蚀:每年15个新特性,以过去一年主要锈蚀版本的发行说明中的标题数减去打印机之类的内容来衡量。
这充分说明了这些语言的稳定性,但更重要的是,它说明了它们的复杂性。随着时间的推移,人们很难保持最新的锈蚀心理图谱,也很难及时解决你的问题。去年写的铁锈程序看起来已经过时了,而十年前写的C程序很有可能还不错。系统程序员不想要闪亮的东西-我们只想要能工作的东西。$OTHER_LANGUAGE有什么非常酷的功能吗?不感兴趣。它会比它的价值更麻烦。
有了哲学上的愿望--洗掉障碍,定下基调,让我来回顾一下在考虑用Rust替代C语言时的一些更具体的问题。
C语言是可移植性最强的编程语言。Rust实际上为一种新语言选择了很多受支持的目标(这主要归功于LLVM),但与几乎可以在所有语言上运行的C相比,它就相形见绌了。除非有了C编译器,否则新的CPU体系结构或操作系统几乎不能被认为是存在的。一旦它这样做了,它就会解锁对用C编写的大量软件存储库的访问。许多其他编程语言,如Ruby和Python,都是用C实现的,您也可以免费获得这些语言。
C有一个规格。没有规格说明没有什么能让拉斯特保持诚实。它展示的任何行为都可能在明天改变。它会做一些奇怪的事情,可能是一种怪异的东西,也可能是一只虫子。只有当你的代码被破解时才能知道。他们不能放慢脚步来准确地定义铁锈的定义,这也表明了动物成熟的语言。
C有很多实现。C有许多相互竞争的编译器。他们一起强调规范,找出定义松散的角落,准确地确定C是什么。在其中一个中编译而不在另一个中编译的代码表明其中一个中存在错误,这给每个代码都提供了一个很好的额外测试层。通过许多实现,我们迫使C语言得到良好的定义,这对语言及其长期稳定性是有好处的。Rustc也可以经受住一些竞争,也许它会变得更快!2。
C具有一致和稳定的ABI。System-V ABI在各种各样的系统上都得到了支持,到目前为止已经达成了大部分共识。另一方面,锈菌内部没有稳定的ABI。您必须在同一版本的Rust编译器上编译和链接所有内容。唯一可以与生态系统的其余部分交互的代码是Undiom Rust,它是在Rust和外部世界之间的某种检查点编写的。外面的世界是存在的,它说的是System-V,而我们系统程序员花了很多时间和它交谈。
货物是强制性的。按照类似的思路,Rust的编译器标志并不稳定。将其与其他建造系统集成的尝试遭到了铁锈和货运团队的敌意。外部世界是存在的,而我们这些系统程序员花了很多时间来集成东西。铁锈不肯配合。
并发性通常是一件坏事。串行程序有X个问题,并行程序有X个Y问题,其中Y是您引入的并行度。C中的并行性肯定是一件令人头疼的事情,这也是我发现GO更适合这些情况的原因之一。然而,几乎所有的程序都不必是并行的。一个有效使用轮询的程序会变得更简单,性能合理,错误也会少一个数量级。“无所畏惧的并发”让你十有八九都能大胆地使用糟糕的软件设计。
安全。是的,铁锈更安全。我真的不在乎。考虑到所有这些问题,我将采用段错误和缓冲区溢出。我特别拒绝“在铁锈中重写它”--因为不管怎样,与维护C程序相比,从头开始重写整个程序总是会引入更多的bug。我不在乎你用什么语言重写。
C语言远不是完美的语言,它有很多缺陷。然而,它的替代将会更简单,而不是更复杂。以围棋为例,它在替代C语言解决许多问题方面取得了很大成功。它通过专攻某些类别的程序并用尽可能简单的解决方案来解决这些问题来做到这一点。它还没有完全取代C,但它在其问题空间方面取得了很大的进步--比我能说的Rust(它在C++方面取得了类似的进步,但肯定不是C)的问题空间要大得多。
厨房水槽的方法不管用。锈蚀最终会解决C++所存在的“万事通,无人管”的问题。明智的语言设计者应该从小处做起,保持小处不变。明智的系统程序员将这一理念扩展到设计整个系统,而Rust可能不会被邀请。我知道很多人,特别是那些已经迷恋铁锈的人,不会同意这篇文章的大部分内容。但是现在您知道为什么我们还在写C了,希望您不要再为这件事来烦我们了。
旁白:“C/C++”这个词激怒了我。它们是完全不同的语言。惯用的C++看起来与惯用的C++一点也不像。↩。
Ruust确实有一个与之竞争的编译器,但如果没有规范,很难定义其兼容性和正确性的级别,而且它总是在迎头赶上。-↩。
对我的一篇帖子有什么评论吗?通过发送电子邮件至~sircmpwn/[email protected],在我的公共收件箱中开始讨论。
您是一名自由软件维护员吗?在您的工作过程中,您是否正在与压力、苛刻的用户、超负荷工作或任何其他社会问题作斗争?请给我发电子邮件-我知道你的感受,我可以倾听你的同情心,分享一些经验丰富的建议。