草庐IT

嫌 Rust 小家子气,大佬终于弃坑了!

言征 2023-04-11 原文

​作者 | Raph Levien

策划 | 言征

51CTO读者成长计划社群招募,咨询小助手(微信号:TTalkxiaozhuli)

多年来,我一直在参与 Rust 和 Rust 社区。我的大部分工作都与创建用于在 Rust 中构建 GUI 工具包的基础设施有关。然而,我发现我对这种语言越来越失望,我现在太渴望 C++ 的稳定与成熟了!

1、构建系统:Rust 生态小家子气

Rust 生态系统的局限性之一是 Cargo 构建系统和包管理器的近乎单一文化。虽然在某种程度上使用了其他构建系统(包括集成到更大的多语言项目时的Bazel),但它们并没有得到工具的很好支持。

相比之下,在 C++ 中,构建系统有很多选择,允许每个开发人员选择最适合他们需要的一个。一个非常常见的选择是 CMake(CMake是一个开源、跨平台的工具系列,旨在构建、测试和打包软件,通常用于使用简单的平台和编译器独立的配置文件控制软件编译过程),但也有 Meson、Blaze 及其变体,当然也总是可以求助于 Autotools 并进行制作。如果我们要编译 AIX 和 DEC OSF/1 AXP 等 Unix 系统,后者尤其有用。如果这些都不够,还有很多其他选择,包括 SCons,毫无疑问,我们会定期创建新的选择。

我们还没有为 Linebender 项目确定构建系统,但很可能是 CMake,并计划评估其他系统和迁移,也许是 Meson。

Linebender:包含许多诸如druid、xilem等许多流行的Rust存储库。

2、安全:三个原因放弃Rust

这一变化最具争议的方面可能是放弃了 Rust 语言的安全保证。但是,出于三个原因,我认为这在实践中不会成为大问题。

首先,我认为自己是一个足够优秀的程序员,我可以避免编写有安全问题的代码。当然,我曾负责过一些 CVE(包括Android 中的字体解析代码),但我从那次经历中吸取了教训,并且有信心在未来避免此类错误。

其次,我认为内存安全问题的危险被夸大了。Linebender 项目主要关注 2D 图形,部分是游戏,部分是用于创建 GUI 应用程序的组件。如果 GUI 程序崩溃,也没什么大不了的。如果错误是由于我们用作依赖项的库引起的,我们的客户会明白这不是我们的错。内存安全错误与逻辑错误和其他错误没有根本区别,我们只会在它们出现时修复它们。

第三,C++ 语言正在向更安全的方向发展。我们可以使用现代 C++ 技术来避免原始指针的许多危险(尽管字符串视图可以比它们的支持字符串更长寿,并且 UI 中使用的闭包可以有非常有趣的生命周期模式)。C++ 核心指南很有用,即使它们在违规中受到尊重。而且,正如下一节所讨论的,语言本身有望得到改进。

3、语言演化:Rust没有根本性的新功能

C++ 的一个显着特征是新功能的快速采用,现在每 3 年有一个新版本。C++20 为我们带来了模块,这是一项创新的新功能,我期待着很快就能真正实现这一功能。展望未来,C++26 可能会拥有堆栈协程、嵌入二进制文件内容以初始化数组的能力、安全的基于范围的 for 循环,以及许多其他好东西。

相比之下,Rust 的创新步伐变得更加稳健。它曾经非常快速,并且异步一直是一项重大努力,但最近登陆的特性(例如通用关联类型)更像是使现有特性的组合按预期工作,而不是带来任何根本性的新功能;即将推出的“type alias impl trait”与之类似。在这里,很明显,Rust 因承诺不破坏现有代码(由版本机制制定)而受阻,而 C++ 可以自由地在每个新版本中实现向后兼容性破坏性更改。

C++ 有更令人兴奋的变化值得期待,包括 Herb Sutter cppfront 提出的潜在新语法,甚至是新的 C++ 兼容 Carbon 语言。

