整理
苏宓
Rust这把火在微软AzureCTOMarkRussinovich的助力下,似乎越烧越旺。而每当波及编程语言时,纷争再起,这不,近日外媒TheRegister在发出“是时候在新程序中用Rust来让C、C++了吗?”的问句,引发了不少开发者的热议。
RustvsC++
相比编程语言榜单的Top级语言,Rust要稍显年轻一些。最初,Rust仅仅是由Mozilla的一位工程师GraydonHoare开发的,随后得到了Mozilla的赞助,目的是为开发他们的浏览器MozillaFirefox创造一个更好的工具。
年,Rust首次对外公开开发这个语言的计划。年5月,Rust1.0版本正式发布。作为一种多范式的编程语言,Rust专注于性能和安全,特别是安全并发。Rust在语法上与C++相似,但它提供更高的速度和更好的内存安全,不用自动垃圾回收,也无需手动释放。
在安全的内存管理方面,不少开发者视Rust是一种更具创新性的系统级语言,因为它不允许悬空指针或空指针。它是为了在不影响性能和速度的情况下做到安全、可靠而创建的。多数情况下,Rust被用来开发设备驱动程序和操作系统,如BlogOS、intermezzOS、QuiltOS、Redox、RustOS、Rux、Tafflin和Tock。它也被用于浏览器,如MozillaFirefox、游戏等方面。
HelloWorld用法示例如下:
fnmain(){println!("HelloWorld!")。}
与之相对应的C++,是由丹麦计算机科学家BjarneStroustrup开发的高级、通用的面向对象的编程语言,属于一种"类C"语言。C++的设计偏重于系统编程和嵌入式、资源受限的软件和大型系统,性能、效率和使用的灵活性是其设计亮点。使用C++,程序员可以对系统资源和内存进行高度控制,也可以为程序提供清晰的结构,并允许代码被重复使用。
从使用维度来看,C++方便开发者用较少的编译和执行时间建立超级快速的应用程序,因为它有丰富的标准库,称为"STL-库"。你可以建立各种各样的应用程序,从GUI应用程序到3D图形、游戏、桌面应用程序,以及核心计算机视觉应用程序。
HelloWorld示例如下:
#includeiostreamintmain(){std::cout"Hello,world!";return0;}
相比C、C++,Rust有什么样的优势?
整体而言,Rust的设计是以性能和安全为前提,C、C++更注重在速度提升上,安全性可能要排到第二位。
TheRegister也在文章中做出如此评价:的确,或许你总是可以写出完美安全的C和C++代码。只是,这对于大多数人而言,从来都不是一件容易的事。因为这两种语言都太容易造成内存错误了,如带来无效的堆和栈内存访问;内存泄漏;不匹配的内存分配和反分配;以及未初始化的内存访问。
现实中,也有不少企业在C、C++的安全上“翻了车”。此前,英特尔技术咨询工程师NaveenGv表示,"内存错误在C和C++应用程序中非常普遍,而且......可能难以重现,难以调试,而且纠正起来可能也很昂贵。"
早在年,微软称自年以来,所修复的CVE中约有70%是由于内存安全问题造成的。年,微软云开发者RyanLevick公开表示,“我们使用的语言很古老,来自不同的年代,无法为我们提供防范种种漏洞的能力。C++不是一种内存安全的语言,没人会真的假装它是内存安全的语言。”
除了微软,Google的开发者也在基于Chromium内核的网络浏览器代码中发现了同样比例的内存问题。
相较之下,使用Rust虽然无法%地杜绝安全错误的发生,但是它也不容易犯C、C++应用程序中常见的内存错误。另外,Rust还有一个优势,就是使得编写并发程序变得更加容易,这也有助于其在容器、云中落地应用。
Rust为什么突然爆火?
不过当论及Rust为什么在短短几年后的今天突然崛起,目前据Slashdata最新数据统计,Rust在过去一年中使用数量几乎增加了两倍,实则Rust的爆火的经历与曾经Python的经历有些雷同。也正如此前MegaEaseCEO陈皓(左耳朵耗子)曾分享过具有竞争性的技术无外乎有三个特性:
有杀手级应用:无论是什么技术,它一定要是能解决痛点问题的。
有大厂的支持:需要明白,大公司不会把钱浪费在一些“无用功”上,它一定会投资一些有价值的技术。譬如Go语言的背后是Google、Java的背后亦是很多巨头公司支持的。
有强大的社区支持。
对于Rust而言,其得以迅速崛起,一方面,离不开诸多大厂的投入使用。譬如,微软在VSCode、VisualStudio等工具都已经提供了对Rust的良好支持;Google于去年也宣布Android支持Rust语言来开发操作系统,并支持Linux内核引入Rust代码;亚马逊为此更早之前还聘用了Rust编译器团队负责人之一的FelixKlock,以及AWS从很早开始并宣布赞助Rust开源项目等等。
另一方面,基于Rust语言自身虽然并没有绝对的“杀手级应用”诞生,但是不乏顶级的项目引入。在Linux内核维护者峰会上,Linus提议将Rust支持合并到Linux6.1中。随后,微软AzureCTOMarkRussinovich在Twitter上公开呼吁,「现在是时候停止在C/C++中启动任何新的项目了,一切需要无垃圾回收语言的场景都该使用Rust。出于安全性和可靠性的考虑,业界应该宣布这些语言已经被弃用。」
不过,Russinovich并不是直接建议把所有已经用C或C++写好的东西都扔掉,其表示,“有大量的C/C++将被维护和发展数十年(或更长时间)。昨晚我为Handle编写了一个功能,添加到我编写的大约85,行SysinternalsC/C++代码中。也就是说,对于新工具,我会偏向于Rust。”
Rust会取代C、C++吗?
其实,Rust对标C++,宛如Kotlin欲对抗Java、TypeScript对标JavaScript、Carbon对标C++等,不过,对于Rust迟早取代C++这一说法,不少人持怀疑态度。
一位名为devjoe的网友表示:
我需要指出的是,任何将C和C++混为一谈的人一开始就脱离了正轨。C++是为了使那些在C语言中不可能实现的事情成为可能,它是通过显著地扩展C语言的语法和语义来实现的。这是两种不同的语言,解决了两种不同的问题。任何写"C/C++"的人如果混淆了这一点,我就怀疑这个人的能力。
Rust的目标是解决一些问题,这很好。在我看来,最值得注意的问题之一是可靠的错误处理,在这一问题上,C++可以很好地解决,但是Rust不行。Rust鼓励一种忽略错误的编码风格,因为通过返回值传回错误是很繁琐的。
相比之下,C++用异常来解决这个问题(这绝不是C++发明的),这也是对合格的代码编写有自己的一套要求。这并不是说你不能用Rust编写好的软件,其实你当然可以。很多伟大的软件也是用C语言写的,而且我确信在很多用途上,Rust表现要比C要好一些。
但是说实话,对于需要在现实世界中工作的大规模应用来说,用Rust取代C++?当然,你可以做到这一点。只要有足够的投资,任何事情都是可能的。但我不得不说,对于那些真正需要他们的软件在任何时候都能工作的企业来说,我不认为这种大规模的应用会发生。
为此,你怎么看?Rust是否会取代C、C++?
参考资料: