rust 前景

2019-12-05 09:56:10 +08:00
 Mivon

最近无聊学了下 rust,发现包管理真的很棒,就是语法晦涩了点,不知道国内有没有公司已经开始用了?

12501 次点击
所在节点    程序员
78 条回复
GeruzoniAnsasu
2019-12-05 21:29:35 +08:00
rust 是来替代 c++的
c++有几个问题导致它“难用”

内存管理很容易爆炸
语法过于复杂,难学
模板过于无拘无束,以至于衍生了太多泛型以外的作用,写和维护都很爆炸
缺少现代的包管理 /build 机制

这几个问题里
内存,现代 c++基本已经自行解决,语言层解决不了的(如因为操作系统机制导致的泄露 /溢出) rust 也无法解决
难学和难维护的问题,rust 倒退了一步。看着封装好的宏的时候可能挺爽的,读别人的代码依然酸爽
包管理是 rust 对比 c++真正的优势,但在很长一段时间里仅仅是看起来机制更好,并不存在实际的优势。你发现想用的 package 依赖 nightly build 的 rust,依然会很难受


综上所述 估计 rust 并不有能力去淘汰正在激进地往语言里加现代特性的 c++


当 c++和 rust 能做的事和实现方式都差不多的时候,反正我还是选 c++
ysn2233
2019-12-05 21:32:34 +08:00
我真的很喜欢这语言,但只能说前景确实不是很明朗。
shibo501c
2019-12-05 21:45:13 +08:00
一些区块链公司, 非区块链有 PingCAP, 头条, 好像阿里有个做数据库的团队也在用
TaAmSf
2019-12-05 22:55:30 +08:00
c/c++ 有 Qt,Nginx,FFmpeg..., rust 是很好,但是对于没有能力造轮子的人来说没啥用呀。
sherlockgy
2019-12-05 23:06:58 +08:00
@noqwerty 最新的新闻是微软安全团队试用了 Rust,并表示语言很不错但是当前又遇到了新问题;这两天又报道准备基于 Rust 开发新的语言了,估计是 Rust 先天有问题
noqwerty
2019-12-05 23:14:35 +08:00
@sherlockgy 大厂真的都热衷于造轮子
slanternsw
2019-12-06 01:57:42 +08:00
@tianshilei1992 这也太火星了吧,rust 除了一开始用 OCaml 写的 demo 期之外一直是 llvm 做后端,都多少年了
slanternsw
2019-12-06 01:59:21 +08:00
@sherlockgy 不是微软的意思,是 msr 又手痒想造语言玩了
ppphp
2019-12-06 02:37:00 +08:00
现在大方向是需要一门真正的在目前的硬件条件下汇集了人类共识的语言,rust 比 go 要好的多,但是硬件的发展是不会停的,现在方便正确的并发安全,编译期优化都有办法了,但是未来分布式安全,量子安全优化,异构编程这种乱七八糟的东西,谁知道会不会成为未来流行的趋势,一个个加进语言特性,真的会比 c++好很多吗?
tianshilei1992
2019-12-06 02:56:49 +08:00
@slanternsw 确实火星了,还以为一直是 OCaml 的东西呢…
FrankHB
2019-12-06 04:46:23 +08:00
@noobma 这很大程度上不是 Rust 的问题,是本来就没法回避那么复杂的问题。
要回避复杂,代价是放弃准确的控制。比如,放弃显式所有权抽象,在大多数语言中实际上就是允许所有资源默认扔给 GC 管理这种特例,而没法表达更一般的情况。这个意义上,一部分问题来自用户自己,没想清楚问题自然就无法表达——大部分用只有显式释放或者有 GC 擦屁股的语言入门的用户都会习惯性地忽略这个问题:到底是谁保证你能使用资源?
想清楚了这点,之后会发现实践中能不失控的有效的套路也就那么几种。像 strong 和 weak,就算有 GC 擦屁股的语言也可能提供相应的特性,比如 java.lang.ref.WeakReference。
当然,严格说,Cell、RefCell 和 Box 的问题对没见识够多不同风格语言的用户来讲,是要复杂一点,这涉及到更普遍的语言设计策略问题。
具体一点,Cell 之类必要性和理解困难,同时来自于 Rust 想削减抽象复杂性的背景而忽略了对象可变性和对象的同一性(identity) 在更普遍的情况下正交的现实。
和这种设计对立的一个典型例子是 C++ ,它的不可变性(imutability) 由附加在一般不限制修改的对象上类型的 const 限定符来限制,这保证一般的可变和不可变对象总是简单对偶的(如果忽略 volatile 以及常量表达式之类的更麻烦的东西)。配合 C/C++ 的对象作为存储(memory) 的抽象,这很容易让只读和不只读访问的内存一一对应而容易理解。
而在 Rust 中,一般地,不存在可变和不可变存储的概念,而只有“共享只读”和“独占可读写”对象的对偶。这样的好处是简化了需同步并发的操作抽象且在许多情况下更实用,代码默认不那么罗嗦而稍微不容易出错(特别是默认不可变引用的范式能避免 C++ 新手到处丢 const 的问题),坏处就是破坏了正交性,特别是不保证单独分辨同一性的手段,而使语言难以扩展不同于简单二进制表示的可修改性来定义变化(mutate) 的不同操作。(虽然大多数用户现在日常用不到,主流编译器的 constant propagation 都还没法基于扩展可编程的不可变性来让类型系统进行推理,但这至少对语言未来的演化仍然有消极影响。)
Rust 用 Cell 和 RefCell 提供了 UnsafeCell 的安全变体。而 UnsafeCell 提供了“内部可变性”。后者在动机上相当于 C++ 的类数据成员上修饰的 mutable。在 C++ 的设计中,const 对象类型蕴含子对象类型也具有 const,这种类型系统的实现策略使 mutable 作用显得直白——无视类类型对象的 const 对子对象作用( const 传播)这条类型系统默认规则。Rust 使用默认不可变而不是像 C++ 那样附加 const,这种内部不可变为什么必要在实现上就更加抽象而不容易理解(即使业务逻辑上“什么时候适合用”的理解难度应该是相同的)。
实际上 Rust 做得更多。为了确保安全,Rust 这里还可以具有运行时的类型检查。不过这在理解上就应该不是什么大问题了。
Box 在一定程度上也和避免表达同一性相关。这方面更典型的例子在一些传统上就不允许用户表达同一性的语言(粗略点说,就是和 ALGOL/C 相差得足够大的语言)上找到,可以参照 SRFI-111。
hehheh
2019-12-06 05:17:25 +08:00
@GeruzoniAnsasu 大公司都会搞自己的编译机制,我们公司在 cmake 的基础上又包了一层,搞了个什么 xxxmake。然后写起来确实很容易,都快赶上 python 了。。。最爽的是你还是可以用 cmake 直接配置工程的。

