讲动人的故事,写懂人的代码
孔子在2500多年前说过:"工欲善其事,必先利其器。"他老人家虽然只说出了结果,却没有说明原因。其实原因很简单,就像第1章中小小白从typst的"路人"转为"粉丝"的原因一样——顺手的工具能给你超好的用户体验。本章我们将通过实现嵌入式开发圈子里的"Hello, world!",来感受各种编程神器是否能带给你出色的用户体验。
那么,什么是嵌入式开发圈子里的"Hello, world!"呢?在这个圈子里,仅仅点亮一个LED还不够格,只有让LED持续闪烁(blink),才算真正完成了"Hello, world!",如图2-1所示:
图2-1 在嵌入式开发圈子里,"Hello, world!"就是让一个LED灯持续闪烁
2.1 查看AI写的闪烁代码改了什么
该如何修改上一章的点亮第一个LED的代码,使其闪烁呢?闪烁和点亮(常亮)的区别在于需要添加熄灭和延时的功能。我们可以像上一章那样,先运行下面的命令,从模板生成点亮LED的代码,然后在此基础上修改:
cargo generate wubin28/mb2-led-template
# 当工具提示输入Project Name时,可以输入b1l,表示Blink 1st Led
# 进入这个新创建的项目目录
cd b1l
但对于第一次编写熄灭和延时的代码,不会写该怎么办呢?
⚠️遇到从未编写过的代码时,程序员该如何处理?传统做法是上网搜索,然后复制粘贴并修改。现在有了AI助手,事情变得简单多了。只需这样问AI:"请阅读代码清单1-6,将其改造成让LED持续闪烁的代码,要求改动简单易懂,适合编程小白理解。"AI很快就会给出一份代码。
2.1.1 用Git管理代码版本
⚠️接下来的问题是:如何便捷地对比AI给出的代码,查看具体改动了哪些地方?最简单的方式是创建两个独立文件并使用文件对比工具,但这并不专业。对于版本管理这类需求,更好的解决方案是使用git这样的专业工具。再配合流行的编辑器VS Code,就能轻松查看代码的版本差异。
🔎Git是一个神奇的版本控制工具,就像时光机一样,帮助程序员记录和追踪代码的每一次变化。无论是独自开发还是团队协作,Git都能让你得心应手。
Git就像一个巨大的树屋,其中代码的版本树不断生长,每个新的变更都基于前一次提交延伸。每位开发者都拥有完整的代码副本,并且所有历史记录都保存在本地,因此无需持续联网工作。由于大多数操作都在本地完成,Git的运行速度也特别快。
Git最强大的特性是分支功能。你可以轻松创建实验分支,尝试各种想法,不满意时随时可以回到原始版本。每次提交代码时,Git都会详细记录修改者、时间和具体改动,就像一本完整的开发日志。借助GitHub等平台,团队成员可以便捷地共享和协作。
Git带来诸多好处:多人可以并行开发而不互相干扰,随时可以回退版本,支持离线工作。每次提交都有唯一标识,确保代码安全。此外,Git能在Windows、Mac和Linux上完美运行。
当然,Git也有一些挑战。新手可能需要时间记忆各种命令,操作不当可能会丢失代码。处理多人同时修改同一代码时需要一定经验,有时还需要掌握配套工具才能充分发挥Git的优势。
不过,Git确实适用于各类开发场景。从团队项目到个人开发,从开源项目到编程学习,Git都能发挥重要作用。虽然起步可能有些困难,但掌握基础命令后,你会发现它是个强大的助手。建议从基础开始,循序渐进地体会它的优势。
✅要保存点亮LED灯的代码的版本以便和AI生成的LED灯闪烁代码对比,请按表2-1所示要点安装Git:
表2-1 Git安装要点
| 在Ubuntu 24上安装Git | 在macOS上安装Git | 在Windows 11上安装Git |
|---|---|---|
# 查看git版本(检查是否已安装)git --versionapt list --installed | grep git# 推荐使用apt安装git sudo apt install git# 参考网页 git-scm.com/downloads/l… # 检查最新可安装版本 apt show git | grep Version# 升级 sudo apt updatesudo apt upgrade git | # 查看包管理器brew版本号brew --version# 若未安装brew则安装 /bin/bash -c "$(curl -fsSL <https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh>)"# 查看git版本(检查是否已安装) git --versionbrew info git# 推荐使用apt安装git brew install git# 参考网页 git-scm.com/downloads/m… # 升级 brew updatebrew upgrade git | # 查看git版本(检查是否已安装)git --versionwinget list git# 推荐使用winget安装git winget install --id Git.Git -e --source winget# 参考网页 git-scm.com/downloads/w… # 升级 winget upgrade --id Git.Git |
安装Git后,进入b1l目录并运行以下命令来查看代码库状态(注意:%是zsh的命令行提示符,它用来区分命令和输出结果,输入命令时不需要输入):
# 显示当前 Git 仓库的状态信息
% git status
On branch main # 当前处于 main 分支,我们主要就在它上面编程
No commits yet # 当前仓库尚未进行任何提交,意味着没有任何历史记录
Untracked files: # 列出了所有尚未被 Git 跟踪的文件和目录。
# 这些文件需要被明确添加到 Git 的跟踪列表中才能纳入版本控制
# 下面一行提示如何将未被跟踪的文件添加到暂存区,准备进行提交
(use "git add <file>..." to include in what will be committed)
.cargo/
.gitignore
Cargo.toml
Dockerfile
Embed.toml
README.md
src/
# 下面一行提示当前尚未将任何文件添加到暂存区(staging area),但存在未被跟踪的文件。
# 可以通过运行 git add <file> 来开始跟踪这些文件
nothing added to commit but untracked files present (use "git add" to track)
别担心看不懂上面的解释。关键是要明白cargo generate已经帮我们完成了Git仓库的初始化,并生成了相关文件。这些文件目前还未被纳入版本控制系统。要开始追踪它们,我们需要两步:先用git add命令将文件添加到暂存区(staging area),再用git commit命令提交它们。暂存区是Git在工作目录(Working Directory)和版本库(Repository)之间设置的中间区域,用来组织和管理即将提交的代码变更。
先看用git add .命令(注意后面的小数点不要忘记,它表示所有文件)将文件添加到暂存区,如下所示:
# 将当前工作目录中所有已修改或新建的文件添加到 Git 的暂存区
% git add .
% git status
On branch main
No commits yet
Changes to be committed: # 显示已经添加到暂存区的更改,这些更改将包含在下一次提交中
# 下面一行提示可以使用 git rm --cached <file> 将文件从暂存区移除
# (即撤销 git add 操作)
(use "git rm --cached <file>..." to unstage)
new file: .cargo/config.toml # 列出了所有被添加到暂存区的新文件,
# 表示它们将在下一次提交中被包含
new file: .gitignore
new file: Cargo.toml
new file: Dockerfile
new file: Embed.toml
new file: README.md
new file: src/main.rs
运行 git add . 后,所有文件(包括新文件和修改的文件)已被添加到暂存区。这些文件已准备好进行提交,可以使用 git commit -m "<message>" 命令完成首次提交。提交时需要添加提交信息,它能帮助我们日后查看这次提交修改了什么。这样就能将这些更改永久保存到 Git 的版本历史中:
# 将暂存区中的内容提交到版本库,记录到历史中
# -m:指定提交信息为 "chore: initialized the project"
# chore 是一种常见的提交类型,用于表示非功能性更改(如初始化项目、更新配置等)
# 提交注释也可以写中文,但练习用英文写能方便与国外程序员的沟通,
# 另外在AI翻译的帮助下写英文注释也不是难事
% git commit -m "chore: initialized the project"
# [main]:表示提交是在 main 分支上进行的
# (root-commit):表示这是该仓库的第一次提交(即根提交)
# b7d4d95:提交的唯一哈希值,便于跟踪该提交
[main (root-commit) b7d4d95] chore: initialized the project
# 7 files changed:共有 7 个文件被更改或新增
# 326 insertions(+):总共新增了 326 行内容
7 files changed, 326 insertions(+)
# create mode 100644:表示新增了这些文件
# 100644 是文件的权限标志,表示普通文件,且拥有者具有读写权限,
# 组和其他用户只有读权限
create mode 100644 .cargo/config.toml
create mode 100644 .gitignore
create mode 100644 Cargo.toml
create mode 100644 Dockerfile
create mode 100644 Embed.toml
create mode 100644 README.md
create mode 100644 src/main.rs
一目了然的Git提交信息前缀
🔎专业程序员在写git提交信息时,为何愿意用“chore: “这样的开头?
专业程序员在编写 Git 提交信息时,通常使用"chore:"等前缀来标记代码库的维护性更改。这些更改虽然不直接影响应用功能,但对项目的健康和可维护性非常重要。这种前缀规范让团队成员能快速理解每次提交的目的。
常见的 Git 提交信息前缀包括:
- feat:添加新功能
- fix:修复错误
- docs:修改文档
- style:调整代码格式(不改变逻辑)
- refactor:重构代码(不新增功能或修复错误)
- test:添加或修改测试
- chore:更新构建过程或辅助工具
采用这种提交信息规范能提高代码库的可读性,让团队协作更加顺畅。
此时如果再次运行 git status 命令查看代码库状态,会看到以下变化:
% git status
On branch main
# nothing to commit:暂存区中没有任何更改需要提交
# 说明工作目录中的所有修改已被提交,或者暂存区和工作目录都没有未跟踪的更改
# working tree clean:
# 工作目录是干净的,没有未被跟踪或未提交的文件
# 文件状态没有变化(没有新建、修改或删除的文件)
nothing to commit, working tree clean
而我们刚才那次提交,可以从下面的命令中看到:
% git log --oneline
# 打开一个字符界面,显示了上一次提交的哈希值和提交信息
b7d4d95 (HEAD -> main) chore: initialized the project
(END)
# 按q键退出
这表明先前点亮LED的代码已被保存在Git版本库的b7d4d95提交中。当我们根据AI提供的代码进行修改后,就可以在VS Code中轻松查看两个版本之间的差异。
2.1.2 用VS Code查看原先点亮LED灯的代码
VS Code是微软开发的一款主流代码编辑器。它不仅免费开源,还支持Windows、macOS和Linux等多种系统。作为开发工具,它提供了强大的编辑和调试功能。
VS Code的特点鲜明:它轻便快速,资源占用少;跨平台特性让开发者能在不同系统上保持相同的开发环境;丰富的插件市场几乎能满足所有功能需求。
VS Code内置了众多实用功能,包括智能代码补全、语法高亮、Git版本控制、调试器和终端。通过JSON配置文件和插件,开发者可以根据需求定制编辑器。
VS Code最大的优势在于:既保持轻量,又功能强大。开源特性和活跃社区为它提供持续发展动力。通过插件,它可以支持任何编程语言。虽然不及专业IDE那样全能,但基础的开发环境功能一应俱全。微软的持续更新也让它始终保持技术领先。
当然,VS Code也存在一些局限:许多高级功能需要额外安装插件,可能增加配置复杂度;过多插件会影响性能;新手需要时间适应;在大型项目上的功能可能不及JetBrains等专业IDE。
VS Code最适合哪些场景?它特别擅长小型到中型项目开发,如个人项目或开源项目。在Web开发方面,它对HTML、CSS、JavaScript等前端技术支持出色。多语言支持让它适合全栈开发。对需要跨平台工作的开发者来说,它是理想选择。值得一提的是,它在嵌入式开发领域表现优异,比如通过Rust的embedded插件就能进行嵌入式开发。免费开源和功能丰富的特点也使它成为教学的好工具。
VS Code凭借轻量级、强大的扩展性和完善的功能赢得了开发者的欢迎,尤其适合需要灵活开发环境的程序员。但对于需要特定语言深度支持或大型项目管理的场景,可能还需要配合专业IDE使用。
✅若要编辑和对比AI生成的LED闪烁代码与之前的LED点亮代码,请按表2-2所示要点安装VS Code:
表2-2 VS Code安装要点
| 在Ubuntu 24上安装VS Code | 在macOS上安装VS Code | 在Windows 11上安装VS Code |
|---|---|---|
| # 检查是否已安装VS Code:按窗口键→搜“code” # 先下载然后使用apt安装后缀为.deb的VS Code安装包 # 参考网页 code.visualstudio.com/download sudo apt install code_xxx_amd64.deb# 验证安装是否成功 code ./# 查看VS Code版本 code --version# 检查最新可安装版本 apt show code | grep Version# 升级 sudo apt updatesudo apt upgrade code | # 检查是否已安装VS Code:按spotlight快捷键→搜“code” # 先下载然后解压最后把解压后的VS Code的.app文件拖入Applications文件夹 # 参考网页 code.visualstudio.com/download # 验证安装是否成功 code ./# 查看VS Code版本 code --version# 升级:在Code界面左上角点击Code,然后选择Check for Updates… | # 检查是否已安装VS Code:按窗口键→搜“code” # 先下载然后鼠标双击后缀为.exe的安装包 # 参考网页 code.visualstudio.com/download # 验证安装是否成功 code ./# 查看VS Code版本 code --version# 升级:左上角三条横线图标→Help→Check for updates… |
安装完成VS Code后,我们可以在b1l目录中输入以下命令,用VS Code打开之前点亮LED灯的代码:
# 在Ubuntu的terminal里输入下面命令
# code ./: 打开当前目录(./)中的内容,使用 Visual Studio Code 编辑器
# > /dev/null: 将命令的标准输出(stdout)重定向到/dev/null,
# 相当于丢弃了输出,避免输出显示在终端
# 1>&2:将标准输出(1)重定向到标准错误输出(2)
# 由于之前已经将标准输出定向到 /dev/null,此时标准输出实际上也是被丢弃
# &: 将命令放到后台运行,这样终端不会被阻塞,可以继续输入其他命令
% code ./ > /dev/null 1>&2 &
# 在macOS的terminal里输入下面命令
% code ./
# 在Windows 11的cmd里输入下面命令
> code .\
之后在VS Code左侧项目文件树中选择src/main.rs文件进行查看,如图2-2所示:
图2-2 在VS Code左侧项目文件树中选择src/main.rs文件
2.1.3 查看AI给出的代码的变动
我们之前让AI根据点亮LED灯的代码给出了闪烁LED的代码。现在让我们把AI生成的代码复制过来,替换main.rs中的原有代码,如图2-3所示:
图2-3 复制AI生成的代码并替换main.rs中的原有代码
用git diff仅查看代码变动
✅相比图2-2中的代码,图2-3中有哪些变化呢?虽然VS Code已经在代码行号右侧用竖线标记出了变动部分,但运行下面的命令对比会更加直观:
# 显示当前工作区中未暂存(尚未执行`git add`)的更改内容
% git diff
diff --git a/src/main.rs b/src/main.rs
index c5d9f4c..5379e3f 100644
# 分别表示变更前(-)和变更后(+)的文件名
--- a/src/main.rs
+++ b/src/main.rs
# 表示变更的位置:从第7行开始,变更前有12行,变更后有20行
@@ -7,12 +7,20 @@ use embedded_hal::digital::OutputPin;
use microbit::board::Board;
use panic_halt as _;
# 以加号(+)开头的行表示新增的一行
+use cortex_m::asm::delay;
+
#[entry]
fn main() -> ! {
let mut board = Board::take().unwrap();
# 以减号(-)开头的行表示移除的一行
-
- board.display_pins.col4.set_low().unwrap();
- board.display_pins.row4.set_high().unwrap();
-
- loop {}
+
+ loop {
+ board.display_pins.col4.set_low().unwrap();
+ board.display_pins.row4.set_high().unwrap();
+
+ delay(1_000_000);
+
+ board.display_pins.row4.set_low().unwrap();
+
+ delay(1_000_000);
+ }
}
(END)
git diff适合查看代码变动行及其简短的上下文(变动处前后未变动的几行),但无法同时展示变动和完整的代码文件。比如,上述git diff命令就没有显示main.rs的完整内容。那么,如何既能看到变动又能查看完整代码呢?
用VS Code查看完整代码中的变动
✅这里有个两全其美的方法:在VS Code中点击图2-3左侧带有数字2标记的分支图标(表示有2个文件发生变动),打开代码变更树,然后点击main.rs文件。这样右侧窗口就会清晰展示AI给出的代码与上次提交版本之间的差异,以及完整的源文件内容,如图2-4所示:
图2-4 在VS Code中查看AI给出的代码与上次提交的代码之间的差异
✅现在,请参照图2-4右侧显示的AI生成的代码来修改你的main.rs源代码。完成修改后,我们将一起详细解读这段代码。
用rust-analyzer插件自动显示变量类型
🔎当你在输入代码时,是否好奇let mut board = Board::take().unwrap();这行代码中,变量board经过自动推断后的具体类型是什么?虽然图2-3中没有直接显示,但有一个神器可以帮你看到——VS Code的rust-analyzer插件,如图2-5所示:
图2-5 安装了rust-analyzer插件后能在代码中看到变量board的类型,将鼠标放到上面还能显示文档
作为VS Code的扩展插件,rust-analyzer是Rust官方推荐的代码编辑辅助工具,为开发者提供智能的代码分析和辅助功能。
它具备多项实用特性:实时代码补全建议、语法高亮显示、快捷跳转到定义、实时错误提示与改进建议、代码重构功能(如重命名和提取函数)、宏展开显示,以及内置文档查看。最重要的是,它运行高效且资源占用少。
作为Rust官方推荐工具,rust-analyzer与Rust生态系统完美配合。它提供近似专业IDE的开发体验,且因采用Rust编写而保持高效运行。对初学者来说,只要安装了Rust工具链,配置过程简单直观。此外,它拥有活跃的开发者社区,能快速响应用户问题。
当然,它也存在一些局限。与全功能IDE相比,其项目导航和调试功能仍需加强。处理复杂宏时可能不够完善,大型项目中可能出现响应延迟。另外,它需要正确配置Rust工具链才能发挥全部功能。
尽管如此,rust-analyzer仍是大多数开发者的理想选择。它能满足个人开发和团队协作的需求,对Rust新手尤其友好,其代码补全和诊断功能显著提升学习效率。在中小型项目开发中,它帮助开发者快速编写和调试代码。搭配VS Code使用时,它提供轻量而强大的开发环境。
无论是VS Code下的Rust开发,还是Rust入门学习,rust-analyzer都是不可多得的开发工具。它不仅提升开发效率,更有助于提高代码质量。
✅要安装rust-analyzer插件,只需点击VS Code界面左侧工具栏中带有四个小方块的Extensions图标,打开Extensions Marketplace界面,然后在搜索栏中输入rust-analyzer并安装即可。
用VS Code的Codeium插件获得AI自动代码补全建议
🔎随着AI助手与程序员结对编程变得越来越普及,你是否也希望在编写代码时获得实时的智能提示?只需输入一行命令开头的几个字符,就能收到AI的代码补全建议。如果你对这个功能感兴趣,可以安装VS Code的免费插件Codeium,如图2-6所示:
图2-6 安装了VS Code的Codeium插件后,只要输入一行代码开头几个字符boar,就能收到AI的代码补全建议
Codeium是一款强大的AI编程助手插件,为开发者提供革命性的编程体验。它支持包括Rust、Python、JavaScript在内的多种编程语言,通过智能代码补全和自然语言提示功能显著提升开发效率。
在实际应用中,Codeium的特色功能令人印象深刻。它的AI代码补全系统能够理解上下文并根据开发者意图生成完整的函数和逻辑。其多语言支持简化了跨语言开发,而自然语言转代码的功能让编程变得更加直观。它还能生成常用代码片段,并通过学习适应用户的编程风格。
Codeium为开发者带来显著优势。它提升了编程效率,尤其适合快速原型开发。对初学者而言,它就像一位耐心的导师,通过智能提示帮助掌握语法和最佳实践。它的多语言支持在跨语言项目中尤为重要。更关键的是,它降低了编程门槛——开发者只需用自然语言描述即可生成基础代码。作为免费工具,其核心功能对所有个人开发者开放。
但Codeium也有其局限性。它在处理复杂的Rust代码时可能难以准确理解上下文。作为AI驱动的工具,它需要较多计算资源且依赖网络连接。生成的代码可能需要优化,同时在代码处理过程中也需注意隐私安全问题。
即便如此,Codeium在多个场景中表现优异。它不仅适合快速原型开发,还能帮助初学者理解编程概念。在跨语言项目中,其多语言支持价值突出。通过简化开发流程和减少重复性工作,它有效提升了开发效率。
Codeium是一款价值突出的AI编程助手,特别适合Rust开发者、跨语言开发者和编程新手。虽然在复杂项目或高隐私要求场景下需谨慎使用,但它在日常开发和学习中的表现令人称道。
✅要安装Codeium插件,只需点击VS Code界面左侧工具栏中Extensions图标,打开Extensions Marketplace界面,然后在搜索栏中输入codeium并安装即可。
如何编译、运行、提交和解读这段AI生成的代码?它有哪些不足之处?该如何改进?在进行Rust嵌入式开发时,有哪些能让终端命令输入更轻松的神器?想了解这些内容,敬请期待"🦀掌握Rust编程神器,让LED灯闪烁(下)"。
如果喜欢这篇文章,别忘了给文章点个“赞” ,好鼓励小吾继续写哦~😃