首页 / Rust 入门教程 / Hello World:第一个程序

Rust 入门教程

Hello World:第一个程序

本教程共 78 篇 · 第 4 篇 · 更新于 2026-08-08 · 约 6 分钟阅读

RustRust 入门教程Hello Worldmain 函数printlnrustc编译运行

本节目标:亲手写出一个能在屏幕上打印 “Hello, world!” 的 Rust 程序,理解 main 函数和 println! 宏,并跑通”编译→运行”的完整流程。

学任何语言,第一个程序几乎都是向世界问好。Rust 也不例外。这一章我们绕过 cargo,直接用最朴素的 rustc 编译器,让你看清”写代码、编译、运行”这条最原始的链路。

4-1 先写源代码

新建一个文件,命名为 main.rs。注意扩展名是 .rs,这是 Rust 源文件的标志。在里面写:

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

就这四行(含大括号占的行)。下面逐行拆给你看。

  • fn main()fn 是 function(函数)的缩写,main 是函数名。Rust 规定,每个可执行程序都必须有一个叫 main 的函数,它是程序启动的入口,就像房子的大门。程序一运行,就从 main 的第一行开始执行。
  • 那对花括号 {} 把函数体包起来,里面是要做的事。
  • println!("Hello, world!");:把引号里的文字打印到屏幕,然后换行。
Note

行尾那个分号 ; 不能省。在 Rust 里,大多数语句以分号结尾,告诉编译器”这条指令结束了”。初学者漏写分号是最常见的编译错误之一。

4-2 为什么 println 带个感叹号

你一定注意到了 println! 末尾有个感叹号。这不是打字手滑,而是 Rust 在明确告诉你:这是一个宏(macro),不是普通函数。

宏和函数的区别在于,宏在编译期就被展开、能做一些函数做不到的灵活事情。比如 println! 能接收不定数量的参数、能做格式检查。你暂时不用深究宏的原理,只要记住一个识别规则:! 的通常是宏。后面还会遇到 vec!panic! 等宏。

4-3 编译它

打开终端,进入 main.rs 所在的目录,执行:

rustc main.rs

如果代码没问题,这条命令悄无声息地结束,当前目录里会多出一个可执行文件:

  • Windows 下是 main.exe
  • macOS / Linux 下是 main(没有扩展名)

rustc 把你的 .rs 源文件编译成了机器能直接跑的程序。运行它:

# Windows
.\main.exe

# macOS / Linux
./main

屏幕会输出:

Hello, world!

看到这行字,你就算正式写出 Rust 程序了。别小看这行输出,它标志着编译器、链接器、你的代码三者第一次成功合作。

4-4 编译到底发生了什么

rustc main.rs 这一步背后,编译器干了四五件事:先把你的代码做词法语法分析,再检查类型和安全规则,然后把中间代码优化,最后调用系统的链接器,把标准库等部分拼进去,生成可执行文件。

跟 Python 那种”边读边执行”的解释型语言不同,Rust 是先完整编译、再运行。好处是编出来的程序跑起来飞快、且不依赖解释器;代价是每次改代码都要重新编译,开发时等编译会有一点时间成本。习惯了就好。

Tip

编译产生的 main / main.exe 是二进制文件,可以拷到别的同系统机器上直接运行,不用装 Rust。这就是”编译型语言”的便利:交付的是成品,不是源码。

4-5 常见的第一个报错

如果你故意把 println! 写成了 println(漏掉感叹号),编译器会报类似:

error[E0425]: cannot find function `println` in this scope

如果你漏了分号,会看到:

error: expected `;` after statement

Rust 的报错信息在业内是出了名的人性化,通常会告诉你错在哪一行、为什么错、甚至给出修改建议。遇到红色报错别慌,就着它给的提示改,这是和编译器磨合的日常。

4-6 缩进与代码风格

你注意到 println! 那行比 fn main() 往里缩了一截吗?那是缩进,Rust 惯用 4 个空格。缩进不影响程序对不对,但影响可读性。后面会装 rustfmt,一条命令自动帮你排整齐,不用手动纠结空格数。

4-7 下一步:交给 cargo

直接用 rustc 适合单文件小实验。但真实项目有成百上千个文件,还要管依赖、管构建配置,全靠手敲 rustc 会疯。所以下一章起,我们正式请出 cargo——它会替你创建项目骨架、一键编译运行、管理第三方库。这一章你只要记住 main 函数是入口、println! 带感叹号、编译运行分两步,就够用了。

4-8 读懂编译器的报错信息

rustccargo 编译时,几乎一定会遇到红色报错。别怕,Rust 的报错是业界出了名的人性化,学会读它能省大量时间。一个典型的报错长这样:

error[E0382]: borrow of moved value: s
 --> src/main.rs:5:5
  |
3 |     let s = String::from("hi");
  |         - move occurs because `s` has type `String`
4 |     take(s);
  |          - value moved here
5 |     println!("{s}");
  |                ^ value borrowed here after move

它告诉你:错误代号 E0382、发生在哪一行、哪一步发生了移动、为什么后面不能再借。很多报错还附带”帮助(help)“给出修改建议。

Tip

遇到看不懂的报错,两招:一是直接读它指出的行号和原因,Rust 通常说得很直白;二是把错误代号(如 E0382)粘到搜索引擎,官方文档有每一条的详细解释。新手阶段一半的”卡住”都是因为没耐心读报错,其实答案常常就在红色字里。

Note

报错里的 --> src/main.rs:5:5 表示”文件:行:列”,帮你精准定位。养成”先看行号、再看原因”的习惯,比盯着整屏红字发愁高效得多。

4-9 从目录视角看最小程序

从”目录视角”再看一遍最小程序:main.rs 放在 src/ 下,你用 rustc 直接在文件所在目录编译即可,不依赖 cargo。这是理解”源码→编译器→可执行文件”最直接的方式。等接入 cargo 后,main.rs 的位置约定不变,只是编译由 cargo 代劳、产物进 target/

Note

记住 rustccargo 的关系:rustc 是单文件编译器,cargo 是项目级协调者(它内部也是调 rustc)。先用手动 rustc 体会底层流程,再交给 cargo 提效,这个顺序能帮你建立”工具链分层”的清晰心智。

4-10 小结

第一个程序虽短,但跑通了”写代码→编译→运行”的完整链路:main 是入口、println! 带感叹号、rustc 编译出可执行文件。遇到红色报错别慌,Rust 的报错信息会指明行号和原因,是帮你而非为难你。下一章请出 cargo,让项目管理自动化。