在今年的 Great Wide Open conference 上,Steve Klabnik 就 Mozilla 的 Rust 编程语言 发表了演讲。Klabnik 之前撰写了一本 Rust 入门教程,名为 Rust for Rubyists,而这次演讲的目的与之类似。然而,这次演讲并非以 Ruby 为中心,而是面向所有程序员。因此,演讲的标题为:Rust for $LANGUAGE-ists。
Klabnik 的演讲包含三个部分。首先,他介绍了 Rust 语言的起源以及该语言的未来发展方向。第二部分涵盖了代码示例。这些示例从无处不在的 “Hello World” 到更复杂的示例,突出了 Rust 与其他语言的不同之处。最后一部分提供了学习更多关于 Rust 的资源。
下面,我将介绍 Steve Klabnik 演讲的一些亮点,但我强烈建议您 在 YouTube 上观看他的演讲,或者 阅读他的演讲幻灯片。我从他的演讲中学到了很多,我相信您也会如此。
什么是 Rust?
Rust 是一种系统语言,是 C++ 的替代品。理论上,您可以将 Rust 用于任何您会使用 C++ 的编程项目。Rust 相对于 C++ 的优势在于,Rust 从一开始就被设计为 “安全、并发和快速”。
最初,Rust 是 Graydon Hoare 的个人项目,他在 Mozilla 工作。当 Mozilla 想要成立一个研发部门时,Rust 成为了它的第一个项目。Mozilla 编写了大量的 C++ 代码,并且不得不处理 C++ 的缺点。例如,在上次 Pwn2Own 竞赛中,Firefox 中发现的所有三个漏洞都是因为 C++(例如,指针管理不当)。在 Rust 中,这些类型的编程错误甚至无法编译。
Hoare 不再领导 Rust 的开发。他已经转向其他项目。Rust 已经达到了足够成熟的开发阶段,该项目可以脱离其原始开发者继续进行。但这并不意味着 Rust 是一个完全成熟的项目。当前版本是 0.10,新版本确实会破坏兼容性。早期版本的代码示例和文档可能不适用于最新版本,因此可能会给新用户带来一些困惑。版本 1.0 即将发布,该版本将稳定一切。
Rust 正处于其生命周期的关键时刻。它尚未完全成熟,因此有些人可能会因此而不使用它,但它需要人们使用该语言来在 1.0 版本发布之前对其进行改进。该项目需要来自不同视角的人们进行审视,以确保 Rust 1.0 版本尽可能地出色。
代码示例
Rust 中的 Hello World
use std::io::println; fn main() { println("Hello, world"); }
这是用 Rust 编写的标准 “Hello World” 应用程序。对于任何有 C 风格、大括号语言经验的人来说,它应该看起来足够熟悉。第一行导入 println
函数。Main 使用 fn
而不是 int
、public static void
或类似的声明。Rust 与 C/C++/C#/Java 程序员习惯的略有不同,但又足够接近,以至于不会完全陌生。
段错误
int main(void) { char *s = "hello world"; *s = 'H'; }
这段 C++ 代码将在警告的情况下编译,但运行时会发生段错误。Rust 的设计旨在阻止这种情况发生,如下例所示。
fn main() { let s = &"hello world"; *s = "H"; } segfault.rs:3:4 3:6 error: type &str cannot be dereferenced sefault.rs:3 *s = "H"; ^~ error: aborting due to previous error task 'rustc' failed at 'explicit failure', ...
Rust 没有编译,而是打印出上面的错误消息。这是 Rust 的优势之一。它对安全性的关注意味着它的设计旨在阻止像上面 C++ 示例中的错误进入编译后的代码。
更复杂的示例
fn main() { let nums = [1, 2]; let noms = ["Tim", "Eston", "Aaron", "Ben"]; let mut odds = nums.iter().map(|&x| x * 2 - 1); for num in odds { spawn(proc() { println!("{:s} says hello from a lightweight thread!", noms[num]); }); } }
这段代码展示了 Rust 的几个特性。Rust 使用 let
关键字来定义变量。代码的第二行和第三行创建了一个整数向量 (nums
) 和一个字符串向量 (noms
)。Rust 支持类型推断,因此没有必要显式声明向量包含整数或字符串。下一行突出了 Rust 中变量默认是不可变的事实。如果您想使变量可变,请使用 mut
关键字。for
循环看起来类似于您在更现代的语言(如 Ruby 或 Python)中看到的循环,但它编译成与传统 C++ for 循环相同的机器代码。spawn(proc())
代码块演示了 Rust 如何创建一个线程来运行函数。最后,println!
行显示了 Rust 如何处理替换。在示例中,{:s}
将被 noms[num]
中的值替换。
我介绍的示例只是冰山一角。Klabnik 的演讲包含许多其他 Rust 代码示例。就像我上面说的那样,他的演讲非常值得观看。您将学到很多东西。如果您想尝试演示文稿中的示例,请确保下载 Rust 0.10。当前的 nightly 构建版本已经更改了一些内容,因此某些示例将无法正常工作。
Rust 资源
为了结束他的演讲,Klabnik 建议了以下资源来学习更多关于 Rust 的知识。但是,他确实警告说,Rust 的官方教程 “很糟糕”,并且正在重写中。
教程
讨论
- rust-dev 邮件列表
- /r/rust on Reddit
- #rust on irc.mozilla.org
- This Week in Rust
查看 GitHub 上的 Rust 并参与其中。
4 条评论