【在主画面加入捷径】
       
【选择语系】
繁中 简中

Rust 程序设计教学:准备工作

【赞助商连结】

    本章介绍撰写 Rust 程序前的准备工作。建议读者在自己的电脑上实地动手建置 Rust 开发环境,以便后续练习撰写 Rust 程序,这个过程不会花上太多时间。

    试用 Rust

    如果只是想先尝试一下 Rust 的语法,可到 Rust Playground 网站,即可在线撰写 Rust 程序,不需额外安装其他的软件。由于安全性考量,这个网站不能使用外部套件,只能用 Rust 内建的套件,对于初期的练习这样的环境已经足够。

    安装 Rust

    Rust 本身是跨平台的程序语言,同时支援 Windows、Mac、Linux、BSD 等多种平台,目前安装和管理 Rust 主要是透过 rustup 这只终端机程序。rustup 的优点在于可以很轻松地在不同版本和平台的 Rust 编译器间切换,对于更换不同 Rust 版本和交叉编译 (cross-compiling) 相当方便。

    Windows

    在 Windows 系统中,根据不同的 C/C++ 编译器,对应不同的 Rust 版本,一个是使用 Visual Studio 的 MSVC ABI (Application Binary Interface),一个是使用 GCC 编译器的 GNU ABI,要使用那一个版本的 Rust,要看使用者想使用那个版本的 ABI 所建立的函式库而定。若读者没特别的偏好,建议以 GNU ABI 较佳,原因在于日后需要引用第三方 C/C++函数库时,使用 GNU ABI 可以搭配 MinGW/MSYS2 所提供的第三方 C/C++函数库。

    在 Windows 下,到 Rust 官网下载 rust-init.exe 这只小型程序即可安装 rustup。启动后会出现以下画面:

    在 Windows 下安装 Rust (1)

    按 y 后,继续来到以下画面:

    在 Windows 下安装 Rust (2)

    默认是安装 x86_64-pc-windows-msvc 版本的 Rust,但我们要使用 GNU ABI 的版本,故选 2,修改安装版本。

    参考下图,修改为 x86_64-pc-windows-gnu 的 stable 版本:

    在 Windows 下安装 Rust (3)

    之后,会自动下载 Rust 相关的程序,结束后关闭视窗即可。

    在 Windows 下安装 Rust (4)

    日后若需要 MSVC ABI 版本的 Rust,也不需重装,因 rustup 可在不同版本的 Rust 间切换。由于 Rust 的标准函式库是跨平台的,笔者通常习惯在类 Unix 系统下撰写 Rust 项目,仅在需要时将该项目移到 Windows 系统下编译,若没有用到第三方 C/C++函数库,通常都可以编译成功,也不需要针对特定平台撰写条件式编译程序代码以调用特定平台的函式,可说是 Rust 的一项优点。

    类 Unix 系统

    对于 Mac 和 Linux 等类 Unix 系统,rustup 提供 shell 脚本来安装。在终端机输入以下命令:

    $ curl https://sh.rustup.rs -sSf | sh

    rustup 会出现提示文字,可视需求自行调整,若没有特别需求,接受默认选项即可。 rustup 和 Rust 都会安装到 $HOME/.cargo/bin 数据夹,再将此路径加入 PATH 变量即可。

    使用 rustup 管理 Rust

    透过 rustup 可管理多个版本的 Rust,相当方便,本节介绍 rustup 的使用方式。

    更新 Rust

    Rust 有三个不同的版本,分别为 stable、beta、nightly,有一些实验性质的特性,仅放在 nightly 版本的 Rust。默认情形下,rustup 会安装 stable 版本的 Rust。输入 rustup update 即可更新 Rust:

    $ rustup update
    info: syncing channel updates for 'stable'
    info: downloading component 'rustc'
    info: downloading component 'rust-std'
    info: downloading component 'rust-docs'
    info: downloading component 'cargo'
    info: installing component 'rustc'
    info: installing component 'rust-std'
    info: installing component 'rust-docs'
    info: installing component 'cargo'
    info: checking for self-updates
    info: downloading self-updates
     
      stable-x86_64-unknown-linux-gnu updated - rustc 1.14.0 (e8a012324 2016-12-16)

    如果要更新 rustup,输入 rustup self update。

    $ rustup self update
    info: checking for self-updates
    info: downloading self-updates

    切换 toolchain

    Rust 有许多针对不同 CPU、系统、C/C++函数库的版本,透过 rustup 可快速地切换。先以 rustup toolchain list 列出所有可选的版本:

    $ rustup target list
    # Omit some message
    x86_64-apple-darwin
    x86_64-apple-ios
    x86_64-pc-windows-gnu
    x86_64-pc-windows-msvc
    x86_64-rumprun-netbsd
    x86_64-unknown-freebsd
    x86_64-unknown-linux-gnu (default)
    x86_64-unknown-linux-musl
    x86_64-unknown-netbsd

    musl 是一套小型的 C函数库,可用来在 Linux 下建立静态链接的机械码。若想安装以 musl 为基础的 Rust,使用 rustup target add

    $ rustup target add x86_64-unknown-linux-musl

    日后在编译项目时,可指定特定的 target:

    $ cargo build --target=x86_64-unknown-linux-musl

    使用实验性质的特性

    某些尚在实验性质、不稳定的特性,会在 nightly 版本的 Rust 发布。若想使用 nightly 版本的 Rust,输入 rustup install nightly

    $ rustup install nightly
    info: syncing channel updates for 'nightly'
    info: downloading toolchain manifest
    info: downloading component 'rustc'
    info: downloading component 'rust-std'
    info: downloading component 'rust-docs'
    info: downloading component 'cargo'
    info: installing component 'rustc'
    info: installing component 'rust-std'
    info: installing component 'rust-docs'
    info: installing component 'cargo'
     
      nightly-x86_64-unknown-linux-gnu installed - rustc 1.15.0-nightly (71c06a56a 2016-12-18)

    安装完后,可输入 rustup default 切换 Rust 版本:

    # Use nightly version
    $ rustup default nightly
     
    # Use stable version
    $ rustup default stable

    在实务上,较不建议使用 nightly 版本的 Rust,会造成项目程序代码的不稳定。

    交叉编译

    由于 Rust 的函式库是跨平台的,理论上,交叉编译也是可行的。假若想要在 Linux 上交叉编译某个 Rust 项目到 Mac 平台,在该项目的根目录输入以下指令:

    # Say that we are on Linux now
    $ cargo build --target=x86_64-apple-darwin

    注:经笔者实际测试,交叉编译有时仍有问题需自行排除,和该平台的 C/C++ toolchain 有关。

    若该 Rust 项目只用到 Rust 程序代码,应该都可以在不同系统间编译。若有用到第三方 C/C++函数库,则需自行建置交叉编译的环境。可参考 crosstool-NG 或其他的方案来建立环境,但交叉编译是较进阶的主题,本书不详述,请读者自行查阅相关数据。

    反安装 Rust

    如果因某些因素,决定不继续使用 Rust,可以用以下指令反安装 Rust 和 rustup:

    $ rustup self uninstall

    安装开发工具

    目前支援 Rust 的整合式开发环境 (IDE, Integrated Development Environment) 如下:

    • Eclipse
    • Visual Studio (搭配 Visual Rust)
    • IntelliJ IDEA

    目前支援 Rust 的编辑器 (editor) 如下:

    • Emacs
    • Vim
    • Sublime Text
    • Atom
    • Visual Studio Code

    注:Emacs 及 Vim 上手较为困难,程序设计初学者宜先尝试其他开发工具。

    对于练习用的程序代码或小型项目,使用编辑器较为轻巧方便,对于中大型项目,IDE 则支援较多的功能。笔者在图形接口下使用 Visual Studio Code,在终端机下使用 Emacs,而读者可自行从中选用喜欢的开发工具,这里就不列出每个工具的安装和使用方法。

    经笔者在 Windows 平台上实测,即使正确安装 Rust 编译环境,Visual Rust 仍然无法直接侦测系统上的 Rust。目前需要手动加入以下机码 (见此讨论串):

    C:\> REG ADD "HKLM\SOFTWARE\Mozilla Foundation\Rust\current" /v InstallDir /t REG_SZ /d "%USERPROFILE%\.cargo"

    经过设定后,即可正常使用。但是,现阶段不建议使用 Visual Studio + Visual Rust 做为开发工具,因为 Viusal Rust 产生的 Rust 项目不是标准的 Rust 项目,反而需要手动加入相关设定档,希望 Visual Rust 项目能改善此一问题。而 IntelliJ IDEA 在安装 Rust 外挂 (plugin) 可正确地侦测到系统上的 Rust,且产生标准的 Rust 项目,若有需要的读者可自行参考。

    Hello World

    接下来,我们用 Hello World 这徊经典的范例,熟悉撰写 Rust 程序的流程。

    首先,建立一个文字文件 *hello.rs*,加入以下的内容:

    fn main() {
        println!("Hello, World");
    }
    

    用 Rust 编译器 rustc 编译这个程序,然后执行:

    $ rustc hello.rs
    $ ./hello
    Hello, World

    如果成功显示出 Hello, World 字串,代表我们已经成功撰写第一个 Rust 程序。否则,需依据错误讯息调试。

    Rust 项目

    虽然我们成功编译出第一个 Rust 程序,随着项目的规模上升,外部相依性增加,编译指令会更复杂。为了简化编译软件的步骤,Rust 提供 Cargo 这个 Rust 项目管理程序。透过 Cargo,可以简化 Rust 项目编译、测试和发布等步骤。

    我们现在用 Cargo 重新撰写 Hello World 程序。Cargo 项目分为两种,一种是应用程序,一种是函式库,前者是可直接执行的可执行文件,后者则是供其他的外部程序调用。我们的 Hello World 程序属于应用程序。输入以下指令:

    $ cargo new --bin hello
    $ cd hello

    编辑 src/main.rs 文件,改为前述的 Hello World 程序代码。接着,执行该程序:

    $ cargo run
     Compiling hello v0.1.0 (file:///home/cwchen/src/rust_ex/hello)
      Finished debug [unoptimized + debuginfo] target(s) in 0.13 secs
       Running `target/debug/hello`
    Hello, world!

    若显示出 Hello World 字串,代表项目执行成功。

    若要编译程序,用 cargo build 指令即可。默认情形下,生成的是带有调试误息且未优化的机械码,若要生成对外发布的程序代码,则用 cargo build --release 指令即可。强烈建议日后在撰写 Rust 程序代码时,将程序代码以 Cargo 管理。本书假定读者使用 Cargo 管理程序代码,不会特别写出编译程序代码的指令。

    程序代码重排

    有些读者会一边撰写程序代码一边排版,不过,这种机械性的工作交给电脑比较好。像 Go 语言内建程序代码重排工具,省掉一些排版程序代码的时间,风格统一的程序代码,对软件工程上来说也有益处。Rust 社群也有自己的程序代码排版工具,输入以下指令即可安装:

    $ cargo install rustfmt

    在项目中输入 cargo fmt 即可对项目程序代码排版。rustfmt 项目网页上有介绍如何将 rustfmt 和编辑器整合,有需要的读者可自行参考。

    TAGS: DEV, RUST