V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
newghost
V2EX  ›  Rust

感觉 RUST 上手难度有点高开发速度有点慢,

  •  
  •   newghost · 2022-07-07 11:28:34 +08:00 · 10967 次点击
    这是一个创建于 905 天前的主题,其中的信息可能已经有所发展或是发生改变。
    个人比较喜欢 RUST 的无 GC 设计,

    感觉主体思想是让变量出了当前函数(域)就自动回收,但这样也引出了一大堆变量所有权及标注,生命周期,借用 /引用等概念和独特用法,应该是 RUST 里独一份了

    导致在其它语言很简单的功能在 RUST 就要多写很多代码,理解一大堆概念,感觉开发效率慢很多,不知道大家有没有这个感觉?
    49 条回复    2022-09-22 11:49:09 +08:00
    yazoox
        1
    yazoox  
       2022-07-07 11:39:12 +08:00
    完全不懂 rust
    顺便过来看看,大家有没有啥书籍或者视频等等推荐,俺好入个门......
    NoNewWorld
        2
    NoNewWorld  
       2022-07-07 12:13:36 +08:00
    正常,毕竟哪有完美的。
    sunny352787
        3
    sunny352787  
       2022-07-07 12:16:53 +08:00
    没错,上手很难,所以当年我从 Rust 和 Go 中选择了 Go ,不然带人太累了
    march1993
        4
    march1993  
       2022-07-07 12:19:34 +08:00
    用完就回收=完美程序实现吗?
    先等等 积攒一堆了一起回收=不可靠吗?
    ke1e
        5
    ke1e  
       2022-07-07 12:29:07 +08:00 via iPhone
    个人感觉现在 rust 的太多设计都是为了妥协编译器;不过好在没有比 rust 编译器提示更友好的了
    hbdh5
        6
    hbdh5  
       2022-07-07 12:41:43 +08:00
    RAII, ownership, lifetime 这些都不是 rust 首先提出或实现的。rust 只是把这些许多概念集成到一起的语言里最成功的。
    qrobot
        7
    qrobot  
       2022-07-07 12:45:46 +08:00   ❤️ 3
    @march1993 用完回收,就是最完美的, 如果先等等,积攒一堆, 那么这个时候 gc 就消耗非常严重了, 可以说成本很高很高
    rming
        8
    rming  
       2022-07-07 13:03:58 +08:00   ❤️ 1
    @ke1e rust 编译器确实厉害,一个教你写代码的编译器
    IvanLi127
        9
    IvanLi127  
       2022-07-07 13:46:17 +08:00
    喜欢它就是要包容它的其他缺点啦

    感觉开发效率还好,我是 C++ 学哭了来 Rust 这,感觉很舒服,至少编译器报错我是能看得懂了
    duke807
        10
    duke807  
       2022-07-07 14:02:10 +08:00 via Android   ❤️ 9
    除了極少數高手,大多數追 rust 的都是因為對底層硬件不了解,而被 內存、指針、堆、棧 等等虐慘,特別是遇到 bug 的時候,好不容易來一個 rust 可以 pk c/c++,那還不趕緊抓住救命稻草,慢一點就慢一點,麻煩就麻煩一點好了

    所以大多數追 rust 的人本職工作都是用不上 rust 的,非要用 rust 来做上層的事只是出於焦慮,而不是真實的需求,長久不了

    綜上,rust 的流行注定是過眼雲煙

    真正想拓展自己向下觸角的人,應該學學 linux kernel 、mcu 之類的,當然,大多數搞上層的人並不適合,不用勉強自己
    ihciah
        11
    ihciah  
       2022-07-07 14:56:39 +08:00   ❤️ 1
    写熟了感觉比其他语言写的快(泛型真的是个好文明)。
    lovepplforever
        12
    lovepplforever  
       2022-07-07 14:58:54 +08:00   ❤️ 1
    还是 go 香
    libook
        13
    libook  
       2022-07-07 16:06:02 +08:00   ❤️ 2
    Rust 的预期是增加前期开发成本、降低 Debug 成本、提升产品质量。

    如果原本就在做 C/C++项目,而苦于投入大量产能在解决或避免内存安全问题上,Rust 就可以用来提升整体开发效率。

    越是隐藏底层实现的方案开发效率越高,比如有 GC 语言通常比比无 GC 语言开发效率更高,弱类型语言通常比强类型语言开发效率更高。但是为了提升性能、产品质量、可维护性等都也是会产生成本的,所以需要针对项目考虑使用哪种技术在满足需求的基础上综合成本最低。

    学 Rust 可以直接去官网看官方 book ,我是直接看的英文原版,如果英文不好也可以考虑对应的中文翻译版。
    另外 Rust 细节特性和语法糖很多,如果不经常用很可能会忘,最终会发现自己隔一段时间就要重新学一遍 Rsut 。
    mxT52CRuqR6o5
        14
    mxT52CRuqR6o5  
       2022-07-07 16:10:19 +08:00 via Android
    你确实需要无 gc 特性时才应该去使用这种无 gc 语言(比如写底层的东西、有实时性要求的东西),否则用无 gc 语言太自找麻烦了
    march1993
        15
    march1993  
       2022-07-07 16:42:54 +08:00
    @qrobot 不存在的。即便是 libc ,free 完的资源也不是立刻交还给操作系统的。
    DeWjjj
        16
    DeWjjj  
       2022-07-07 16:48:17 +08:00 via iPhone
    @march1993 不可靠,积攒在一起回收会产生悬垂,还有各种隐性转换也会导致非运行时错误。
    而且我现在写 c 也是按着 rust 思路写,bug 真的少了…
    DeWjjj
        17
    DeWjjj  
       2022-07-07 16:51:20 +08:00 via iPhone
    可能犯错意味着可能报错,无论你是多么细致一个人。但是,明文限制不能报错,出现错误概率就会低到极低。
    BeautifulSoap
        18
    BeautifulSoap  
       2022-07-07 17:02:26 +08:00 via Android   ❤️ 6
    rust 都确定要进入 linux 内核了,还有人说过眼烟云。。。。
    irytu
        19
    irytu  
       2022-07-07 17:31:35 +08:00 via iPhone
    @duke807 过眼云烟有点言重了哈
    duke807
        20
    duke807  
       2022-07-07 17:49:55 +08:00 via Android
    keepeye
        21
    keepeye  
       2022-07-07 17:55:31 +08:00
    为了替代 c++的语言,难也正常,反正我学不进去了年纪大了
    GeruzoniAnsasu
        22
    GeruzoniAnsasu  
       2022-07-07 18:17:28 +08:00   ❤️ 14
    @duke807

    rust 不如说是 c/++ 专家在被内存惨虐才创造出来的……

    c++本身就很难写得对,又是语法怪物,又是工程陷阱,放在今天来看简直可以说一无是处,rust 为 c++提供了一点改进,好解决的工程陷阱先解决了,语法怪物和正确性问题解决了一部分,已经很不错了。

    别的语言 <name> <get|install> <module name> 三分钟工程 setup 好了,c++调试跨平台 cmake 脚本花了我一整天,气得我想笑,谁还愿意在 2022 年为了构建项目手写脚本拼编译器开关字符串呢

    我想用 rust 正是因为我知道智能指针怎么实现,但一个线程安全又解决了循环引用的智能指针实在太难写对了,我想有封装好的基础设施,并且我也不想每个变量都多套一层没用的 wtf_pointer<T>,你看,有语言给我封装好了

    这跟工程陷阱问题一样,对任何人来说都是徒增心智负担的东西,我相信大多数追捧 rust 的群体是受够这些泥潭的人,而不是看着新鲜又没能力写那些「学术化内存代码」的人。


    ------


    想告诉 OP 的是,rust 这些「独特设计」都是 c++某些机制的高级抽象版或者封装版,它们这么复杂是因为实现这些抽象的更基础的设施还要更复杂,复杂到接近人类智能能处理的极限且无益于工程化,相比之下 rust 的代价已经减少很多了。c++可能是慢 10 倍,rust 慢两倍……
    v23x
        23
    v23x  
       2022-07-07 18:33:37 +08:00
    @BeautifulSoap 确实 我都笑尿了
    BeautifulSoap
        24
    BeautifulSoap  
       2022-07-07 19:13:54 +08:00
    @duke807 我觉得那位 lz 可以和这些文章作者打一架

    https://www.theregister.com/2022/06/23/linus_torvalds_rust_linux_kernel/
    https://www.zdnet.com/article/linus-torvalds-is-cautiously-optimistic-about-bringing-rust-into-the-linux-kernels-next-release/
    https://www.techradar.com/news/linus-torvalds-rust-is-coming-to-the-linux-kernel-real-soon


    随手用 linus linux kernel rust 为关键字搜一些文章,搜出来文章里 linus 对 rust 都没那么大恶意(虽说内容大同小异)。最多就是表示这是一次尝试,还有许多工作要做,希望 rust 能带来更多的安全性之类的
    xylxAdai
        25
    xylxAdai  
       2022-07-07 19:25:38 +08:00
    @GeruzoniAnsasu c/c++引入其他项目需要自己手写源码编译脚本,md 太坑了,引个包和受罪一样,写了三四年,脑瓜子疼,还好现在不怎么写 c++大型项目了。
    当然 c++这门语言我还是很喜欢的,而你说的线程、智能指针、内存这些却正是我喜欢的点,写起来很有成就感。
    不过 c++确实是脑力活动,心智压力太大了
    pagxir
        26
    pagxir  
       2022-07-07 19:33:34 +08:00 via Android
    Linux kernel 增加对 rust ,那是因为能够做到 /并且需要额外工作,才专门提提供,而不是说鼓励或者看好,也只是一种尝试。其它的需要 gc 的很明显目前的 linux 做不到支持,而 c++/ASM 根本就不需要额外工作去处理。
    coeru
        27
    coeru  
       2022-07-07 19:57:25 +08:00
    写 Rust 写习惯之后就丝滑了
    duke807
        28
    duke807  
       2022-07-07 20:03:34 +08:00 via Android
    @BeautifulSoap
    不,我要和 linus 打,是他同意引入的
    agagega
        29
    agagega  
       2022-07-07 20:08:58 +08:00   ❤️ 2
    Rust 本身是好东西,但某些圈子里爱蹭热度的半桶水 Rust 吹整天就一副「天不生 Rust ,万古如长夜」的模样,仿佛 Rust 诞生之前所有的语言都不是 native 没有 GC😅

    Rust 火起来还有一个好处是:喊着用 JS 重写整个世界的声音终于消停不少了,也许都去折腾 Rust 了吧

    ---

    Rust 写起来的复杂度,一小部分来自于它自身安全模型的局限性(想象一个包含了所有「正确的程序」的集合,Rust 程序可能只是里面的一个小子集),更大一部分来自于它要处理的问题本身的复杂性:如何防止不该回收的内存被提前回收?如何确保该回收的时候内存被回收?如何防止多线程情境下的数据竞争?

    有很多人抱怨 Swift/Rust 这类语言里操作字符串很麻烦,不能直接按下标访问字符,这是因为字符串编码本身的复杂性。Rust 的内存管理也是类似。

    其实 Rust 早期并不是想走手动内存管理的路线,Rust 之父是一个 OCaml 铁杆粉丝,他想打造一个更适合工业界的 OCaml ,正式版以后才走上了今天的路线。

    说起来,理想的编程语言应该支持默认 GC+部分对象加标注用生命周期管理,类似 TypeScript 可以慢慢从 any 迁移到具体类型,这样应该能兼具开发效率和优化空间。
    NXzCH8fP20468ML5
        30
    NXzCH8fP20468ML5  
       2022-07-07 23:12:28 +08:00   ❤️ 2
    如果你是 C++程序员,长期被内存安全和线程安全问题折磨,RUST 绝对能够极大提高你的开发效率。
    如果你是 Java ,Go ,C#等程序员,长期被内存占用和 STW 折磨,RUST 只不过是你学不来 C/C++的备用选择。
    如果你是 JS ,Python 的程序员,长期被性能折磨,亲亲这边建议你学 Java/Go 和重新入门算法呢。
    fakeshadow
        31
    fakeshadow  
       2022-07-08 00:43:53 +08:00
    谁说 rust 开发效率低,秒杀汇编好吗? /s
    rust 开发效率要对比也就只能对比 c/c++,和更低或者更高的抽象比意义不大。
    pieerepeng
        32
    pieerepeng  
       2022-07-08 02:24:53 +08:00
    感觉我已经把 c++写成了 rust 的样子,为啥不直接用 rust
    liuxu
        33
    liuxu  
       2022-07-08 10:35:54 +08:00
    @duke807 #28 ,你这个 rust 黑,我要给我的 gentoo 装满 rust 写的工具,我还要在 gentoo 上写 rust
    kekeabab
        34
    kekeabab  
       2022-07-08 12:45:43 +08:00
    纯煞笔,喷某个人,是谁我不说,我干饭人不想写 cpp ,也不想了解硬件,但我就是要喷,又不是所有人都用来搞硬件。难道不是因为 c++: build success, segmentation fault 。rust: build fail, note:xxx. help:xxx 才用 rust 。个人觉得除了 async 不满其它基本都很满意。
    DonkeyBenjamin
        35
    DonkeyBenjamin  
       2022-07-13 21:05:11 +08:00
    我喜欢 rust 是因为它注重实用性和软件工程实践,尊重 David parnas 的 modular design ,尊重编程语言理论的发展,而不是因为性能 /热度 /被基础概念折磨。

    至于说 rust 是过眼烟云的,瞎子罢了。
    memorycancel
        36
    memorycancel  
       2022-07-14 11:33:04 +08:00   ❤️ 1
    https://github.com/StudyRust/leetcode_rust

    每天用 Rust 刷一道 leetcode ,一起来!
    amazingxxxxx
        37
    amazingxxxxx  
       2022-07-29 09:15:08 +08:00
    @yazoox “Rust 编程语言入门教程”,B 站的 UP 主叫“软件工艺师”,YouTube 上 UP 主叫“Dave Young”。
    该教程用到的书(官方教程),电子版: https://kaisery.github.io/trpl-zh-cn/

    另外一个推荐上述教程卡在某个概念的时候看的,一些本地化或更细节的内容:
    Rust 语言圣经(Rust Course),网站: https://course.rs/

    视频教程在于可以 2 天快速刷完一遍(看难易度是否开倍速播放),先有个基础概念,也好控制学习时间。
    某些不怎么理解的概念再回头查上面书的解析搞懂。
    andyJado
        38
    andyJado  
       2022-07-31 10:04:07 +08:00
    @amazingxxxxx 实名 dis 这本圣经. 看两页就闻得到臭味, 纯白读的时候留个心眼.
    amazingxxxxx
        39
    amazingxxxxx  
       2022-07-31 19:06:20 +08:00
    @andyJado 要说人家写的不好,那你也要指出哪里写得不好,而不是一句笼统的臭味略过。
    免费开源的书还要被别人这样骂,还骂不到点,真的过了。

    如果有觉得更好的书,或更好的学习方法,请推荐,方便大家更好地学习 rust 。
    andyJado
        40
    andyJado  
       2022-07-31 20:12:18 +08:00
    @amazingxxxxx

    就和下火车站热情帮你拎包的黑车司机一样, 热情, 自吹自擂, 但不值.

    除了 the book, 就 https://cheats.rs/

    略略略, 它能捧自己叫圣经, 我不能说臭? 我的评论还开源了呢.
    ColorfulBoar
        41
    ColorfulBoar  
       2022-08-01 01:40:41 +08:00
    @andyJado #40 话说那玩意有啥内容上的硬伤么,我没细看扫了一眼只是感觉行文用语不是很对劲
    andyJado
        42
    andyJado  
       2022-08-01 08:23:45 +08:00
    @ColorfulBoar 内容, 我提过一个 issue, 采纳了, 响应很积极, 很棒. 但它该臭还是臭啊.

    没有一个 bug 该是 implicitly pass 对吧, 我纯白的时候我没有分辨是非的能力, 我会觉得这个味就应该是这样. 这就不对, 就该骂, 只要它还叫自己圣经一天, 这就是一天的 bug.
    ecloud
        43
    ecloud  
       2022-08-02 09:45:52 +08:00   ❤️ 1
    我最近在转 rust
    简单说一下体会
    如果讲最初版本的开荒,rust 的确比各种动态语言要麻烦。不要说跟 python/java 之类的比,就是上古的 oc 都比不了
    但是,如果你追求性能的话,动态语言根本是无解
    而如果跟 C/C++比起来,又是另一个故事了。rust 在调试和测试过程中的便利性可比 C/C++高到不知道哪里去了,编译器输出几乎就帮助你完成了所有非业务逻辑的审查。对于业务逻辑不复杂的应用来说,单元测试都没有太大的必要了。从这一点来说,rust 比 C/C++的开发效率高太多

    rust 的另外一个好处是,一旦你完成了最初阶段的开荒,那么后续维护和改进的效率会比大部分动态语言都要高。动态语言最大的问题的,在项目膨胀的过程中,模块之间的语意层级的联系并不大,比如你给一个 springboot 产品增加一个 POST 接口,你可以写的跟他原有的风格截然不同,而且这样做你会很舒服。而 rust ,或者是 C ,一般而言你的新模块都要基于原有构建的某种模式。当然高手也可以放飞自我的写,但是这样你并不会感觉舒服。
    ecloud
        44
    ecloud  
       2022-08-02 09:55:34 +08:00
    @kekeabab 非常支持。C/C++除非大神来写,否则性能上真不一定比得过 rust 。因为 rust 编译优化后的代码其实都是指针跳转,而你自己在 C 里面大多情况下是 char x [100],然后一大堆 memcpy 。即便这样小心还是经常 segmentation fault...
    ecloud
        45
    ecloud  
       2022-08-02 10:11:31 +08:00
    @agagega 我觉得本质不是 GC 的问题而是静态 /动态类型。比如 objc 即便你使用 mrc ,你看他的汇编代码也跟 arc 是一样的,有非常多的栈跳转冗余来用于对付动态类型。rust 本质上就是一个以大括号为关键字 mrc ,但是因为它是静态类型的语言,所以跟 objc 的风格就完全不同。objc 当你使用 mrc 模式并且开启 Xcode 的内存检查的时候,其结果跟 rust 的借用检查其实差不太多的,但是 objc 在处理类型的时候要舒服很多,光一个 id 类型就无敌了,再加上 NSString 这个神奇的玩意儿,就会给你一种像解释性语言一样的舒服感。
    但是,动态类型跟性能是互斥的,这个根本无解
    xjiewu
        46
    xjiewu  
       2022-08-03 15:42:16 +08:00   ❤️ 1
    上手难度我觉得还好,毕竟我已经入门十几次了
    luckyyD
        47
    luckyyD  
       2022-09-21 14:19:38 +08:00
    @march1993 用完就回收≠完美,但是开销肯定少,用它写越基础的服务收益就越大。
    gc≠不可靠,但是并不一定所有的场景都能接受 stop the world 。
    测试用例可靠、软件通过了用例。才是一个软件可靠的标准。

    但是根本是场景问题,汽车的车机甚至可以接受黑屏重启,但是卫星上的程序总不能搞虚拟机和 gc 吧。我给你一个几十 KB 内存的单片机和传感器去做智能家居的网络遥控器,你还想在里面跑个虚拟机?
    zagfai
        48
    zagfai  
       2022-09-21 21:29:35 +08:00
    @coeru 大哥有对比过 golang 或者 python 的开发速度吗?
    coeru
        49
    coeru  
       2022-09-22 11:49:09 +08:00   ❤️ 1
    @zagfai 没对比过,主要都没机会用来开发大型项目
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2797 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 07:04 · PVG 15:04 · LAX 23:04 · JFK 02:04
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.