幸运的是,我们在 C++ 社区中拥有出色的领导能力。C++ 之父 Stroustrup 关于安全的论文《A call to action: Think seriously about “safety”; then do something sensible about it 》是一份非常值得一读的文档,显示出对 C++ 面临的问题的深刻理解,并提出了一个引人注目的未来路线图。

C++之父去年12月6日发表有关安全的文章

4、社区:Rust 社区有点专横

我将以关于社区的一些想法作为结束。我尽量不花太多时间在社交媒体上,但我听说 Rust 社区可能非常专横,不断要求用 Rust 重写项目,并诋毁所有其他编程语言。我会很高兴摆脱它,并且相信 C++ 社区会更好、更友好。特别是,C++ subreddit 以其幽默感而闻名。

Rust 社区还以其行为准则和其他促进多样性的政策而闻名。我坚信编程语言应该不受政治影响,严格关注技术本身。在计算机科学领域,我们已经超越了偏见和歧视。我理解某些身份群体可能希望获得更多代表权,但我认为没有必要。

5、结论

Rust 是一个很好的实验,有些方面我会深情地回顾,但现在是时候将 Linebender 项目变成一种成熟的、生产就绪的语言了。我期待与 C++ 社区中的其他人进行富有成效的协作。我们正在寻找帮助 C++ 重写的人。

原文链接:https://raphlinus.github.io/rust/2023/04/01/rust-to-cpp.html

