批判Rust语言,以及C/C++为什么永远不会死
副标题[/!--empirenews.page--]
【编者按】此篇文章转载自Scott Huang的GitHub,以便更多语言爱好者学习和交流,尤其是C/C++和Rust,希望对各位有用。 以下为原文翻译: 简单讲,原文http://eax.me/cpp-will-never-die/是俄语,有人感兴趣,得到作者同意后,把它翻成英文。(译者:然后我再把它翻成中文。) 显而易见,这篇博文将会导致一场语言大圣战,所以,请思考两遍,确定你将会通过“有建设性的辩论”的评论参与讨论后再开始阅读这篇文章。 再次说明原文是俄语:) 注意:进一步讲,我冒昧的认为Rust有意尝试创建一个快速并且安全的语言。毕竟,Mozilla的人最初构思用它作为工具来开发一个浏览器引擎。如果它被证明是另外一个仅仅安全的语言,那么我认为 它没有达成目标。那里有许多非常不同的安全语言供人们选择和品味,如果Rust没有打算代替C++,那么:
如有你碰巧偶尔逛逛linux.org.ru论坛,那么请被提醒到这篇文章没有触及为什么不喜欢Rust的那10条纯技术理由。一条和亲爱的伙伴@sum3rman的Skype交谈透露出不止一种的“技术性”理由的看法。所以,我不得不承认,我下面罗列的东西不讨人喜欢,但是我还是冒险从中引用一些最感兴趣的条款到这里。实际上,一些普通共识的理由自己就足够大到不用触及技术性的讨论。 对于每一个理智程序员都非常清楚的知道的C/C++在近期不会死掉。没有人会尝试重用新语言新编写几乎所有已经存在的桌面应用程序,操作系统内核、编译器、游戏以及浏览器引擎、虚拟机、数据库、压缩工具、音视频编码解码器、一堆其他的C库等等。这是一批数量巨大的快速的、调试过的被时间证明了的代码。重写的代价太昂贵了和太冒险了,并且,诚实的讲,除了一些疯狂的Rust粉丝,没人会认为这有意义。对C/C++程序员的需求从来都是高的,并且在未来很长一段时间都是。 那么用Rust写一些新的代码怎么样? 嗯,你也许记得,这并不是第一次尝试创建一个“更好的”C/C++。拿D语言来举例。它在2001年发布,且确实是一个好的语言。但没有空间发展,没有合适的开发工具,没有著名的成功案例可以联想到它。OpenMW项目最初用D开发,但作者突然决定用C++从头重写。据他们坦白,他们收到一大堆的邮件说,“你们创建了一个很酷的项目,我想贡献一些力量给它,但是我们不懂,也不喜欢学习这个愚蠢的D语言”。维基百科告诉我们,除了D,还有有其它尝试准备杀死C++ - 举例说Vala、Cyclone、Limbo、Bitc。有多少人曾经听说过这些语言? 我觉得人们必须理解从历史中得到教训。没有一个理智的人会在他们的项目中开始使用一个新语言,直到你展示一些非常酷的开发支持工具,告诉他们一些成功故事,并且证明一堆程序员靠这个语言做日常工作维持生活。作为程序员,他们从来不会 - 除了一些最年轻的人 - 花他们的时间和健康来学习另外一种“非常棒”的语言,直到你展示一些非常酷的开发工具(不是未完工的像Racer工具那样)和许多确实准备好的库(不是“实验性的”或者“不稳定的”东西),告诉他们一些成功案例,告诉他们有许多空缺在他们的城市或乡镇。你知道,这就像“鸡和蛋”的两难处境。只有非常少的机会,这个问题确实得到解决(最近相关的案例是Go和Scala) - 这得感谢一些大公司(Google、Typesafe)的时间和金钱投入,他们基于某种理由认为值得推广一个新语言。 正如我提到的,有许多非技术性的理由单独就可以质疑Rust。但是,让我们假想一会儿这些理由都不存在。那么没有理由不用Rust写程序,对吧?好的,这一点仍然非常可疑,这么说吧。 C/C++被从很多方面批判。顺便说一下,大多数批评者还从来没有看过产品级的C++代码。简短的说,C++的问题是非常快(并且只需求一点点内存、电量,等等),但是从允许数组越界,自由的存取内存等方面看不够安全。过去,这个问题促使程序员们开发出一系列安全的语言,比如Java、C#、Python还有其他等等。但是,他们被证明和C++相比,对资源需求太多,同时还有其他一些不足 - 比如,比如当进行垃圾回收时“世界停止了”的问题。这也是为什么程序员争扎地去创建一个和C++一样快,但安全的语言。Rust是其中一个候选人。 Rust确实是安全的,但是,不幸的是,离快还差很远。在写这篇文章的时候,它和Java,go和Haskell的性能如下图所示: 我真诚的希望程序员找到一个方法来及时的加速,但直到那时,几乎没有语言比Scala或者Go对安全/速度进行妥协更加感兴趣。是否可以使一种语言同时具有速度和安全,或者是否由于对数组越界,安全包裹C语言库,或则其他一些类似东西而天生注定比C/C++慢两倍的问题仍然悬而未决。 顺便问一下,什么实际上使得Rust安全?简单的说,这门语言有内建的代码分析器,非常艰难的一条:它可以捕获全部典型的C++错误,不仅处理内存管理,而且同时考虑多线程。通过一条管道来传递一个指定对象的引用到另外一个线程,并且接着由你自己尝试使用这个引用 - 程序会拒绝通过编译。这确实非常酷。 但C++在过去30年一直屹立不倒,有大量的静态的和动态的分析器在这些时间段被发布出来。举一个例子,看一个关于Google sanitizers(明智分析器)的一个短片 - 他们确实非常难。不管怎么说,在任何一个严肃的项目中,你使用一个不断集成的系统,运行一大堆的测试来编译程序。如果你不这么做的话,那么你的麻烦比语言缺乏安全性而言会更糟糕,因为静态的类型不会保证程序按你的逻辑正确的运行!所以,由于你总是运行测试,为什么不同时使用。另一方面,如果你在你的代码的某个深处地方没有检查数组越界,并且Sanitizer也没有报告这个错误,也许,这仅仅由于所有必须的检查已经在上一层提供过了,同时,多一次检查不是会使程序变慢?即使没有sanitizers,你还可以发现许多东西供你在不同平台编译项目时提供伴随适当的失真的"assert(obj -> isvalid)"风格论断来检查你代码的不变性。粗糙的说,这个问题实际上源自过去那些好的圣战,关于异教徒和加尔各答接近软件开发(指的是,一项创新太理想化的尝试和一个传统经验主义者认为被前者的支持者无心简单化了 - 原译者注)。 (编辑:开发网_开封站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |