一年多 Rust 的了解,对蠢蠢欲动的同学一点建议

2019-01-29 18:42:04 +08:00
 VDimos

本来是前端,由于 webAssembly 的逐渐普及,从去年开始从 Rust 的那一本教程入手,看完以后又看了 Rust reference,接着看了 Rustnomicon,又大致浏览了一遍 Rust Doc,还有 cargo book。最后总结了以下:我觉得 Rust 应该是昙花一现的产物,因为它实在是太复杂了。

如果你不需要做 FFI 之类的,我个人还是不建议深入学习 Rust,有兴趣当然是好的,但是 Rust 需要花费的时间不是一天两天,对比其他的语言,比如 C,Rust 显得更复杂和困难。

Rust 保证的安全性的代价就是入门曲线很高,对于习惯了脚本语言或者 c 类语言的程序员而言,Rust 显得不是那么友善。我学这门语言更多的是因为学习兴趣很高,时间充沛,但是对于大多数人而言,时间以及语言( Rust 的文档除了教程以外几乎都是英文)问题,或许并不值得去学习。

更为重要的一点是,Rust 标榜的是安全性,对于很多人而言,Rust 的这种安全性根本不知道用在哪里,因为它的实战场景太少了!!! Rust 的最大的开源后台开发库 Rocket.rs ,甚至现在也没发布 1.0 版本,而且更多的是 Rust 目前几乎没有像诸如 java 之类的,甚至是 golang 之类的新语言,一套完善的开发栈可供参考。更多的是自己踩坑,自己挖坑自己踩!

Rust 是门从设计层面就假设你是个有很强逻辑以及经验的程序员,但是这个假设并不是什么时候都成立。Rust 的所有权系统有时候显得很“臃肿”,虽然有诸如 Rc 和 RefCell 之类的 struct 可以弥补。举个栗子来说,很多初学者在看完教程之后,基本的数据结构,诸如双向链表、二叉树之类的,都不能写出来,更糟糕的是,甚至完全没有头脑(我承认我就是这种人)。

Rust 我最爱的是它的宏!如果你是 C 之类的开发者,对 C 的宏忍无可忍,那么 Rust 的宏是真的只能用“美丽”来形容!

如果你是从事嵌入式、图形处理之类的,我强烈建议你深入了解 Rust 这门语言,它的安全性或许正是你所需要的!

Rust 目前是 2018 版本,这个版本修复了很多饱受诟病的 Bug,我很期待这门语言的发展与未来。

总结来说,如果你是一个初学者,或者时间不够,或者精力不够,或者语言(英语)能力不强,那么我建议还是不要碰这门语言了,如果有一天 Rust 发展得无比繁荣,那么 Rust 可以学一学,但目前看来,并不会(求打脸!!!)。

如果你是从事底层开发,对 C 语言的内存泄漏的问题很头大,那么 Rust 很适合你!但同上,时间和精力是问题。

29313 次点击
所在节点    程序员
85 条回复
file0X0088
2019-01-30 14:36:39 +08:00
你一个写前端的渣,学 rust 当然学不到精髓,拿 RUST 对比 C 难度就知道你的基础,不要张口就来,,,
redme
2019-01-30 14:54:33 +08:00
真没见过 rust 写的大程序(是不是 firefox 是 rust 写的阿)
linxy
2019-01-30 15:02:47 +08:00
LZ 炸鱼成功,已经跑路了!
starqoq
2019-01-30 15:28:05 +08:00
@redme #61

https://github.com/servo/servo
这个是 Rust 写的浏览器内核,Mozilla 钦定的下一代 Firefox 内核。

( Mozilla:说我已经钦定啦?你们不要想搞个大新闻。)
so898
2019-01-30 16:05:15 +08:00
@starqoq 昨天还看到新闻说火狐钦定的下一代内核是 Chromium,当时就一股天下大同的感觉……
auxox
2019-01-30 16:20:47 +08:00
@redme TiKV
kaichen
2019-01-30 17:04:13 +08:00
@Mohanson 你拿 subtrace 应该对标 cosmos-sdk,不应该去对比 go-ethereum
tairan2006
2019-01-30 18:14:37 +08:00
Rust 火不了,这个没问题
danc
2019-01-30 18:50:51 +08:00
对于 @q397064399 大神所提问的安全性,应该这么解释:“ Rust ’ s rich type system and ownership model guarantee memory-safety and thread-safety — and enable you to eliminate many classes of bugs at compile-time.”,就是说 Rust 的类型系统和所有权模型保证了内存安全性和线程安全性 - 使您能够在编译时消除许多类错误。也就是说,你在不使用“ unsafe 块”的前提下(大部分情况下都不会用到),很难写出野指针乱飞或者线程不安全的代码,因为编译不过去,更别说一些低级错误。大部分情况下,你的程序只要能够编译过去,运行起来也没有什么问题。
danc
2019-01-30 18:53:46 +08:00
@justfly "巧了 我就是喜欢这种学习曲线陡峭学会之后又用着很爽的东西" -------- 苦尽甘来
willm
2019-01-30 20:49:00 +08:00
Rust 的定位就是系统编程语言,主要瞄准目前 C/C++的市场,而这块市场其实并没有那么大。绝大多数的开发场景对性能和运行时安全性的要求都没有达到这个程度,Rust 的特性是很好,但某种程度上来说,对于大多数开发者属于屠龙之技。大部分开发者都是 CRUD 和业务逻辑,或者调包侠,根本没有机会,也没有能力去做浏览器内核、游戏引擎系统级别的编程。而真正做这种工作的人,又不会产生 Rust 有没有用处的疑问。
willm
2019-01-30 20:50:53 +08:00
所如果从找工作、升级加薪走上人生巅峰的的视角来看,Rust 绝对不是个好选择
upsuper
2019-01-30 21:48:56 +08:00
对 Rust 的应用场景有所怀疑的,我们可以举几个国内的例子。PingCAP 用 Rust 这个众所周知了,字节跳动前一段也一直在招 Rust 的人(并不好招,毕竟会的人还是少),阿里巴巴前一段上线了一个用 Rust 写的时序数据库替代 InfluxDB,引用开发者的话“系统消耗对比低好几倍以上,另外查询性能也有很大改善”。此外我有听说 B 站和知乎的后端组件里也有用 Rust 实现的,但具体应用情况不清楚。
exch4nge
2019-01-30 22:11:54 +08:00
一直再观望 Rust 目前为止最希望赶紧定下来的是对异步 IO 的支持,虽然有第三方的 mio,但目前还是感觉不够好,官方的 future/async/await 还一直没定下来,本来以为 Rust 2018 能把这个 feature 定下来,发现还是没有定。
Rust 为了使代码内存安全牺牲了很多东西,这个得失确实也不太好评判好坏,只能说在一些场景下确实利多一些。
总之 Rust 语言本身的设计还是有很多值得学习的地方的,包含了很多现代 PL 的特性,学一学没有坏处,自己开发用一用也没什么问题,不过生产环境中还是需要团队再三考虑的。
lampwu
2019-01-30 22:34:45 +08:00
@willm 嵌入式 /iot 有在尝试着用 Rust.
vagranth
2019-01-31 00:19:20 +08:00
目前正在因为工作原因看 rust,这么说吧,作为一个还算过得去的 java/c++程序员,rust 给我的感觉是哭笑不得。
基本我每写一行代码要出现 3 个编译错误,而且 google 不到怎么改,要再回头去看概念,然后连猜带蒙各种绕圈解决问题。
当然,这语言好处很明显,就是用来替代 C 的,但不是替代 java/c++。
trait
2019-01-31 00:28:43 +08:00
@upsuper 仰望 servo 大佬现身说法
danc
2019-01-31 01:06:46 +08:00
对于 @exch4nge 大神提到的 future/async/await,这个东西确实提了好久了,但到目前为止,我还不知道 future/async/await 这几个东西能派上什么用场。实际中涉及到网络通信或者线程间同步的部分,我都喜欢用 epoll/poll + eventfd。比如我在上面提到过消息队列,就是两个线程,一个线程中用 epoll,负责网络通信,另一个线程里用 poll,负责消息转发逻辑,你可以利用 eventfd,把你自己的数据结构注册到 epoll/poll 里面。但是,这个程序如果用
future/async/await 那一套,我还真不知道该怎么搞。所以,现在就是做好的时候,不要观望了,抓紧开始吧。
danc
2019-01-31 01:17:30 +08:00
@vagranth 大神说的没错,rust 学习曲线确实过于陡峭了,“而且 google 不到怎么改”,大部分情况下,你都不需要去谷歌的,认真看编译器给你反馈的信息就好,比如:

fn main() {
let foo = 123;
foo = 456;
}

这段代码是有问题的,编译器会给出一些警告和错误:

Compiling playground v0.0.1 (/playground)
warning: variable `foo` is assigned to, but never used
--> src/main.rs:2:9
|
2 | let foo = 123;
| ^^^
|
= note: #[warn(unused_variables)] on by default
= note: consider using `_foo` instead

warning: value assigned to `foo` is never read
--> src/main.rs:3:5
|
3 | foo = 456;
| ^^^
|
= note: #[warn(unused_assignments)] on by default

error[E0384]: cannot assign twice to immutable variable `foo`
--> src/main.rs:3:5
|
2 | let foo = 123;
| ---
| |
| first assignment to `foo`
| help: make this binding mutable: `mut foo`
3 | foo = 456;
| ^^^^^^^^^ cannot assign twice to immutable variable

error: aborting due to previous error

For more information about this error, try `rustc --explain E0384`.
error: Could not compile `playground`.

To learn more, run the command again with --verbose.

然后, “ help: make this binding mutable: `mut foo`”,编译器会提示你把 “ let foo ” 改成 “ let mut foo ”。
大多数情况下,编译器都会给出友好的提示。
xkeyideal
2019-01-31 09:19:47 +08:00
你们都没说到点上,PHP 是世界上最好的语言,没有之一

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

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

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

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

© 2021 V2EX