有关嫌 Rust 小家子气,大佬终于弃坑了!的更多相关文章

  1. ruby - 使用 Ruby FFI 调用 Rust 库时出现段错误 - 2

    我想将String传递给Rust库,但它总是会抛出段错误。代码如下://lib.rs#[no_mangle]pubexternfnprocess(foo:String)->String{foo}还有Ruby文件:#embed.rbrequire'ffi'moduleHelloextendFFI::Libraryffi_lib'target/release/libembed.dylib'attach_function:process,[:string],:stringendputsHello.process("foo") 最佳答案 免

  2. ruby 弦使用rust 并再次使用rust - 2

    我正在尝试将Ruby中的字符串传递给Rust可执行文件,对其进行操作并将操作后的字符串传回。到目前为止,我可以传入字符串并返回它,但我不知道如何将它转换为使用rust字符串,对其进行操作,然后将其传回ruby​​。这是我目前所拥有的://lib.rsusestd::ffi::CStr;#[no_mangle]pubexternfnreturn_string(test_str:&CStr)->&CStr{//workingfuncitontest_str}#[no_mangle]pubexternfnmanipulate_and_return_string(mystr:&CStr)->&

  3. 零基础如何入门网络工程师?12年资深大佬,吐血整理最强学习指南 - 2

    最近收到好多学员的一些提问,零基础没经验,能不能转行到网络工程师?发展前景怎么样?薪资能有多少?应该有不少朋友都有这个疑问,那么,今天我尽量给大家做出一个详细的解答,希望能有所帮助。​内容可能比较长,大家可以点赞收藏,再慢慢阅读。零基础没经验,能不能转行到网络工程师?​想要快速学习并入门网工行业,最快速也是效率做高的方法就是考取行业的相关证书。就像其他行业一样,也有属于网工的认证。网络工程师这个行业,现在最具有含金量并被行业承认的两个认证:思科和华为。简单说一下两者的区别:​ 从含金量角度来看。两者的含金量其实差不多,HCIE是华为认证的最高等级证书,CCIE是思科认证的最高等级证书,两者在网

  4. javascript - 就在我认为我终于理解了 Javascript 作用域的时候 - 2

    我遇到了一些事情,这说明我显然还不明白。谁能解释一下为什么“this”的值会在下面发生变化?varMyFunc=function(){alert(this);varinnerFunc=function(){alert(this);}innerFunc();};newMyFunc(); 最佳答案 在JavaScript中,this表示函数被调用的上下文对象,而不是它被定义的范围(或它被调用的范围).对于MyFunc,this引用正在创建的新对象;但是对于innerFunc,它引用全局对象,因为调用innerFunc时没有指定上下文。这

  5. javascript - 将 JavaScript 字符串传递给编译为 WebAssembly 的 Rust 函数 - 2

    我有这个简单的Rust函数:#[no_mangle]pubfncompute(operator:&str,n1:i32,n2:i32)->i32{matchoperator{"SUM"=>n1+n2,"DIFF"=>n1-n2,"MULT"=>n1*n2,"DIV"=>n1/n2,_=>0}}我正在成功地将其编译为WebAssembly,但无法将operator参数从JS传递给Rust。调用Rust函数的JS行如下所示:instance.exports.compute(operator,n1,n2);operator是一个JSString和n1,n2是JSNumbern1和n2被正确传

  6. javascript - 为什么 NodeJS 在计算素数和方面比 Rust 快? - 2

    我编写了一个基准测试来计算前10000个素数的总和,并将Rust与JavaScript进行了比较。NodeJS上的JavaScript是Rust、Scala和Java中最快的。尽管这些程序有意使用函数式风格来测试素数以展示Rust的零成本抽象的优势,但NodeJS击败了它们。NodeJS这种动态类型运行时怎么能这么快?Rust代码fnsum_primes(n:usize)->u64{letmutprimes=Vec::new();letmutcurrent:u64=2;letmutsum:u64=0;whileprimes.len()JavaScript代码functionsumPri

  7. 历时两天,我终于在TensorFlow里面调用起来了gpu - 2

    新买的笔记本怎么配置TensorFlow-gpu新买的笔记本怎么配置TensorFlow-gpu为了更好地学习深度学习,我今年斥重金买了一台联想-拯救者-R9000,除了P9000之外,这台电脑的配置应该算是笔记本当中的天花板了。但是买来半个月,一直在修改自己的论文,所以除了新的鼠标灵敏度高,打开word不卡之外,也没有体验到天花板有多香。这几天论文改的差不多了,心中又燃起了对深度学习的浴火(主要是想看看这个天花板的性能有没有外界说的那么神)。结果!结果!家人们,咱就是说,吊起来了,内心雀跃之余,得给广大网友分享这份喜悦。具体的心路历程和配置步骤如下:判断自己的电脑适不适合安装TensorFl

  8. javascript - 青鸟的 promise ——然后终于 - 2

    我在Bluebird/Promises中遇到了一些问题。对于Promise1,无论是调用fullfill还是reject,一切都正常。然而,当我们在finallyblock中返回Promise2时,它仅适用于reject和fullfil,我们在then的回调中得到undefined。functiongetPromise1(){returnnewPromise(function(fulfill,reject){fulfill("OK1");});}functiongetPromise2(){returnnewPromise(function(fulfill,reject){fulfill

  9. Rust自定义安装路径 - 2

    1、下载安装包下载地址:InstallRust-RustProgrammingLanguageAlanguageempoweringeveryonetobuildreliableandefficientsoftware.https://www.rust-lang.org/tools/install 运行之后我们发现,会默认安装在C盘。 2、在需要安装的目录下分别建两个文件夹,名为.cargo与.rustup3、配置环境变量右键此电脑->属性->高级系统设置->环境变量编辑"Path"变量,新增"%RUSTUP_HOME%"与"%CARGO_HOME%" 4、开始安装Rust这时候我们重新运行R

  10. performance - 为什么在 Go 中交换 []float64 的元素比在 Rust 中交换 Vec<f64> 的元素更快? - 2

    我有两个(等效的?)程序,一个在Go中,另一个在Rust中。平均执行时间为:开始~169ms使用rust~201ms开始packagemainimport("fmt""time")funcmain(){work:=[]float64{0.00,1.00}start:=time.Now()fori:=0;i使用rust我用--release编译usestd::time::Instant;fnmain(){letmutwork:Vec=Vec::new();work.push(0.00);work.push(1.00);letnow=Instant::now();for_xin1..100

随机推荐