一起长锈:1 超好用的Rust工具链(Java与C++程序员转Rust之旅)

2024-06-10 19:57:06 浏览数 (3)

讲动人的故事,写懂人的代码

  • 故事梗概:
  • 在她所维护的老旧Java系统即将被淘汰的危机边缘,这位在编程中总想快速完事的女程序员,希望能转岗到公司内部使用Rust语言的新项目组,因此开始自学Rust;
  • 然而,在掌握了Rust编程知识之后,为了通过Rust项目组的技术面试,使得转岗成功而不至被裁员,她必须领会编程如何"快速"才能有真正的意义。

女程序员赵可菲加班到深夜,正在修复老旧Java系统的nul pointer exception缺陷。

等到家后,老公、保姆和不满一岁的宝贝儿子都已经睡了。

她只能轻轻亲了下宝宝肉嘟嘟的小脸蛋儿。

赵可菲在父母的严格教育下成长,因此总是缺乏自信。

她从小就被父母催促着抓紧时间做作业,理由是“后面还有很多事情要做”。

所以,作为程序员,她养成了迅速完成任务的习惯,无论是在编写代码还是在生活和娱乐中。

她现在在公司负责一个有十多年历史的老旧Java系统。这个系统即将被淘汰,代码质量也很差。

每次上线都会出现很多bug,她不得不加班修复。

她的唯一愿望就是尽快解决这些问题,好回家陪伴她的宝宝。

有一次,赵可菲修的bug没过测试,测试人员就让她再修一下。

赵可菲看了半天,发现自己漏掉了一个异常的处理。

她说:“这个很快就能搞定。”

测试人员就问她:“赵可菲,你每次都能修得都挺快,但怎样才能一次就修好,别老返工呢?”

赵可菲轻描淡写地回答说:“那样就慢了。后面还有好多事等着我呢。”

赵可菲维护的那个Java老旧系统快要淘汰了

她的老板给她扔了个三个月的内部转岗的“救生圈”,说是如果转不出去,那就只能被裁了

赵可菲陷入了焦虑和不安。

她喜欢当前的公司文化和同事,希望能留下来继续做程序员。

但她的Java编程技能已经陈旧,内部转岗程序员不再占优势。

她得知公司可能会用Rust重写很多系统。另外,公司也提供Rust培训。

然而,她听说这门近两年大火的编程语言,入门难度有点大

她已经离30岁没差几年了,对自己能否再学习新的编程语言有点疑虑。

她对未来感到迷茫,不知道下一步该如何选择。

赵可菲听到了一个小道消息,她之前维护的那个Java老旧系统,可能会考虑用rust重写。

既然公司正在给大家上Rust培训,她想了想,编程其实还挺好玩的,于是就毫不犹豫地报名参加了培训。

在公司内部的Rust培训课上,赵可菲碰到了讲师贾克强。他是来自高性能网络服务项目组的Rust程序员。

她还碰到了她在课堂上结对编程的搭档席双嘉。他是一位C 程序员。

她还用上了AI编程助手艾极思(AiGeeCee)。这是公司最近在内部部署的大模型。程序员在编程时,可以与艾极思聊天,获得帮助。

赵可菲和席双嘉两个在学Rust的过程中,有啥不懂的就找贾克强帮忙解答,还会经常向艾极思提问。

贾克强和艾极思都是随叫随到,无微不至的帮助他们。

1.1 学习Rust的方法

贾克强提了个建议,对于那些在课堂上一起编程的伙伴们,回家后也可以一起看看Rust官网推荐的那本书:《The Rust Programming Language》。

这本书是Steve Klabnik和Carol Nichols一起写的。官网上有2023年中文版的第二版,还可以免费下载pdf版哦。

赵可菲和席双嘉已经开始看这本书了。

贾克强还说:“学Rust的最有效的办法只有三步。“

”第一步,看Rust的书。“

“第二步,把书上的例子改改,然后自己写一遍代码试试看。“

”第三步,把Rust的语言特点和你擅长的编程语言做个比较,帮助记忆。“

”如果遇到问题,先问问艾极思,如果还是不明白,我们再一起在课堂上讨论。”

1.2 如何安装最新版Rust

在课堂上,赵可菲和席双嘉俩人都在自己的电脑上访问了Rust语言的官网安装页面,按照上面的提示,他们用rustup顺利地安装了Rust。

