Skip to content

【译】 第一章:安装环境

April 10, 2022 | 06:23 AM

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,所以你可以忽略这两个文件。

让我们看看还发生了什么:

到 Github 查看这一步。

在我们详细介绍之前,首先弄明白上面的图片是什么。它们是 diff 文件,展示了一次代码改动发生的变化。(译者注:原文 diff 内嵌于 HTML 文件中,译文放的是截图。如果代码内容过长,我会在下方补充缺失的代码。)在每一步的下面,你会找到相应的 GitHub 链接。在那里你还可以浏览这时文件的其它内容。这在你犯迷糊的时候,会很有用。 每一个 diff 指出文件中添加、修改或者删除的内容。如果是修改,它会显示删除的代码为红色,添加的代码为绿色。

如你在(上面) diff 中看到的那样,cargo init 创建了一个叫作 Cargo.toml 的文件,它预先填入了一些信息。更具体地说,方括号表示章节。下面的依赖部分是空的,而 package 部分包含:

如果你了解 JavaScript 的话,Cargo.tomlpackage.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

下一章中,我们将致力于实现从用户那儿读取单个按键输入。