前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >一步步靠近:Rust入门小百科

一步步靠近:Rust入门小百科

作者头像
用户1682855
发布2019-03-06 17:57:47
1.3K0
发布2019-03-06 17:57:47
举报
文章被收录于专栏:前沿技墅

从2015年Rust 发布1.0 版本以来,Rust 语言已经被广泛应用于各大公司及诸多领域。每一年,Rust 社区都会聚集在一起制订路线图,规划Rust 未来的发展。在2018 年,Rust 团队推出了新的大版本(edition)计划:

  • Rust 2015 版本,包含Rust 1.0~1.30 语义化版本。目标是让Rust 更加稳定。
  • Rust 2018 版本,Rust 1.31 将是Rust 2018 版本的首个语义版本。目标是让Rust 进一步走向生产级。

这个大版本和语义化版本是正交的。大版本的意义在于方便Rust 自身的进化。例如,想在Rust 中引入新的关键字try,但是如果只有语义化版本这一个维度,新的关键字可能会破坏现有的Rust 生态系统。所以,就需要引入一个大版本,在Rust 2018 版本中引入try 关键字。开发者选择“edition=2018”,就代表了开发者接受Rust 的这种内部变化,接受新的关键字try。大版本升级的只是表面的语法功能,Rust 的核心概念是不会改变的。

Rust 的编译器可以方便地管理版本的兼容性:

  • Rust 2015 和Rust 2018 是彼此兼容的。
  • Rust 编译器知道如何编译这两个版本,就像javac 知道如何编译Java 9 和Java 10、gcc和clang 知道如何处理C++ 14 和C++17 一样。
  • 可以在Rust 2018 版本中依赖Rust 2015 的库,反之亦然。
  • Rust 2015 版本并未冻结。

此外,大版本可能是每三年发布一次,那么下一次发布就是在2021 年。不过Rust 团队对此还保留修改权。

语言架构

为了便于学习,笔者针对Rust 语言概念的层次结构进行了梳理,如下图所示。

上图将Rust 语言中的概念分成了4 个层次。

最底层是安全内存管理层,该层主要是涉及内存管理相关的概念。

倒数第二层是类型系统层,该层起到承上启下的作用。类型系统层承载了上层的所有权系统语义和混合编程范式,赋予了Rust语言高级的抽象表达能力和安全性。同时,还保留了对底层代码执行、数据表示和内存分配等操作的控制能力。

对于开发者而言,只需要掌握类型系统、所有权系统和混合式编程范式即可,不需要操心底层的内存是否安全,因为有编译器和类型系统帮忙处理。在这个语言架构之下,人和编译器共用同一套“心智模型”,这样可以极大地保证系统的安全和健壮性。

在后续的章节中,会依照该语言架构对Rust 语言自底向上进行分层探索,以帮助读者对Rust 语言的概念融会贯通。

开源社区

Rust 语言自身作为一个开源项目,也是现代开源软件中的一颗璀璨的明珠。

在Rust 之前诞生的所有语言,都仅仅用于商用开发,但是Rust 语言改变了这一状况。对于Rust 语言来说,Rust 开源社区也是语言的一部分。同时,Rust 语言也是属于社区的。

Rust 团队由Mozilla 和非Mozilla 成员组成,截止2018年7月,Rust 项目贡献者已经超过了1900 人。Rust 团队分为核心组和其他领域工作组,针对Rust 2018 的目标,Rust 团队被分为了嵌入式工作组、CLI 工作组、网络工作组以及WebAssembly 工作组,另外还有生态系统工作组和社区工作组等。

这些领域中的设计都会先经过一个RFC 流程,对于一些不需要经过RFC流程的更改,只需要给Rust 项目库提交PullRequest 即可。所有的过程都是对社区透明的,并且贡献者都可参与评审,当然,最终决策权归核心组及相关领域工作组所有。

Rust 团队维护三个发行分支:稳定版(Stable)、测试版(Beta)和开发版(Nightly)。其中稳定版和测试版每6 周发布一次。标记为不稳定(Unstable)和特性开关(Feature Gate)的语言特性或标准库特性只能在开发版中使用。

发展前景

根据社区的流行度调查报告,截至2018 年7 月,由Pull Request 统计的GitHub Octoverse报告显示,Rust 语言的总PR 数排名第15 位,呈上升趋势。从活跃的项目数来看,Rust 语言一共有2604 个活跃项目。