当然第三方包用起来还是挺麻烦。比如 qt 和 opengl 什么的。还是要稍微额外配置一下。
hehheh
2019-12-06 05:22:36 +08:00
其实编译器优化也是一个问题,我记得有的编译器如果用右值拷贝复制构造的话直接就优化调用构造函数了。再加上 c++进化的速度 2010 年以后还是稍微比原来好了点,现在新特性写起来也挺舒服。

当然不妨碍很多公司用 c++11 之前的标准,你没看错。我们用的就是 vs2010,部分支持 c++11 特性。。。
FrankHB
2019-12-06 05:28:20 +08:00
@GeruzoniAnsasu Rust 是想替代 C++ ,但历史包袱决定它做不到。
它没有足够多的难以替代的项目、厂商支持甚至用户的支持,也没有足够具有超过现有语言整体设计的格局,所以没法保证避免和更新近的语言之间菜鸡互啄(虽然大致上是鸡头)。
难学倒是未必,至少不像 C++ 有那么多鬼哭狼嚎教你如何翻车的劣质教材。
这里还有个洞,就是 C++ 理论上应该能允许用户做好,但没有核心语言特性用户实际就做不好的情形——比如早就有 mojo 结果 C++11 还是把右值引用直接内建了。这是加新特性的动力之一,但之后加进去坑就坑大。( C++ 为什么没有 destructive move ?因为类的子对象的构造怎么都不对头……)
Rust 历史包袱更少,就意味着在更 idiomatic 的用法和初期演化效率中都占有优势。C++ 用户基数大,历史包袱也大,加的特性越多就越作死,语言本身就越难以维护。并且现在 WG21 这方面的品味和水准就实在不咋地。凉拌吧。
难维护……看人了。某种意义上 Rust 的用户大致对应 C++ 用户的中间阶层——剩下的能用 C++ 写出可维护性不比 Rust 差的项目的用户以及被教残的 C++ 用户都不怎么会转进到 Rust,而没别的语言背景上手 Rust 是比较吃力的。

