V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
samray
V2EX  ›  分享创造

我用 Rust 重写了博客,谈谈我眼中的 Rust. 内容略长.

  •  5
     
  •   samray ·
    ramsayleung · 2017-09-27 19:49:47 +08:00 · 51053 次点击
    这是一个创建于 2485 天前的主题,其中的信息可能已经有所发展或是发生改变。

    前言

    我已经学习 Rust 有挺长的一段时间了,一直想用 Rust 来写点东西,但是缺乏好的想法; 有些想法自我感觉良好,但是又没有能力实现 (比如,写一个操作系统?), 所以最后我决 定还是拿我的博客来做实验品吧。我原来的博客 是 基于 Github Page 和 Org mode 实现的静态博客,略显简单。所以我就觉得用 Rust 来写 个新的博客。

    我眼中的 Rust

    前后花了一个月的空余时间来写这个博客,写完这个博客之后,我觉得我应该算是有点 Rust 的编程经验了 ;-). 在学习 Rust 和使用 Rust 的时候,我总是将 Rust 和我平时使 用的语言进行对比。一段时间下来,我对使用 Rust 的感悟越来越多,所以我谈谈我眼中的 Rust

    优点

    内存安全

    谈及 Rust, 首先想到的一定是内存安全,正如官网对 Rust 的定义:

    Rust is a systems programming language that runs blazingly fast, prevents segfaults, and guarantees thread safety.

    这个也是 Rust 对比其他的语言最大的亮点之一. 众所周知,在 Rust 之前的其他编程语言 管理内存的方式无非是以使用垃圾回收算法管理内存(代表就是 Java 和 Python), 或者是 C/C++ 手工管理内存。手工管理内存非常容易出现问题,即使是非常有经验的工程师也不能 写出完全没内存问题的代码,毕竟人总是免不了出错。但是使用垃圾回收算法就一定会有运 行时和垃圾回收时的停顿,这就不适合系统编程了。而 Rust 通过新加入的 生命周期 (lifetime)和所有权 (Ownership) 特性,就可以实现内存的自动回收,并且无需运行时, 可以大大地避免出现类似内存泄漏或者时悬停指针之类的问题

    编译器

    据说,在 Rust 的编译器设计理念里,编译器可以检查的,就无需程序员操心。并且因为 Rust 所倡导的安全的概念,所以它的编译器会做尽可能多的检查,争取在编译期就发现问 题。此外 Rust 的编译信息还非常友好和详细

    error[E0308]: mismatched types
      --> src/main.rs:72:32
       |
    11 |     let url = match Url::parse(matches.value_of("URL")) {
       |                                ^^^^^^^^^^^^^^^^^^^^^^^ expected &str, found enum `std::option::Option`
       |
       = note: expected type `&str`
                  found type `std::option::Option<&str>`
       = help: here are some functions which might fulfill your needs:
               - .unwrap()
               - .unwrap_or_default()
    
    error: aborting due to previous error
    
    error: Could not compile `blog`.
    
    To learn more, run the command again with --verbose.
    
    
    

    Rust 编译器就像导师一样耳提面命,为你指出代码中的问题(但是有时候,我觉得 Rust 的编译器也像导 师一样,太啰嗦了 !-_-)

    表达能力强

    Rust 不同于衍生自 C 的 Java, Go, Python 等语言,Rust 更多地吸取了 Ocaml, Haskell, Scheme 等函数式语言的特性。对于习惯了 C 系语言的同学而言,Rust 算是打开 了一个新的大门。

    match

    Rust 具有非常强大的表达能力,比如说 match, 这个类似 C 里面的 switch,但是强大得多. 首先看一下类似 switch 的功能:

    enum Coin {
        Penny,
        Nickel,
        Dime,
        Quarter,
    }
    
    fn value_in_cents(coin: Coin) -> u32 {
        match coin {
            Coin::Penny => 1,
            Coin::Nickel => 5,
            Coin::Dime => 10,
            Coin::Quarter => 25,
        }
    }
    

    这个是 The Rust Programming Book 的例子,作用是列举所有的枚举值,但是似乎也没有比 switch 神奇到哪里去。但是 match像其他的函数式语言那样,可以提供模式匹配的能力,为复杂的类型系统提供一个简单轻松的解构能力。例如对 struct 进行解构:

    struct Point {
        x: i64,
        y: i64,
    }
    let point = Point { x: 0, y: 0 };
    match point {
        Point { x, y } => println!("({},{})", x, y),
    }
    

    这样,对 使用 match 就可以得到 Point的内部值

    macro

    Rust 也有 宏系统 (macro), 不是类似 C 的那种简单文本替换的宏,而是类似 Lisp 系语 言的宏,使用过 Lisp 方言的同学自然会明白宏的强大,《黑客与画家》的作者 Paul Gram 也是宏的忠实粉丝。比如我使用宏来创建一个函数:

    macro_rules! create_function {
        // This macro takes an argument of designator `ident` and
        // creates a function named `$func_name`.
        // The `ident` designator is used for variable/function names.
        ($func_name:ident) => (
            fn $func_name() {
                // The `stringify!` macro converts an `ident` into a string.
                println!("You called {:?}()",
                         stringify!($func_name))
            }
        )
    }
    
    // Create functions named `foo` and `bar` with the above macro.
    create_function!(foo);
    create_function!(bar);
    

    使用上面的定义的宏,我就创建了一个 foo()bar() 函数,然后就可以直接调用:

    fn main() {
        foo();
        bar();
    }
    
    

    Rust 的宏系统极具表现力 完整例子参见 rust by example

    工具链

    不得不说,Rust 的工具链真的让程序员非常舒心

    Cargo

    Cargo 是 Rust 的构造系统和包管理器,开发者可以用 Cargo 下 载相应的依赖和构造代码。Cargo 非常容易上手,但是功能确是非常强大,Cargo 还可以帮 开发者设置相应的单元测试和基准测试,所以使用 Cargo 进行单元测试和基准测试是非常 省心。Cargo 是多合一的一站式工具,也是同类工具中,我使用过的最强大的

    Rustup

    rustup 是 Rust 的一个安装器,使用 rustup 来更新 Rust 的编译器,它跟 Python 的 virtualenv 有点像,可以维护不同版本的 Rust 编译器,例如 stable, nightly,beta 等

    rust-clippy

    rust-clippy 是 Rust 的一个静 态代码分析工具,虽说 Rust 的编译器在分析 Rust 代码上已经做了非常多的工作了,但是 rust-clippy 可以帮你更进一步,编写出更好的代码。总会有一些代码可以进行简化以提高 代码的可读性,或者是更符合最佳实践,而 rust-clippy 就是会给你相应的提示,以协助 你编写出更好的代码。

    性能强劲

    Rust 强劲的性能也是它非常大的亮点之一,记得我学习 Rust 的其中一个原因就是它的性 能,因为我熟悉的 Python 虽然优点非常多,但是性能一直被人垢病. 而 Rust 其中的一个 设计理念就是实现高并发,充分利用好现代电脑的多核特性. Rust 的目标是性能方面超越 C 语言,可能这个目标在很多人看来都很可笑. 但是很多基准测试都表明 Rust 的性能和 C 已经相差不大,考虑到 Rust 本身就是为了现代多核电脑设计的编程语言,而 C 还是上世 纪 70 年代的产物,即使是天才般的发明,现在也不免追不上莫尔定律的脚步,况且 Rust 还是处在婴儿期,而 C 已经非常成熟,例如 GCC 这样的编译器也对 C 语言做了非常多的 优化,C 语言性能方面的增长已经很有限了。所以如果 Rust 真的能利用好多核的性能,未 来真的可期

    友好的社区

    这个应该不算是 Rust 的一个优点,但是 Rust 社区让我在编写 Rust 过程深深受益。我编 写的博客使用的 Web 框架是 Rocket, 数据库层的 ORM 是 Diesel, 因为框架和编程语言都非常新,虽说他们的文档都非常完 整,但是难免会有覆盖不到的地方,所以总会有一些遇到的问题我不知道怎么解决。所以我 经常向社区求助,在 Reddit 上发贴,或者是在 Gitter 上找人求助,又或者是在 Github 上面求助,在社区的朋友的帮助下,我最后都能解决问题。社区的朋友都非常友好和乐于帮 忙,即使我问的问题很菜鸟,但是他们都一一耐心做答。Rust 社区给我的感觉和 Emacs 社 区给我的感觉很相似,社区人数少,但是素质非常高,非常友好。

    不足

    现在我来说说 Rust 的不足或者说是劣势

    陡峭的学习曲綫

    前面提到 Rust 为了实现内存无运行时的自动管理,引入了独创的生命周期 (lifetime)和 所有权 (ownership), 对于学习 Rust 的同学来说,这是必须跨过去的坎,接着还有类似引 用 (Reference),租借 (Borrow) 这些特性,真的令人望而生畏。而 Rust 的很多新的特性 都是没办法从已有的编程语言那里找到类似的特性的,所以必须以 Rust 的思维去学习 Rust, 而不能抱着 Java 或者 C++ 的思维的学,因为这样一定会撞得头破血流,久攻 不下,就很容易放弃

    还是编译器

    没错,Rust 的不足,编译器也有一份子。前面提到 Rust 是会尽可能地检查你的代码,把 BUG 扼杀在编译期,所以就会导致两个问题. 问题一: 很多东西编译器都要管,所以你的代 码就必须写得符合编译器的要求,不然编译器就不会让你通过,所以每次编译都想撞墙,怎 么这个编译不通过,那个编译也不通过;如果你的代码编译通过了,它运行就比较少会出现 问题;问题二:因为要做尽量多的检查,所以导致编译的时间非常长,经常是改动了一小点 代码,重新编译就要 10s 以上, 而我的机器都已经是 E5 的 CPU 加 32G 的内存了。

    尚不成熟的生态环境

    虽说 Rust 现在发展迅速,但是 Rust 的生态还没有起来,很多优质的类库还是欠缺,很多 现有的类库还不成熟,例如我现在使用的 Rocket 框架还只是 0.3, Diesel 还只是 0.16.0 ,很多我需要的功能都没有,比如 Diesel 这个 ORM 还没无法进行 Rust 的 enum 和 Postgres 的 enum 的映射,一些复杂的查询还不支持,只能使用 sql 进行操作。其他类库的版本如图:

    缺乏 IDE

    现在 Rust 没有比较成熟的 IDE, 现在我使用 Emacs 编写 Rust, 配合 Racer 这个 Rust 代码补全工具,但是 Racer 只是能补全标准类库的代码,对于下载下来的依赖类库,就无 能为力,所以我写代码都只能对着 API 文档编写,然后编译,出了问题再修改。虽说 Rust 团队现在基于 LSP 在开发 RLS, 但是我写 Rust 的感觉就好像我使用编辑器写 Java 的感 觉一样,实在是效率太低,代码补全,语法提示功能太弱了。

    中文社区

    虽说这个与 Rust 本身无关,不过我只是想吐嘈一下,Rust 的中文社区几乎没有,我的所 有 Rust 问题都是在 Reddit, Github, Gitter, IRC 上面解决的. 我只是希望 Rust 中文社 区也可以强大起来。人数应该不是什么大的原因,像 Emacs 的用户那么少,Emacs 的 中 文社区 一样很繁荣,这个算是我的一个希冀吧

    小结

    其实学习 Rust 还是很有收获的, 不是说,如果这种语言没有改变你对编程的看法,那它就 不值得你学。这么看来,Rust 还是值得我学习的,Rust 现在给我的感觉跟 Emacs/Vim 很 相似,它很强大,但是由于学习曲线等诸多原因,游离于主流之外,但是它的强大和它的美 只有你亲身学习,亲身经历才能体会到的。这就是如鱼饮水,冷暖自知吧。最后贴上几张博客截图

    博客地址: samray's blog

    Github 地址: blog

    86 条回复    2020-10-28 18:15:47 +08:00
    fy
        1
    fy  
       2017-09-27 20:37:08 +08:00
    折腾不易 且行且珍惜

    LZ 行动力不错
    samray
        2
    samray  
    OP
       2017-09-27 20:53:27 +08:00
    谢谢.编程最不能缺少的就是实践和折腾了 :)
    marknote
        3
    marknote  
       2017-09-27 21:25:37 +08:00
    不错!加油!
    flaneurse
        4
    flaneurse  
       2017-09-27 21:33:16 +08:00
    学习了
    samray
        5
    samray  
    OP
       2017-09-27 21:35:57 +08:00
    @marknote 共勉咯
    samray
        6
    samray  
    OP
       2017-09-27 21:36:27 +08:00
    @flaneurse 是学习了 Rust 了么?哈哈
    davidqw
        7
    davidqw  
       2017-09-27 21:41:11 +08:00
    靠谱,不少区块链的应用都开始用 rust 开发了,内存安全很重要
    samray
        8
    samray  
    OP
       2017-09-27 21:50:24 +08:00
    不止是区块链,Firefox 的引擎也是用 Rust 重写了,现在部分评测性能已经超过了 Chrome, 详见 https://blog.mozilla.org/blog/2017/09/26/firefox-quantum-beta-developer-edition/. 其实我觉得 Rust 真的很强大的,但是它没有 Golang 那样容易上手,也没有 Golang 那样的爹来推广,所以普及度就不如 Golang.
    secondwtq
        9
    secondwtq  
       2017-09-27 21:53:46 +08:00   ❤️ 1
    楼主貌似忘了提 Algebraic Data Type 了
    十天前简单梳理了一下,静态类型的 imperative programming language 里面,“能用”并且有点名气的只有 Rust,还有个四不像的 Scala
    我对“能用”的要求不高,Algebraic Data Type + Pattern Matching
    droiz
        10
    droiz  
       2017-09-27 22:08:22 +08:00
    加油楼主!学习了
    samray
        11
    samray  
    OP
       2017-09-27 22:09:57 +08:00
    @secondwtq 我在写博客的过程中没有用到 Algebraic Data Type, 所以我就没展开说自己的看法了,不过我之前看过 https://blog.rust-lang.org/2015/04/17/Enums-match-mutation-and-moves.html 这篇文章也有提及 Rust 的 Algebraic Data Type, 不过 Rust 的 Pattern Matching 就真的非常强大,除了我上面列举的,还可以配合 Result 和 Option 使用,我觉得 Option 是另外一个非常强大的点,完全杜绝了 Java 的空指针,而 Result 的错误处理就又是和 Java/Python 异常系统完全不同的 Error Handling 机制
    samray
        12
    samray  
    OP
       2017-09-27 22:10:44 +08:00
    @droiz 互相学习 :)
    cuebyte
        13
    cuebyte  
       2017-09-27 22:14:42 +08:00
    @secondwtq 要让我选,Scala 还是比 Rust 更容易写。
    ipconfiger
        14
    ipconfiger  
       2017-09-27 22:46:55 +08:00
    第一, 放国外的, 太慢, 根本体会不出到底快在那里, 第二, 其实应该重写 Hexo 啊, 或者 Jekyll、Octopress 之类的
    楼举觉得呢
    sunjourney
        15
    sunjourney  
       2017-09-27 22:49:41 +08:00
    Firefox 家的东西,当然要自己用了。Rust 写博客,算激光炮打蚊子吗?
    sunjourney
        16
    sunjourney  
       2017-09-27 22:51:49 +08:00
    访问居然要 fq。。。是被盯上了吗
    samray
        17
    samray  
    OP
       2017-09-27 23:10:18 +08:00
    @ipconfiger 放国外是因为我不想备案,这个真的烦人.其次嘛,一个博客快也不会快到哪里去的,我主要谈的是我写博客过程中的体会.很多东西都是由小见大的,我没有 Rust 真正写过什么,我也不好意思来说感受吧.至于 Hexo,这个建议很有趣,真的可以有空想想怎么写.
    samray
        18
    samray  
    OP
       2017-09-27 23:13:29 +08:00
    @sunjourney 要 fq 可能是因为我服务器和域名都是国外买的吧,这个就看 qiang 的心情了,我也决定不了,摊手无奈脸.
    至于是不是用激光炮打蚊子,激光炮可以用来打蚊子,和真的用激光炮来打蚊子还是区别的.用激光炮打蚊子了,你对蚊子和激光炮都会有切身的体会了,接下来要用激光炮打其他东西就会有更大的把握了 :)
    dbw9580
        19
    dbw9580  
       2017-09-28 00:26:00 +08:00 via Android
    断断续续看过将近半个月的 the rust book,rust by example,上手想实现一下链表,结果发现 rust 对指针的限制催生出了很多 c 里不会有的结构,比如在堆上分配内存要用 Box 这种数据类型,共享所有权用 Rc,内部可变性要用 Cell 和 RefCell,从 C 过来一脸懵逼,原本很简单的施工推倒重来了不知多少遍。。
    lrxiao
        20
    lrxiao  
       2017-09-28 01:00:28 +08:00
    lz rust primer 讲的 trait object safety 到底是个什么概念 我看到那一脸懵逼
    secondwtq
        21
    secondwtq  
       2017-09-28 01:41:36 +08:00
    @dbw9580 C++11 就已经这样了,Herb Sutter 还在 Leak Freedom in C++ by Default 里面整出了一个 “ Garbage ” Collection,Objective-C 和 Java 里面也有 weak 之类的东西,就是 C 也有 const 和 volatile


    (以及一大堆的 malloc() 和 free()
    samray
        22
    samray  
    OP
       2017-09-28 07:26:34 +08:00
    @lrxiao  你是指 trait 是什么么? trait 其实就相当于 Java 里面的 interface,但是 trait 可以定义除了可以定义接口的方法之外,还可以定义方法的默认实现.你指的是这个么?
    samray
        23
    samray  
    OP
       2017-09-28 07:31:40 +08:00
    @dbw9580 我在上面可能提到 Rust 学习曲线很陡,我觉得这也是其中一个比较难掌握的特性. Rust 建立在所有权之上的这一套机制,它要求一个资源同一时刻有且只能有一个拥有所有权的绑定或 `&mut` 引用,这在大部分的情况下保证了内存的安全。但是这样的设计是相当严格的,在另外一些情况下,它限制了程序的书写,无法实现某些功能。因此,Rust 在 std 库中提供了额外的措施来补充所有权机制,以应对更广泛的场景。默认 Rust 中,对一个资源,同一时刻,有且只有一个所有权拥有者。Rc 和 Arc 使用引用计数的方法,让程序在同一时刻,实现同一资源的多个所有权拥有者,多个拥有者共享资源。我觉得学习 Rust 的时候,要记住一点,Rust 最看重的就是 safety,所以一切都要以这个优先.可能你觉得这些智能指针限制很多,本来 C 语言很简单的东西,到了 Rust 怎么这么复杂,因为 C 的指针实在太灵活了,也非常容易出问题,所以 Rust 为了杜绝 C 的问题,所以就对此做了很多限制,一切都是为了内存安全.
    samray
        24
    samray  
    OP
       2017-09-28 07:38:54 +08:00
    @lrxiao 你应该是指 type safety 吧?
    AngelCriss
        25
    AngelCriss  
       2017-09-28 07:48:13 +08:00 via Android
    老生常谈了。 我在 Rust 第一个正式版发布前一周看完官方教程,也写了些小工具。当时,还只会 C 语言的我确实像是发现了新大陆,这种感觉一直持续到学习并使用 C++半年的时间,期间也给身边的人安利 Rust,关注 Rust 发展,和群友们讨论 Rust。 但是,随着对 C++的进一步掌握,Rust 官网上标榜的各种优势在我看来已经荡然无存。 内存安全
    AngelCriss
        26
    AngelCriss  
       2017-09-28 07:59:44 +08:00 via Android
    线程安全,这些东西,更本不需要编译器来教我,当时入门 C++是 11 标准,有智能指针,有原子变量,自带的线程库已经足够好用。 我需求要做的就是学会掌控自己的代码,让它按照预期运行,而不是编译器教我写代码。
    当时就觉得,Rust 为了所谓的内存安全,编译器线程安全所做的工作都是相当消极的。 当时看到一句话说:C/C++给程序员绝对的自由,实际上相当于放弃程序员。 我觉得 Rust 这种不相信程序员的做法才是放弃了程序员!
    后来,进阶 C++的同时也接触了更新的标准,对 C++的认识越来越深入,对 Rust 的热情就越来越淡薄,Rust 那套才啊 false sense of security。
    samray
        27
    samray  
    OP
       2017-09-28 08:04:20 +08:00
    先声明一下,理性讨论,不想为那个语言好而争论起来.我只是鲜浅地学习过 C++11, 所以我也没办法深入地比较 C++和 Rust, 但是按照你的说法,你进一步掌握 C++,Rust 官网上标榜的各种优势在你看来都荡然无存.那么如果你彻底掌握 C++,估计 Rust 也没什么存在的必要了 :(. https://www.zhihu.com/question/30407715 这篇知乎的文章比较深入地比较了一下 C++和 Rust 之间的区别,发这篇文章的时候,知乎还不是现在的知乎,我觉得还是可以看一下的.此外我倒是觉得,学习某种语言,首要关心的应该是该语言的优点,必须说学习 Java,学习它的严谨,它良好的语言设计,它 OOP 的实践,它对设计模式的各种运用,而不是关心它的 GC 停顿,语法罗嗦.这些问题当然是客观存在的,但是在学习一门新东西的时候,不应该先关注优点么?
    samray
        28
    samray  
    OP
       2017-09-28 08:05:56 +08:00   ❤️ 4
    我突然想起个故事:
    熊十力痛骂徐复观[读书方法]
    1943 年,徐复观时任陆军少将,这一年他受到蒋介石的器重并成为高级幕僚。徐复观读到了
    熊十力独创的新儒家哲学体系“新唯识论”,敬佩之情油然而生,遂萌发了从师之意。正好此
    时,熊十力也在重庆梁漱泯先生主持的勉仁书院教书。徐复观便试着写了一封信,表示了仰
    慕之情。不几天,熊十力便给他回了信。熊十力说到后生对前辈要有礼貌,批评徐复观来信
    字迹潦草,诚意不足。徐复观立即去信道歉。经过几次通信后,熊十力约徐复观来书院面谈。

    徐复观第一次去见熊十力,是身着陆军少将军服。徐复观向熊十力请教该读点什么书,熊十
    力向他推荐了王夫之的《读通鉴论》。徐复观说这本书早已读过了。熊十力面露不悦之色,
    说你并没有读懂,应该再读。

    过了一段时间,徐复观再见熊十力,报告《读通鉴论》已经读完。熊十力让他谈谈心得,徐
    复观就谈了许多对王夫之的批评。

    熊十力还未听完就开始破口大骂:你这个东西,怎么会读得进书!任何书的内容,都是有好
    的地方,也有坏的地方。你为什么不先看出他的好的地方,却专门去挑坏的;这样读书,就
    是读了百部千部,你会受到书的什么益处?读书是要先看出他的好处,再批评他的坏处,这
    才像吃东西一样,经过消化而摄取了营养。譬如《读通鉴论》,某一段该是多么有意义,又
    如某一段理解是如何深刻,你记得吗?你懂得吗?你这样读书,真太没有出息!

    多年后,徐复观回忆到:这对于我是起死回生的一骂。恐怕对于一切聪明自负、但并没有走
    进学问之门的青年人、中年人、老年人,都是起死回生的一骂!近年来,我每遇见觉得没有
    什么书值得去读的人,便知道一定是以小聪明耽误一生的人。

    我觉得读书和学习一门新的技术还是有很多相似之处的:)
    wweir
        29
    wweir  
       2017-09-28 08:22:46 +08:00 via Android
    作为一个 Gopher,非常羡慕 rust 能有 cargo 这样的工作。
    学了很久 Haskell,一直没什么长进,貌似可以 rust 走一波了。谁让 rust 有个名声呢:a useful Haskell
    gimp
        30
    gimp  
       2017-09-28 09:03:21 +08:00
    同建议写类似 Hexo ( Node.js ),Pelican ( Python )这样的静态博客生成工具

    另外我也是 Python 猿,最近学习 Rust,入门感觉有点难,只能慢慢来了
    parkcg
        31
    parkcg  
       2017-09-28 09:36:30 +08:00
    没人学习 Elixir 吗,Rust 毕竟是系统编程语言,对于做互联网行业的我来说有点太遥远了。
    KeepPro
        32
    KeepPro  
       2017-09-28 09:42:35 +08:00 via Android
    rust scala 对于我这种连 c 都写的不顺溜的来说,还是太难了。
    tomoya92
        33
    tomoya92  
       2017-09-28 09:48:39 +08:00
    github 还识别不出来 rust 吗?![]( http://ss1.sinaimg.cn/large/ce56395agy1fjz1calhwyj21jw040t9h&690)
    tomoya92
        34
    tomoya92  
       2017-09-28 09:54:09 +08:00
    补一下图 ![]( )
    ipwx
        35
    ipwx  
       2017-09-28 09:59:43 +08:00
    虽然楼主很执着,但是我还是想奉劝一句:别把时间放在写博客这种程度的造轮子上面。

    值得造的轮子实在太多了。而如果当你把目光放到更有意义的轮子上面,比如分布式系统的话,用 rust 还是 go 还是 java 还是 python 都无所谓的,什么语言写起来最快最好。甚至一个系统需要多种语言结合使用也不是什么特别意外的事情。这种情况下楼主肯定主动接触更多的语言的,最后回过头来看看的话,其实 rust 也就一个好用的工具而已。
    ipwx
        36
    ipwx  
       2017-09-28 10:02:01 +08:00
    最后补充一点看法。用 rust 写博客看上去很炫,但是其实费力不讨好。无论是 php 还是 python 都有大量趁手的写 web 的轮子。php 我不熟,但是 python sync 的有 flask,async 的有 aiohttp。模板引擎有 jinja,数据库 sync 有 sqlalchemy,async 有 asyncpg/aiomysql + sqlalchemy core。这些都是极具生产力的,你想要实现一个原型系统,性能从来不是问题的关键,写代码的速度才是。还是建议楼主在这些生产力工具上多下点功夫,走主流路线,而不是用 rust 写一个博客。
    ipwx
        37
    ipwx  
       2017-09-28 10:02:49 +08:00
    就是所谓的,写什么东西,用什么语言。rust 写 firefox 是个好语言,但是写网站显然不是。
    ipwx
        38
    ipwx  
       2017-09-28 10:11:46 +08:00
    。。。再补充一点吧,我说的性能不是问题的关键。

    比如你用 rust 很吃力地写了个非常高性能的 web 程序。但是 web 程序的性能瓶颈从来都不是单进程的。比如博客,请求与请求之间基本都是独立的,你要依赖数据库和通用缓存服务器(比如 memcached )。比如用 python 即使是 sync 模式的 flask,无脑开 transaction 处理请求就行了。最后只要开一堆 python 进程,用 nginx 进行负载均衡,很容易就能达到非常高的吞吐量。

    数据库也不是太大的瓶颈。mysql 支持集群。如果 mysql 不够用了,你还可以求助 mssql 或者 oracle db。

    就连负载均衡的那个 nginx 你可以用集群,用 dns 进行第二层负载均衡,或者上硬件方案。

    所以你会发现一个真正的大应用,是分层的:负载均衡 -> web 应用服务器集群 -> 数据库集群。当然可能有更多层。你在这个框架里面,花十倍的功夫去优化一个小进程的性能,是没有意义的,毕竟 python、php 这些语言的 web 轮子是多少年多少人积累下来的。想想正确处理 cookie 的加解密、防御各种 web 攻击,这么多边边角角的东西,从头造一套轮子是不可取的。

    用 rust 写程序,至少现阶段只是完全脱离工业场景的玩具。如果你不是 rust 的核心开发者,还是建议楼主去接触集群的解决方案。而且这个解决方案只是个大框架,数据库用哪个、web 程序用什么语言写,都是灵活的、看不同公司的技术选型的。这样的知识才是万变不离其宗的,才是值得楼主深究的。
    samray
        39
    samray  
    OP
       2017-09-28 10:19:51 +08:00
    @ipwx 主要的不是在于造轮子,而是用 Rust 去写一个小工具,从这个小工具熟悉 Rust 的特性,我的初衷是在实践中学习,而不是造轮子. Python 我写过,Java 的 Spring 全家桶我写了很久了,memcached, kafka, redis  我肯定也是用过的,对于 web 程序来说,即使语言不同,但是实现的知识体系都是这些.
    samray
        40
    samray  
    OP
       2017-09-28 10:20:48 +08:00
    @liygheart 那些都是前端的页面,后端我都是用 rust 写的.
    samray
        41
    samray  
    OP
       2017-09-28 10:24:31 +08:00
    我用 Rust 来写博客的根本原因是因为我希望通过实践来学习, 在写出大的东西之前先拿小的东西练手,我在文章的开头已经写明了:"我已经学习 Rust 有挺长的一段时间了,一直想用 Rust 来写点东西,但是缺乏好的想法; 有些想法自我感觉良好,但是又没有能力实现 (比如,写一个操作系统?)", 如果单纯想写一个博客,我用 Spring boot 或者是 Flask 一个星期就写完了,为什么要用一个多月去用 Rust 来完成呢?殊途同归,我只是希望在实践的过程可以提升.
    alexsunxl
        42
    alexsunxl  
       2017-09-28 10:39:41 +08:00
    同用 emacs ~~ 路过帮顶
    cholerae
        43
    cholerae  
       2017-09-28 10:41:15 +08:00
    愚以为内存安全不应拿来跟 GC 比较,因为内存安全并不能保证没有内存泄漏。Rust 能保证的是在 safe 代码块里不会访问非法的地址,不能保证没有内存泄漏。用 std::mem::forget 之类的是可以搞出来内存泄漏的。
    wayslog
        44
    wayslog  
       2017-09-28 10:43:51 +08:00 via iPad
    (谁说中文社区没有的?来 rustcc 啊。不过我们活动平台是 QQ 群~Rust 编程语言社区
    303838735)
    samray
        45
    samray  
    OP
       2017-09-28 10:48:11 +08:00
    @cholerae 我写的不太严谨,写写指正.其实我想表达的是使用 GC 这种自动管理内存和 C/C++这种手工管理内存模式的差别. GC 是存在内存泄露,但是它帮程序员接管了管理内存的职责,不需程序员自己操心.而 Rust 也是希望通过机制实现内存的自动管理
    samray
        46
    samray  
    OP
       2017-09-28 10:57:25 +08:00
    @wayslog "虽说这个与 Rust 本身无关,不过我只是想吐嘈一下,Rust 的中文社区几乎没有", 几乎没有,这个我感觉我是表达得没问题的,我也知道 rustcc, 我也看过 rustcc 出品的 RustPrimer, 很感谢你们的共享.我也看到了 rustcc 的 QQ 群号,但是我没有加进去.我一直觉得 QQ 群不适合谈论技术,因为很容易就水了起来,你只有加入这个 QQ 群你才可能参与里面的讨论,这个就很容易自我隔离起来.即使 QQ 群里面有很多干货,但是也需要从海量的聊天记录里面发掘,对于后来进群的人,甚至连发掘的机会都没有,更何况 QQ 连代码的高亮都没有,很难讨论代码.所以我个人更倾向与论坛,甚至 gitter. 我之前也在 rustcc 的 Github issus 留言过,是关于 rustcc 的官网的,官网都没了,很难相信这个社区能有多活跃.此外,我一直强调 Rust 和 Emacs 有很多相似之处,我相信在中国使用 Emacs 的用户真的可以称得上凤毛麟角,但是 [Emacs-China]( http://www.emacs-china.org/) 这个论坛一样很活跃.所以我才会吐嘈 Rust 的中文社区几近于无.
    blackanger
        47
    blackanger  
       2017-09-28 11:08:22 +08:00
    @samray 支持。
    wspsxing
        48
    wspsxing  
       2017-09-28 11:08:43 +08:00
    支持下. Rust 本身相当不错, 系统级语言里, c/cpp 跨平台烦, go 带 gc 没有一个完善的包管理, 又没有范型, 错误处理也原始.

    https://rust-lang-cn.org/
    中文社区是有的, 只是不怎么热闹.

    也有人写了静态 site 工具 https://github.com/cobalt-org/cobalt.rs ,不过我还用的 pelican.

    rust 的库本身不怎么成熟, 比如 await, 不过用它写工具挺好的. 静态编译运行没有什么依赖, cargo 包管理也很给力.
    建议新入门的练手移植其它语言的库, 慢慢的库就完善了.
    blackanger
        49
    blackanger  
       2017-09-28 11:09:54 +08:00
    @samray 加 QQ 群吧,这个 QQ 群管理比较严格,适合 Rust 交流。
    blackanger
        50
    blackanger  
       2017-09-28 11:12:11 +08:00
    @cholerae

    “ 愚以为内存安全不应拿来跟 GC 比较,因为内存安全并不能保证没有内存泄漏。Rust 能保证的是在 safe 代码块里不会访问非法的地址,不能保证没有内存泄漏。用 std::mem::forget 之类的是可以搞出来内存泄漏的。”

    内存泄漏并不属于内存安全的范围。
    quxiangxuanqxx
        51
    quxiangxuanqxx  
       2017-09-28 11:18:43 +08:00 via Android
    看火人!
    samray
        52
    samray  
    OP
       2017-09-28 11:29:42 +08:00
    @quxiangxuanqxx 什么是看火人?
    samray
        53
    samray  
    OP
       2017-09-28 11:31:46 +08:00
    @wspsxing 我觉得想要学习函数式编程也可以学 Rust, 我个人也学习过 Scheme,我对它们所提供的抽象能力感觉非常神奇,也是眼前一亮
    neoblackcap
        54
    neoblackcap  
       2017-09-28 11:57:17 +08:00
    @cholerae 我觉得 Rust 类型系统管的方面其实是比 GC 广的,因为安全不仅仅是内存不泄露,还有资源也是安全的,比如 fd 的关闭之类。有 GC 也不能保证资源不泄露啊。
    wspsxing
        55
    wspsxing  
       2017-09-28 12:13:40 +08:00
    @samray Rust 是多范式的啊, oo, fp 都有一些, 当然面向过程也可以啦.
    我当初主要就是在 Result, Option 的模式匹配和迭代器那里坑了好久.
    hjc4869
        56
    hjc4869  
       2017-09-28 12:14:02 +08:00 via Android
    @neoblackcap 外部资源用 SafeHandle,被 GC 时自动关闭 fd
    icylogic
        57
    icylogic  
       2017-09-28 12:15:13 +08:00
    @dbw9580 这个该用 Unsafe 就要用 Unsafe …… Rust 设计出 Unsafe 不是拿来吓人的。C++ 实现高性能的 low-level data structure 也要用 owning raw pointer。

    > This problem cannot be solved (at scale) by transforming all owning pointers to unique_ptrs and shared_ptrs, partly because we need/use owning "raw pointers" as well as simple pointers in the implementation of our fundamental resource handles. For example, common vector implementations have one owning pointer and two non-owning pointers.
    -- https://github.com/isocpp/CppCoreGuidelines

    libc++ 的 forward_list: https://github.com/llvm-mirror/libcxx/blob/master/include/forward_list

    但是本来一般人就不应该自己实现链表这种级别的东西,除了学算法和数据结构的时候。所以也就应该用 Safe Rust 和 Smart Pointer + Non-owning raw pointer
    chinuno
        58
    chinuno  
       2017-09-28 12:46:34 +08:00 via Android
    现在我也在用 rust 写自己的小项目。感受跟你差不多。rust 语言的特性我是非常喜欢的,但是写的过程并没有原先想象中的那么享受。
    rust 有 cargo 这样方便的项目管理工具,然后 cargo 现在做的感觉还不是很好,一般的 lib 或者 bin 项目能够满足需求,稍微复杂一点的就很麻烦了。为了解决自己的奇葩项目结构花了好长时间才搞定。
    rust 正式版已经出来好长时间了,编译器也做到了自举,然而 bug 还是不少,照说不该发生第三方库同个大版本不同小版本有的能编过有的不行的问题,而我却遇到了。
    第三方库其实问题都能用 ffi 调用 c 库解决的,而 GitHub 上找一圈每个库的 rust 封装都有好多版本,写的却都不是很好,能够一直更新下去的像 glutin 基本上都见不到了。在 gui 图像方面做得最好的库 glium,基本上所有相关的项目都在用。但是 glium 的作者也对当前的情况感觉挺绝望的,发帖表示不想再维护下去了,并开了个组织丢给社区维护了。虽然语言小众,但是开发者的热情却低成这样,感觉挺不应该的。
    IDE 方面我一直用的 vs code,加上 rust 的插件感觉还行。最近的插件加了 rls 支持,但是体验并不好。不知道是怎么回事,刚开始用的时候各种补全提示都很棒,但是后来就废了。每次一开代码要开始编辑总是会报 rls 崩掉,然后只能当记事本来写代码了。
    自己的小项目现在写完一半了,核心的部分也都完成了,完成的部分自己感觉运行起来效果不错。但是不知道是不是能够坚持到把整个项目完整写完,因为开发过程真的太痛苦了。
    samray
        59
    samray  
    OP
       2017-09-28 13:49:43 +08:00
    @wspsxing 我还是觉得 Rust 是函数式的变成语言, [The Rust Programming Book]( https://doc.rust-lang.org/stable/book/second-edition/ch17-00-oop.html) 也对 Rust 是不是面向对象的语言进行了分析.这个具体看各人的看法和理解吧.
    samray
        60
    samray  
    OP
       2017-09-28 13:55:29 +08:00
    @chinuno 第三方库就是我在文章里面提及的生态还没有蓬勃起来,所以很多类库都没有或者是类库是刚开发不久,还没成熟,这个也只能等 Rust 的生态起来.至于 IDE, 我自己只是用 Emacs, 所以不太清楚 vs code, 但是我也用过 rls,rls 还是很容易崩溃.我觉得最痛苦的就是编译的时候,感觉就真的好像考试等老师改卷那样,不行只能重新写.现在 Rust 还没有真的普及起来,学习 Rust 也不能找到工作,但是我觉得这样会使学习变得更加纯粹,喜欢一样东西就去学习,并且使用它,享受这个工程.希望你能坚持下去啦,我也理解你开发的痛苦 :), 共勉咯
    neoblackcap
        61
    neoblackcap  
       2017-09-28 14:00:46 +08:00
    @hjc4869 @cholerae
    我是被降权了?谁 at 我都没有通知。
    的确有方法可以解决。我是想说明 GC 不是万能的,认为有 GC 就不会有泄露那是会出事的。GC 只管内存,其他他关不了,Java 之类的托管语言可以释放资源是因为将资源与对象绑定在一起了,对象析构了,资源也相应释放。
    aristotll
        62
    aristotll  
       2017-09-28 14:02:07 +08:00
    如果不是 rust IDE 支持太弱 我也准备用 下
    samray
        63
    samray  
    OP
       2017-09-28 14:06:42 +08:00
    @aristotll 你可以尝试一下 intellij-rust, jetbrain 系 IDE 上的 Rust 插件,可能现在来说是补全功能最好的,只不过我是个 Emacs 用户,也没什么兴趣去尝试 intellij-rust 而已.
    narcotics
        64
    narcotics  
       2017-09-28 14:55:54 +08:00
    @samray #51 截图第一张来自游戏 FireWatch

    没记错的话同样的一张图还在推特上引起过骂战,原因就是某大厂直接用来做宣传背景图,和你一样(雾
    samray
        65
    samray  
    OP
       2017-09-28 15:39:34 +08:00
    @narcotics 我之前在 Reddit 上看到这张图的,所以就拿来当背景图了,这个会不会引起纠纷呢?
    secondwtq
        66
    secondwtq  
       2017-09-28 23:16:20 +08:00   ❤️ 1
    @samray Rust 显然和 OO 差得有点远,但是 Object-Oriented 和 Functional 并不是对立的概念,Imperative 才是
    同样 Rust 和 FP 差得也有点远
    另外就个人体验而言,同样叫 FP,在 JavaScript (OOP 和 imperative 的底子,扯了个 functional 的大旗),ML (functional 和 immutable 为主,支持 imperative 来填坑),Haskell (pure, lazy) 三种语境和生态下面的感受是完全不同的
    抛开语言本身,生态和实践也很重要,Rust 自身 System Programming 的定位其实有把 Rust 往 imperative 一方拉的可能性
    Scala 可能会稍微好一点,我不是很了解,但是可能有许多人还是在把 Scala 当 imperative 的编程语言在用

    @aristotll 其实可以说只有 https://www.jetbrains.com/products.html 这个左边列出来的编程语言有可以让人接受的 IDE 支持
    很多乱七八糟的编程语言是没有像样的 IDE 的,但是并不代表没有学习的价值
    @neoblackcap “将资源与对象绑定在一起”,这是个好东西,可是不是 Java 的专利,更不是“托管语言”的专利,C++ 很早以前就有,直到现在也是 C++ 非常重要和独特的特点
    我不了解 Java,但是根据我的知识,tracing GC 和 RAII 是存在矛盾的,tracing GC 下对象的生命周期是非确定的(甚至不保证会被释放),因此不建议开这个口子
    @ipwx 你和楼主研究的就不是一种问题。
    你在教楼主怎么写微博,楼主做这个项目可能只是想写个 Snapdrop,Godbolt,最多不过 gogs 或者 Hacker News 之类的东西

    另外我无法接受
    “编程语言只是一种工具而已”
    “分布式系统比博客更有意义”
    “ web 架构才是万变不离其宗的,才是值得研究的东西”
    这种言论
    samray
        67
    samray  
    OP
       2017-09-28 23:40:55 +08:00
    @secondwtq 这个 Rust 有 OOP 的编程范式这个不是我自己的见解,而是 Rust 官网提出的,如果把 Rust 里面的 Structure 当作 Java 的类来用,也是对数据和方法进行封装,只是暴露调用的接口,这样就可以算是 OOP. Rust 官网说这个取决于你怎么去定义 OOP
    lrxiao
        68
    lrxiao  
       2017-09-29 13:29:37 +08:00
    不是 trait object 要 Sized 这个 safety
    alvie
        69
    alvie  
       2017-09-29 18:21:08 +08:00
    想订阅 lz 博客,似乎还不支持 rss
    samray
        70
    samray  
    OP
       2017-09-29 18:35:00 +08:00
    @lrxiao 有个具体的例子或者是相关的链接么?
    samray
        71
    samray  
    OP
       2017-09-29 18:36:07 +08:00
    @alvie 这个功能我也是计划写的,但是觉得没人会订阅我的博客,所以我这个功能就搁置了 :(
    krircc
        72
    krircc  
       2017-09-29 19:22:17 +08:00
    kylyp : 使用 rocket 的 web 框架,diesel 的 ORM,postgresql 和响应设计来建立一个新的论坛。

    项目地址 : [kylyp]( https://github.com/mcux/kylyp)
    cholerae
        73
    cholerae  
       2017-09-29 19:55:50 +08:00
    @blackanger 我就是这个意思啊= =
    samray
        74
    samray  
    OP
       2017-09-29 21:30:56 +08:00
    @krircc 比较好奇, 这个论坛是在运行么?
    samray
        76
    samray  
    OP
       2017-09-29 22:11:34 +08:00
    @lrxiao https://brson.github.io/rust-anthology/1/all-about-trait-objects.html#obtaining-a-trait-object 你可以看看这里关于 trait 的说明, rust primer 关于 trait 很多内容都是出自这里的,但是这里是更加详尽滴.
    samray
        77
    samray  
    OP
       2017-09-29 22:16:38 +08:00   ❤️ 1
    @KeepPro C 我觉得难的地方不在于语言本身,在于 C 是很底层的语言,就意味这你要了解和用好这门语言, 操作系统,计算机组成原理这些东西就肯定要了解的. C 和 Rust Scala 都是为不同的情景设计的, 不会说很难学的. 只要有了动机,一切问题都很容易解决的.
    krircc
        78
    krircc  
       2017-09-30 07:42:33 +08:00
    @samray 没有上线,因为我没服务器
    DavidGao
        79
    DavidGao  
       2017-09-30 14:04:48 +08:00
    不错,不错,非常好。不过相比下 Rust 也好,Go 也好,都是对 C 的改进,但是感觉写来学去还是 C 好。
    BarrelTitor
        80
    BarrelTitor  
       2017-10-05 23:04:36 +08:00
    刚开始看 rust。。。楼主这个项目后期打算继续做吗
    samray
        81
    samray  
    OP
       2017-10-05 23:14:14 +08:00 via Android
    我的博客现在还不完善,况且,我打算把博客当作我的试验田,实现我的想法,所以我会继续完善的
    tairan2006
        82
    tairan2006  
       2017-12-16 21:53:09 +08:00
    rust 确实没必要拿来做 web,没有任何优势…可以写一些系统级的工具,比如 ripgrep 这种…

    另外模式匹配这个,swift 支持的也挺好
    cielpy
        83
    cielpy  
       2018-02-20 21:53:25 +08:00
    @samray
    @ipwx

    前不久我准备用 Rust 写一个 Web 应用来着,后来看了 Rust 的生态决定还是用 Python 来好一点,之前考虑用 Rust 写 Web 应用的初衷和楼主一样,就是找一个项目练手,而不是为了造一个轮子,决定用 Python 来写的另外原因是找到另一外不错的练手项目🤣
    itfanr
        84
    itfanr  
       2018-06-19 19:17:11 +08:00
    LINEX
        85
    LINEX  
       2018-09-04 20:11:16 +08:00
    现在 rust 可以用 idea 的 rust 插件, 感觉效果还不错(宏展开的配置得关掉, 不然速度非常慢...)
    chenzesam
        86
    chenzesam  
       2020-10-28 18:15:47 +08:00
    今日的中文社区如你所愿~
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3381 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 53ms · UTC 04:31 · PVG 12:31 · LAX 21:31 · JFK 00:31
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.