贾克强来了一句:“rustup这个命令行工具是用来管理Rust版本和相关工具的,可以帮你在电脑上安装多个版本的Rust,切换起来也很方便。”

赵可菲接着说:“这跟Java世界的SDKMAN!好像啊。”

席双嘉叹了口气:“可惜C 世界就没有这样的工具。”

1.2.1 如何验证安装是否成功

安装妥妥的后,他俩就跑了显示rustc编译器版本的命令,来看看安装是不是成功了。

(小贴士:这个系列编程故事,所有命令都在macOS、Windows11、WSL2、Ubuntu这4个操作系统上试过,没问题的。如果同一命令在不同操作系统中有点儿不一样,我们会特别说明的哦。)

代码语言:javascript复制
rustc --version

屏幕上跳出来rustc 1.77.2 (25ef9e3d8 2024-04-09)

他们两个又一次运行那个用来查看rustup工具版本的命令。

代码语言:javascript复制
rustup -V

屏幕上弹出了rustup 1.27.0 (bbb9276d2 2024-03-08)

下面还多了两行字,贴心地提醒他们,这个命令其实并不是用来查看rustc编译器版本的哦。

1.3 超好用的Rust工具链

贾克强:“所谓的‘工具链’,就是我们Rust的一套安装和版本管理工具,也就是rustup。“

“这些工具就是我们编写Rust程序的好帮手。工具链里面包括了各种各样的组件,比如Rust编译器(rustc),包管理器(cargo),还有标准库,还有其他你可能需要的编译和管理Rust代码的工具和实用程序。”

“每个工具链通常都和特定的发布渠道和目标平台有关。我们Rust有三个主要的发布渠道。“

“第一个发布渠道,就是我们的Stable(稳定版)。这是我们最重要的发布渠道,每6周就会更新一次。带来的是在Nightly和Beta版中测试过的新功能和改进,给你最稳定和完善的体验。”

“第二个发布渠道,就是Beta版。这个渠道的更新是为了下一个Stable版服务的。在新特性稳定化之前,这里就是最后的测试场所。”

“第三个发布渠道,就是Nightly(每日构建版)。这个渠道里面包含了对Rust语言和工具的最新更改。新功能一般都会先在这里出现,但是可能在未来的版本中有所改变或者不稳定。”

“你的电脑可以同时安装多个版本的Rust工具链。你可以用rustup轻松地在这些版本之间切换。”

“这种灵活性让我们的开发者可以不需要更改整个开发设置,就能针对不同的Rust版本或者不同的平台(比如x86_64,ARM等)测试他们的代码。”

“每个工具链都可以根据你的需要添加额外的组件,比如交叉编译目标,Rust本身的源代码,还有其他各种实用的工具。”

1.3.1 Java工具链

赵可菲:“Java也有类似于工具链的东西。”

“比如Java开发工具包 (JDK),这就是Java程序员的主要工具,和Rust的工具链差不多。“

”它包括Java运行环境(JRE),一个编译器(javac),还有其他Java开发需要的各种工具和库。”

“还有像Apache Maven,Gradle和Ant这样的构建工具,这些和Rust的Cargo差不多。它们管理项目的依赖,自动化构建过程,还可以处理部署。”

“像SDKMAN!这样的版本管理工具也很有用,可以帮我们管理多个版本的JDK和其他与JVM相关的开发工具,让我们可以随时在不同版本之间切换。”

1.3.2 C 工具链

席双嘉:“对于编译器,C 就没有像Java或Rust那样的官方工具包,不过没关系。”

“它利用了像GCC(GNU编译器集合),Clang和MSVC(Microsoft Visual C )这样的编译器,这些编译器包括标准库,有时候还会带点额外的工具。”

“在构建工具方面,像CMake,Make和Ninja这样的工具,它们就在这里帮你管理C 项目中的构建过程。这些工具可以处理那些构建配置复杂的大项目,还可以和各种编译器搭配使用。”

“说到包管理器,C 就没有像Rust的Cargo那样统一的包管理器。但也没关系,像Conan,vcpkg和Bazel这样的新工具,它们正在依赖关系管理和构建自动化这些领域慢慢变得流行起来。”

1.3.3 如何同时安装多个版本的Rust工具链

赵可菲:“多个版本的Rust工具链能一起装吗?那本Rust书上可没这个。我知道在Java世界里,SDKMAN!能做这个。”