@TaAmSf C/C++ 在这里不占便宜。
用 C 的主要理由就是维护轮子,造轮子都嫌破事多。
用 C++ 的主要理由是维护轮子+造轮子。只是现在要用轮子的用户,基本连 C++ 也懒得用了,结果就是整个语言的发展都不会实质上朝能控制或进一步简化实质复杂性(而不是仅仅少写特定情况下的代码)的方向节制(即便 BS 成天嚷嚷 teachability ),而更在乎有能力造轮子的用户的需求。这样迟早一样会让没有能力造轮子的用户没事可做。

@sherlockgy @slanternsw 微软也就折腾 DSL 还行(不管是研究还是产品)。
MSR 搞 PL 的能出点名堂的都偏向现有问题上搬砖的具体实现而非整体设计,造越通用的语言越不顶用,也很难看出这些人有多重视这个方向。
看看那什么 Bosque 之流的水货都能带上微软的名号就知道这些人的态度了。

@ppphp 人类共识……就凭那一整坨连换行和 indent 都拎不清的蓝星猴子,你还是指望靠分布式共识发家致富比较有现实性……
方法论来讲,靠堆砌特性来设计语言是缺乏普适意义的错误方向,这点在几十年前 RnRS 的开头就说了(显然绝大多数语言在发展方向上这里就完全不合格)。然而现在 RnRS 自己都没太能搞定这个原则……
大部分有能力在这个方向上搞语言的,一开始就栽在用户不够就没用的调调上了,而要得到用户数量上的明显优势就必须妥协自己提供足够多特性,用户越多还越难拒绝,无法回头。这导致没有谁能实际上不违反不管是 PL 理论还是工程上的理想原则。
而更多的设计者根本就是完全没这个概念,只是先想出来让人用再说,到处一大抄,甚至毫不在乎被当作是外行(比如上面拿来婊的那个 Bosque )。
除非能保证对拒绝共识的用户专政,这就没办法收场。这是价值观问题。
FrankHB
2019-12-06 05:40:21 +08:00
@hehheh RVO/NRVO 这类 copy elision 是直接优化没掉。
替换 copy ctor 为 move ctor 是 C++11 后的内容,因为 move ctor 是 C++11 引入的。
C++17 钦定一些情况下直接没有新创建的对象,这些情况下不再是可选的优化了。这算得上是 C++17 最大的核心语言特性上的变化。
C++11 到现在包括 draft 里加起来能实用(有靠谱实现)的内容都没有一个 C++11 的变动大,之后多少特性一样要么跳票几次要么回炉重造,你说比原来好……是想 peach。
janus77
2019-12-06 09:00:12 +08:00
新版火狐就用 rust 啊
MeteorCat
2019-12-06 09:12:20 +08:00
@FrankHB 还有 socket 库问题,rust 官方附带了跨平台 socket,甚至 web 框架(actix 和 actix-web)
abbycin
2019-12-06 09:22:02 +08:00
@FrankHB 🌍果然是律师
jjx
2019-12-06 10:42:32 +08:00
学过, 用不下去

如果开发企业软件(业务类的) 用 rust , 要发疯的
jacketma
2019-12-06 10:49:38 +08:00
把 rust 改名叫 C+++就很快流行起来了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/626109

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX