2023.2.1 —— 润色语句,减少翻译腔。
本文翻译自 Hecto, Chapter 1: Setup – Philipp Flenker – Engineering Manager,封面图也来源自此。
哈哈,第一步。难道你不喜欢在一块空地上的全新开始吗?然后选择一块砖,在上面建造属于你的整个宫殿。
扫兴的是,万事开头难。当你要开发一个计算机程序时,第一步有点……困难并且还容易让人觉得挫败。你必须确保(开发)环境是为你所使用的程序设计语言设计的,而且你必须知道怎样在该环境下编译和运行程序。
令人欣慰的是,安装 Rust 的开发环境是相当轻松容易的,除了一个文本编辑器,Rust 和 Cargo 外,我们不需要别的东西。为了安装这些程序,我们将使用一个叫作 rustup
的程序,当然也有其他的方式来安装和运行 Rust(译者注:推荐使用 rustup
这种安装方式)。
如果你使用 Linux 或者任意 Unix 系统包括 MacOS,按照下面的步骤做就好。如果你在 Windows 平台,你需要使用 Linux 系统。最简单的方法是使用 Linux 的 Windows 子系统(WSL),它在 Windows 10 上面可用。你也可以在 Windows 上安装和运行 Rust,不过,在你跟随教程学习的过程中,很快会遇到问题,并且无法完成本教程。
在 2019 年, 本教程发布之后发生了很多变化。其中之一是本教程用到的一个库,现在有一个可以运行在 Windows 电脑上的替代品了。一旦我们介绍到这一部分,我将说明这个替代方案,但本教程仍将使用原来的库。
怎样通过 rustup
安装 Rust
如果你访问了 rustup 的官网,它会尝试自动检测你的操作系统,并展示安装 rustup 的最佳方法。一般情况下,你下载并执行一个脚本 — rustup-init
,它会帮你完成安装。
然而,如果你下载并执行远程脚本会报错(red flag),你可以点击其他安装选项,直接下载 rustup-init
,为你的电脑安装 Rust。
译者注:原文作者放的链接指向了 Rust 的官方 Github,经译者检查没有相应的链接。可以尝试使用该链接下载 rustup-init 。
完成在 Linux、MacOS 或者 Linux 的 Windows 子系统(WSL)的安装
安装完成之后,安装程序会通过打印下面的信息来告诉你安装完成:
Rust is installed now. Great!
为了开始使用 Rust,你要么重启终端要么输入:
$ source $HOME/.cargo/env
添加链接器
(译者注:这段内容可能已经过期,不再适用于 2021 版本的 Rust,故省略。)
检查你的安装效果
为了验证 Rust 已经被正确安装,运行下面的命令:
rustc --version
对于 Cargo,运行:
cargo --version
在这两种情况下,你应该能够看到程序名称、版本数字和一些其他信息。如果不是这样的话,请参考 官方 Rust 权威指南中关于安装的章节来解决你的问题。
main 函数
切换到你打算开始开发(程序)的目录,然后输入:
cargo init hecto
// 译者注 cargo new hecto 也可以
hecto
是我们要开发的文本编辑器的名字。执行该命令会创建一个叫做 hecto
的文件夹,它早已设定好了 git (因此包含了一个文件夹 .git
和一个文件 .gitignore
)。本教程中,我们不会使用 git,所以你可以忽略这两个文件。
让我们看看还发生了什么:
在我们详细介绍之前,首先弄明白上面的图片是什么。它们是 diff 文件,展示了一次代码改动发生的变化。(译者注:原文 diff 内嵌于 HTML 文件中,译文放的是截图。如果代码内容过长,我会在下方补充缺失的代码。)在每一步的下面,你会找到相应的 GitHub 链接。在那里你还可以浏览这时文件的其它内容。这在你犯迷糊的时候,会很有用。 每一个 diff 指出文件中添加、修改或者删除的内容。如果是修改,它会显示删除的代码为红色,添加的代码为绿色。
如你在(上面) diff 中看到的那样,cargo init
创建了一个叫作 Cargo.toml
的文件,它预先填入了一些信息。更具体地说,方括号表示章节。下面的依赖部分是空的,而 package
部分包含:
- 程序的名称,默认是
cargo
包的名称。 - 现在程序的版本,默认以
0.1.0
开始。 - 作者列表。在这个例子中,预先填入我的名字和邮箱地址。
- 一个叫做 edition 的字段,它告知编译器哪个该用哪个版本(edition)的 Rust。
如果你了解 JavaScript 的话,Cargo.toml
跟 package.json
类似。它描述你的包和其对其他包的依赖。
此外,还有一个叫做 src/main.rs
的文件,其中早已包含了一些代码:
fn main() {
println!("Hello, world!");
}
该代码定义了一个叫作 main
的函数。main
函数是特殊的。当你运行程序时,它是默认入口(starting point)。当你从 main 函数返回时,程序退出并将控制权返还给操作系统(译者注:近似于 C 中的 main
函数)。因此,在没有任何 Rust 知识的情况下,我们仍然可以推断出该程序遵循”世界惯例“,打印输出 “Hello World!“,然后退出。让我们看看怎样运行它吧。
Rust 是编译型语言。这意味着我们需要通过 Rust 编译器将其转换为可执行文件来运行程序。然后,像我们运行其他命令行程序那样,运行这个可执行文件。
为了编译 main.rs
,首先确定你在 hecto
文件夹下(在 cargo init hecto
后输入 cd hecto
)
,然后在你的 shell(终端)中输入 cargo build
。输出结果差不多是这样:
Compiling hecto v0.1.0 (/Users/flenker/Documents/Repositories/hecto)
Finished dev [unoptimized + debuginfo] target(s) in 0.45s
这样会生成一个叫 hecto
的可执行文件,并把它放在一个叫 target/debug/
的新文件夹下。此外,一个叫 Cargo.lock
的文件会被创建。它自动创建,并且不需要打开(touch)。当我们稍后添加依赖到项目中时,Cargo.lock
也会更新。它的变化与本教程无关,因此在 diff 中被隐藏掉了。
如果你继续看 target/debug
中的内容,你会发现还有很多文件。这些大都是 cargo 用来让重新构建代码更有效率的文件(稍后会有更多介绍)。你不需要除可执行文件外的任何一个文件来运行 hecto
。输入 ./target/debug/hecto
(或者是 ./hecto
,如果你已经切换到了 /target/debug
)然后按下 Enter
。程序应该输出 Hello, world!
并退出。
编译和运行
因为你想编译并(同时)运行程序是很常见的,所以 Rust 用 cargo run
命令把两个步骤结合起来。如果你在 cargo build
之后运行这条命令,你会发现输出变了一点。它看起来差不多是这样:
Finished dev [unoptimized + debuginfo] target(s) in 0.00s
Running `target/debug/hecto`
Hello, world!
也许你会注意到,cargo
没有输出以 Compiling(正在编译中 开头的行,因为编译早就执行过了。这是因为 Rust 能分辨出现在版本的 main.rs
早已被编译过了。如果 main.rs
自从上次编译没有被修改过,那么 Rust 不会麻烦地再次编译。如果 main.rs
修改过了,那么 Rust 会重新编译main.rs
。这对于有许多不同组件需要编译的大型项目来说比较有用,因为当你只对一个组件的源代码进行修改时,大部分组件应该不需要反复编译。
试着把 main.rs
的返回值改为 Hello, World
以外的字符串。然后运行 cargo run,你会看见它被编译。检查结果是否是你修改之后的字符串。然后改回 Hello,World
,重新编译,并确保它又重新返回 Hello,World
。(译者注:原作者用”返回“表示程序打印输出的字符串,不是通常意义上的函数返回值 return
。)
在本教程的大多数步骤之后,你需要重新编译代码,看看它有没有在你的代码中发现任何错误,然后通过调用 cargo run
来运行 hecto
。
在下一章中,我们将致力于实现从用户那儿读取单个按键输入。