贾克强:“想要装多个版本的Rust工具链,只要5步就行。”

1.3.3.1 如何列出已安装的工具链

贾克强:“第1步,我们得看看已经安装了哪些工具链。”

“如果你想一眼就看出已安装的 Rust 工具链有哪些版本,直接运行rustup toolchain list就行了。”

“然后你的屏幕上就会显示这些东西(以macOS为例):”

代码语言:javascript复制
 jkq@mbp  ~  rustup toolchain list
stable-aarch64-apple-darwin (default)

“这就表示,我电脑里就只装了稳定版的工具链哦。”

“如果你想了解更多关于你的Rust开发环境的小秘密,像Rust工具链的版本列表,rustup的home目录在哪,或者rustc的版本号,只需运行一个简单的命令rustup show。”

“屏幕上会显示出更详尽的信息(以macOS为例):”

代码语言:javascript复制
 jkq@mbp  ~  rustup show
Default host: aarch64-apple-darwin
rustup home:  /Users/jkq/.rustup

stable-aarch64-apple-darwin (default)
rustc 1.77.2 (25ef9e3d8 2024-04-09)

1.3.3.2 如何列出所有可供安装的Rust版本

贾克强:“第2步,我们来看看有哪些Rust版本可以安装。”

“唉,有点小遗憾,rustup工具并没有提供这个功能。不过别担心,上网搜一下‘rust versions’就能找到答案(参考图1.1)。”

图1.1 Rust版本列表图1.1 Rust版本列表

赵可菲:“哈哈,Java工具链终于在某方面超越Rust工具链了。在Java的世界,我们只须用SDKMAN!运行一下sdk list java,就能列出所有能装的JDK版本,而且还会标出哪些是已经安装的版本哦。”

贾克强向赵可菲竖起了大拇指,表示赞同。

1.3.3.3 如何安装特定版本的Rust

贾克强:“那么,第3步,我们就来安装一下Rust的特定版本。”

“举个例子,如果我们想要安装Rust版本列表里的1.66.0这个版本,那就直接运行命令rustup toolchain install 1.66.0就行了。”

“装完以后,可以用rustup toolchain list这个命令来检查一下是否安装好了。”

“屏幕上现在显示的是1.66.0这个版本哦。”

代码语言:javascript复制
 jkq@mbp  ~  rustup toolchain list
stable-aarch64-apple-darwin (default)
1.66.0-aarch64-apple-darwin

1.3.3.4 如何切换不同版本的Rust

赵可菲:“那个stable后面跟的(default)是啥意思呢?”

贾克强:“我来解释一下。在第4步,我们要切换rust的不同版本。“

"跟在某个Rust版本后面的‘default’的意思就是,我们现在正在用的,就是这个版本哦。”

“想换到1.66.0这个版本,运行命令rustup default 1.66.0就可以啦。”

“看,屏幕上显示default版本已经是1.66.0啦。”

代码语言:javascript复制
 jkq@mbp  ~  rustup default 1.66.0
info: using existing install for '1.66.0-aarch64-apple-darwin'
info: default toolchain set to '1.66.0-aarch64-apple-darwin'

  1.66.0-aarch64-apple-darwin unchanged - rustc 1.66.0 (69f9c33d7 2022-12-12)

"再给rustup toolchain list跑一下,你就能看到default跑到1.66.0后面去了。"

代码语言:javascript复制
 jkq@mbp  ~  rustup toolchain list
stable-aarch64-apple-darwin
1.66.0-aarch64-apple-darwin (default)

1.3.3.5 如何删除不需要的Rust版本

席双嘉:“如果我不想要1.66.0这个版本,怎么删掉它呢?”

贾克强:“哈哈!这就是我们的第5步,把不需要的Rust版本删掉。”

“你想删1.66.0版对吧。删之前,先看看1.66.0版是不是你现在在用的版本。”

“现在确实是。所以我们得先把Rust的当前版本切换到stable版本,再删1.66.0版。”

“否则,你要是不切换,直接把1.66.0版删了,rustup还是会记得你现在的版本是1.66.0。所以你再用Rust的时候,它还会从网上下载1.66.0版呢。”

“我现在就把当前版本切换到stable版。”

代码语言:javascript复制
 jkq@mbp  ~  rustup default stable
info: using existing install for 'stable-aarch64-apple-darwin'
info: default toolchain set to 'stable-aarch64-apple-darwin'

  stable-aarch64-apple-darwin unchanged - rustc 1.77.2 (25ef9e3d8 2024-04-09)

"再看一下,切换成功了没?"

代码语言:javascript复制
 jkq@mbp  ~  rustup toolchain list
stable-aarch64-apple-darwin (default)
1.66.0-aarch64-apple-darwin

“最后咱们再把1.66.0删了吧。”

代码语言:javascript复制
 jkq@mbp  ~  rustup uninstall 1.66.0
info: uninstalling toolchain '1.66.0-aarch64-apple-darwin'
info: toolchain '1.66.0-aarch64-apple-darwin' uninstalled

“检查一下,删得怎么样了?”

代码语言:javascript复制
 jkq@mbp  ~  rustup toolchain list
stable-aarch64-apple-darwin (default)

赵可菲:“嘿,删除成功了哦。1.66.0不见了。”

1.3.4 如何升级Rust工具链和rustup

贾克强:“Rust的版本更新嘛,简直就像快餐店的新菜一样,哗啦哗啦的。“

"Stable版本,就是大家都在用的那个,像咱们公司食堂菜谱一样,每6周就有新的一次。“

"所以啊,你要是想跟上Rust的步伐,那就得经常更新你的Rust工具链和rustup程序本身啦。"

"想要做到这一点,你得经常运行rustup update这个命令哦。“

代码语言:javascript复制
 jkq@mbp  ~  rustup update
info: syncing channel updates for 'stable-aarch64-apple-darwin'
info: checking for self-update

  stable-aarch64-apple-darwin unchanged - rustc 1.77.2 (25ef9e3d8 2024-04-09)

info: cleaning up downloads & tmp directories

“这个命令嘛,先把所有已经安装的Rust版本给更新了,然后最后才轮到rustup工具本身更新。”

1.4 小结

  • 女程序员赵可菲负责维护一个老旧的Java系统,工作压力大,家庭生活也很忙,真是有点手忙脚乱呀。
  • Java系统老掉牙了,快要被淘汰,赵可菲现在面临着要不要转行的问题。
  • Rust编程语言可能是赵可菲的新选择,公司还提供了Rust的培训,但是Rust的入门难度有点大。
  • Rust培训课上,赵可菲遇到了讲师贾克强和搭档C 程序员席双嘉,还有个AI编程助手艾极思,真是人才济济啊。
  • 他们一起学习Rust,看看Rust的书,改改书上的例子,再比较一下其他编程语言,帮他们学习Rust。
  • Rust有一整套的工具链,包括rustup工具,这玩意儿可以帮助程序员管理Rust的版本和相关工具,真是太方便了。
  • 他们可以用rustup安装和管理多个版本的Rust工具链,想用哪个版本就用哪个,切换起来就跟玩儿一样。
  • Java和C 也有类似的工具链,不过在某些方面,比如发布渠道,Rust的工具链更胜一筹。
  • Rust、Java和C 在工具链方面的异同,这个问题值得我们深思呀。

工具链特性

Rust

Java

C

编译器

Rust编译器(rustc)

Java开发工具包(JDK)包括Java运行环境(JRE)和编译器(javac)

无官方工具包,使用GCC(GNU编译器集合),Clang,MSVC(Microsoft Visual C )等编译器

包管理器

包管理器(cargo)

无统一的原生包管理器,使用Apache Maven,Gradle,Ant等第三方构建工具

无统一的原生包管理器,使用Conan,vcpkg,Bazel等新第三方工具

版本管理工具

rustup,可以安装和切换多个版本的Rust

SDKMAN!,可以管理多个版本的JDK和其他与JVM相关的开发工具

无类似工具

发布渠道

有三个主要的发布渠道:Stable(稳定版),Beta版,Nightly(每日构建版)

无明确的发布渠道信息

无明确的发布渠道信息

其他

可以添加额外的组件,比如交叉编译目标,Rust本身的源代码,还有其他实用的工具

JDK包含其他Java开发需要的各种工具和库

编译器有时会带一些额外的工具

如果你想要了解Rust是如何通过超越传统赋值语句的binding,实现不变性、模式匹配和所有权设计理念的,那就关注我,继续看下去吧!

【未完待续】


如果喜欢我的文章,期待你的点赞、在看和转发。

如果不喜欢,在评论区留个言告诉我哪里不喜欢呗~

0 人点赞