目前在商业领域,Rust 的重磅商业用户增长迅速,其中包括:

  • Amazon,使用Rust 作为构建工具。
  • Atlassian,在后端使用Rust。
  • Dropbox,在前后端均使用了Rust。
  • Facebook,使用Rust 重写了源码管理工具。
  • Google,在Fuchsia 项目中部分使用了Rust。
  • Microsoft,在Azure IoT 网络上部分使用了Rust。
  • npm,在其核心服务上使用了Rust。
  • RedHat,使用Rust 创建了新的存储系统。
  • Reddit,使用Rust 处理评论。
  • Twitter,在构建团队中使用Rust。

除了以上罗列的公司,还有很多其他公司,可以在官方Rust 之友页面上找到,包括百度、三星、Mozilla 等。Rust 覆盖了数据库、游戏、云计算、安全、科学、医疗保健和区块链等领域,相关的工作岗位越来越多。Rust 的前景越来越明朗,未来Rust 将大有可为。

Rust 代码如何执行

在进一步学习之前,我们有必要了解一下Rust 代码是如何执行的。Rust是跨平台语言,一次编译,到处运行,这得益于LLVM。Rust 编译器是一个LLVM 编译前端,它将代码编译为LLVM IR,然后经过LLVM 编译为相应的平台目标。

Rust 源码经过分词和解析,生成AST(抽象语法树)。然后把AST 进一步简化处理为HIR(High-levelIR),目的是让编译器更方便地做类型检查。HIR 会进一步被编译为MIR(Middle IR),这是一种中间表示,它在Rust1.12 版本中被引入,主要用于以下目的。

  • 缩短编译时间。MIR 可以帮助实现增量编译,当你修改完代码重新编译的时候,编译器只计算更改过的部分,从而缩短了编译时间。
  • 缩短执行时间。MIR 可以在LLVM 编译之前实现更细粒度的优化,因为单纯依赖LLVM的优化粒度太粗,而且Rust无法控制,引入MIR 就增加了更多的优化空间。
  • 更精确的类型检查。MIR 将帮助实现更灵活的借用检查,从而可以提升Rust的使用体验。

最终,MIR 会被翻译为LLVM IR,然后被LLVM 的处理编译为能在各个平台上运行的目标机器码。

小结

Rust 的产生看似偶然,其实是必然。未来的互联网注重安全和高性能是必然的趋势。GH看到了这一点,Mozilla 也看到了这一点,所以两者才能一拍即合,创造出Rust。

Rust 从2006 年诞生之日开始,目标就很明确——追求安全、并发和高性能的现代系统级编程语言。为了达成这一目标,Rust 语言遵循着内存安全、零成本抽象和实用性三大设计哲学。借助现代化的类型系统,赋予了Rust 语言高级的抽象表达能力,与此同时又保留了对底层的控制能力。开发者和Rust 编译器共享着同一套“心智模型”,相互信任,相互协作,最大化地保证系统的安全和健壮性。

Rust 语言有别于传统语言的另一点在于,其将开源社区视为语言的一部分。Rust 本身就是开源项目中的典范,非常值得学习。希望读者可以建立对Rust 语言的系统性认知,在以后的学习中起到提纲挈领的作用,不至于迷失在细节中。

本文节选自热门新书《Rust编程之道》。Rust 官方核心团队成员及文档团队负责人Steve Klabnik这样评价这本书:“即便我不得不通过谷歌翻译阅读这本书,但也不难发现《Rust 编程之道》是一本非常有趣的书。它解释了Rust 为何与众不同——这本书可以让你思考Rust,以及Rust 语言所蕴含的世界观。我好希望能读懂中文原版书,因为我相信它会更精彩!我已经从事Rust 的相关工作六年了,这本书改变了我对Rust语言的某些看法。这非常强大!”
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-01-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 前沿技墅 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 语言架构
  • 开源社区
  • 发展前景
  • Rust 代码如何执行
  • 小结
    • 本文节选自热门新书《Rust编程之道》。Rust 官方核心团队成员及文档团队负责人Steve Klabnik这样评价这本书:“即便我不得不通过谷歌翻译阅读这本书,但也不难发现《Rust 编程之道》是一本非常有趣的书。它解释了Rust 为何与众不同——这本书可以让你思考Rust,以及Rust 语言所蕴含的世界观。我好希望能读懂中文原版书,因为我相信它会更精彩!我已经从事Rust 的相关工作六年了,这本书改变了我对Rust语言的某些看法。这非常强大!”
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档