在今年的 Great Wide Open 会议上,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
- 本周 Rust
查看 GitHub 上的 Rust 并参与其中。
4 条评论