我已经学习 Rust 有挺长的一段时间了,一直想用 Rust 来写点东西,可是缺少好的想法; 有些想法自我感受良好,可是又没有能力实现 (好比,写一个操做系统?), 因此最后我决 定仍是拿个人博客来作实验品吧。我原来的博客 是 基于 Github Page 和 Org mode 实现的静态博客,略显简单。因此我就以为用 Rust 来写 个新的博客。程序员
先后花了一个月的空余时间来写这个博客,写完这个博客以后,我以为我应该算是有点 Rust 的编程经验了 ;-). 在学习 Rust 和使用 Rust 的时候,我老是将 Rust 和我平时使 用的语言进行对比。一段时间下来,我对使用 Rust 的感悟愈来愈多,因此我谈谈我眼中的 Rust算法
谈及 Rust, 首先想到的必定是内存安全,正如官网对 Rust 的定义:sql
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 算是打开 了一个新的大门。框架
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_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 进行操做。其余类库的版本如图:
如今 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 很 类似,它很强大,可是因为学习曲线等诸多缘由,游离于主流以外,可是它的强大和它的美 只有你亲身学习,亲身经历才能体会到的。这就是如鱼饮水,冷暖自知吧。
转自:v2ex