从 Rust 开始

Rust 是由 Mozilla Research 开发并得到庞大开源社区支持的编程语言。它的开发始于 2006 年,由语言设计师 Graydon Hoare 启动。Mozilla 从 2009 年开始赞助 Rust,并在 2010 年首次正式推出。此后的工作经历了多次迭代,最终在 2015 年初推出了第一个稳定的生产版本 1.0.0,该版本由 Rust 项目开发者团队开发,包括 Mozilla 的 Rust 团队和超过 1800 名贡献者的开源社区。自那以后,Rust 以稳定的速度发展,目前的稳定版本为 1.20.0。

Rust 基于清晰和坚固的原则。它是一种系统编程语言,与 C 和 C++ 在能力上不相上下。它在速度上可以与惯用的 C++ 相媲美,但它通过禁止可能导致内存问题而引起程序崩溃的代码,让你以更安全的方式工作。此外,它使得在多核机器上的并发编程和并行执行在没有垃圾回收的情况下也是内存安全的——它是唯一能做到这一点的语言。从设计上看,Rust 消除了通过并发访问导致的共享数据的腐败,称为数据竞争

Rust 的优势

Mozilla 是一家以开发工具推动开放标准网络而闻名的公司,最著名的是其旗舰浏览器 Firefox。如今,包括 Firefox 在内的每个浏览器都是用 C++ 编写的,Firefox 的代码行数为 1,29,00,992 行,Chrome 的代码行数为 44,90,488 行。这使它们运行迅速,但本质上是不安全的,因为 C 和 C++ 允许的内存操作没有经过有效性检查。如果代码编写不够严格,开发者的最高编程纪律缺失,程序崩溃、内存泄漏、段错误、缓冲区溢出和空指针都可能在程序执行时发生。其中一些可能导致严重的安全漏洞,这在现有浏览器中太常见了。Rust 从一开始就设计为避免这类问题。

与 C 或 C++ 相比,在编程语言光谱的另一端,我们有 Haskell,它被广泛认为是一种非常安全可靠的语言,但在内存分配和其他硬件资源的控制方面几乎没有或根本没有控制。我们可以将不同的语言按照这种控制即安全的轴线排列,似乎当一种语言像 Java 比 C++ 更安全时,它就会失去底层控制。反之亦然;像 C++ 这样提供更多资源控制的语言在安全性上提供的要少得多。

img

Rust 的制胜之道是提供:

  • 通过其强大的类型系统和智能编译器实现高安全性
  • 对低级资源的深入但安全控制(与 C 或 C++ 同样多),因此它运行接近硬件

其主网站 http://www.rust-lang.org/en-US/ 包含安装说明、文档和 Rust 社区的链接。

Rust 让你精确地指定值在内存中的布局和内存的管理方式;这就是它在控制和安全线的两端都能做得好的原因。这是 Rust 的独特卖点,它打破了在 Rust 之前存在于编程语言之间的安全性-控制二分法。有了 Rust,它们可以一起实现,而不会丧失性能。

Rust 无需垃圾回收就能实现这两个目标,这与大多数现代语言如 Java、C#、Python、Ruby、Go 等不同。事实上,Rust 甚至还没有垃圾收集器(尽管正在设计一个可选的垃圾收集器)。

Rust 是一种编译语言:严格的安全规则由编译器强制执行,因此它们不会造成运行时开销。因此,Rust 可以使用非常小的运行时,因此它可以用于实时或嵌入式项目,并且可以轻松地与其他语言或项目集成。

Rust 适合对性能和底层优化很重要的开发人员和项目,但也需要一个安全稳定的执行环境。该语言的健壮性特别适合需要这一点的项目,从而减轻了维护周期的压力。此外,Rust 还将许多高级函数式编程技术添加到语言中,使它同时感觉像是低级和高级语言。

Rust三合一特性 - 安全、快速和支持并发

Rust并不是一种革命性的语言,它没有引入前沿的新特性,但它融合了许多老旧语言中的经过验证的技术,并在C++的安全编程设计上进行了大幅改进。

Rust的开发者旨在设计一种通用多范式语言;与C++相似,它是一种命令式、结构化和面向对象的语言。除此之外,它在一方面借鉴了很多函数式语言的特点,另一方面又融入了并发编程的先进技术。

变量的类型是静态的(因为Rust是编译型语言)且强类型的。然而,与Java或C++不同,开发者不必为所有事物指定类型;Rust编译器在许多情况下能够推断出类型。

C和C++应用程序以其常常导致程序崩溃或内存泄漏的问题而闻名,这些问题极难调试和解决。想想悬空指针、缓冲区溢出、空指针、段错误、数据竞争等等。Rust编译器(称为rustc)非常智能,能够在编译代码时检测到所有这些问题,从而在执行期间保证内存安全。这是由编译器完成的,它完全控制内存布局,但不需要垃圾收集的运行时负担。当然,安全性也意味着对安全漏洞的可能性大大减少。

Rust和Go、Julia一样编译为本地代码,但与后两者不同,Rust不需要带有垃圾收集的运行时。在这方面,它也不同于在JVM上运行的Java以及Scala和Clojure等语言。大多数其他流行的现代语言,如带有C#和F#的.NET、JavaScript、Python、Ruby、Dart等,都需要虚拟机和垃圾收集来执行。

Rust为并发和并行提供了几种机制。标准库提供了一个模型,通过该模型,线程可以映射到操作系统线程,以并行执行工作。它们不共享堆内存,而是通过通道进行数据通信,并且通过类型系统消除了数据竞争。如果项目需要,有几个箱子(crates)提供了一种以轻量级线程为基础的actor模型方法。这些机制使程序员能够轻松地利用当前和未来计算平台上众多CPU核心的能力。

rustc编译器完全自托管,这意味着它是用Rust编写的,并且可以使用之前的版本来编译自己。它使用LLVM编译器框架作为其后端(更多信息见http://en.wikipedia.org/wiki/LLVM),并生成运行速度极快的本地可执行代码,因为它编译为与C++相同的底层代码(参见一些基准测试 http://benchmarksgame.alioth.debian.org/u64q/rust.php)。

Rust旨在像C++一样具有可移植性,能够在广泛使用的硬件和软件平台上运行。目前,它可以在Linux、macOS X、Windows、FreeBSD、Android和iOS上运行。想要更全面了解Rust可以运行的平台,请参见https://forge.rust-lang.org/platform-support.html。

Rust可以像在C中调用C代码一样简单高效地调用C代码,并且反之亦然,C代码也可以调用Rust代码,并发 - 面向多核执行的编码)。

Rust开发者被称为rustaceans

稍后章节将更详细地讨论的其他Rust特性如下:

  • 变量默认不可变(使用变量和类型
  • 枚举(结构化数据和匹配模式
  • 模式匹配(结构化数据和匹配模式
  • 泛型(高阶函数和错误处理
  • 高阶函数和闭包(高阶函数和错误处理
  • 一种称为特性的接口系统(使用特性和面向对象编程
  • 卫生宏系统(组织代码和宏
  • 零成本抽象,意味着Rust拥有高级语言结构,但这些不会影响性能

与其他语言的比较

像Ruby或Python这样的动态语言可以让你在编码开发的初期速度很快,但代价会在稍后出现:

  • 需要编写更多的测试
  • 运行时崩溃
  • 生产中断

Rust编译器迫使你从一开始就在编译时解决很多问题,这是发现和修复bug的最低成本的地方。

Rust的面向对象不像Java、C#或Python等常见的面向对象语言那样明确或发达,因为它没有类。与Go相比,Rust让你对内存和资源有了更多的控制,因此它让你在更低层次上编码。Go也使用垃圾收集器;它没有泛型,也没有防止其用于并发的goroutine之间的数据竞争的机制。Julia专注于数值计算性能,使用JIT编译器,也不提供像Rust那样的低层次控制。

Rust的稳定性及其演变

Rust从1.0.0版本开始,版本号遵循语义版本控制原则(更多信息请访问http://semver.org/):

  • 补丁版本:针对bug修复和其他小改动,增加最后一个数字,例如1.18.1
  • 小版本:对于不破坏现有功能的新功能,增加中间的数字,例如1.19.0
  • 主版本:对于破坏向后兼容性的更改,增加第一个数字,例如2.0.0

所以,在当前的1.n.m版本周期内不会出现重大变更,因为这个周期是向后兼容的;在这个周期内开发的Rust项目仍然可以在更新的版本中编译。然而,为了能够使用仅包含在更新版本中的新特性,必须将代码编译为那个特定的版本。

Rust拥有非常动态的进展周期。三个版本(称为渠道或构建)同时进行工作——每晚、测试和稳定,并且它们遵循严格的六周发布周期,就像网络浏览器一样:

  • 稳定渠道是当前的稳定版本,适用于正在生产中使用的Rust项目。
  • 测试渠道是被认为足够稳定,可以在较大、未部署的项目中测试新功能的版本。
  • 每晚渠道构建包含最新的实验性功能;它每24小时从master分支生成一次。你只会在实验中使用它。

测试和稳定渠道构建只在新功能回归到它们的分支时更新。通过这种安排,Rust允许用户快速访问新功能和bug修复。

此外,连续两年,Rust在Stack Overflow上被评为最受欢迎的编程语言(参见Stack Overflow调查)。

作为其成功的标志,今天,超过50家公司在生产中使用Rust,详见Rust官网,其中包括HoneyPot、Tilde、Chef、npm、Canonical、Coursera和Dropbox。

Rust的应用场景

从前面的部分可以清楚地看出,Rust可以用于通常使用C或C++的项目。事实上,许多人将Rust视为C/C++的继承者或替代者。虽然Rust被设计为系统语言,但由于其丰富的构造,它有广泛的应用范围,使其成为适合下列一个或所有类别的应用的理想候选:

  • 客户端应用程序,如浏览器
  • 低延迟、高性能系统,如设备驱动程序、游戏和信号处理
  • 高度分布式和并发系统,如服务器应用程序和微服务
  • 实时和关键系统,如操作系统或内核
  • 嵌入式系统(要求极小的运行时占用)或资源受限环境,如树莓派和Arduino,或机器人技术
  • 无法支持即时编译JIT)编译器系统常见的长时间启动延迟的工具或服务,需要即时启动
  • Web框架
  • 大规模、高性能、资源密集型和复杂的软件系统

当代码质量很重要时,Rust尤其适用,即:

  • 中等规模或更大的开发团队
  • 长期运行生产用途的代码
  • 需要定期维护和重构的寿命周期较长的代码
  • 通常需要编写大量单元测试以保障安全的代码

Servo

Mozilla使用Rust作为编写Servo的语言,Servo是其新的Web浏览器引擎,设计用于并行性和安全性(Servo官网)。

由于Rust的编译器设计,许多类型的浏览器安全漏洞被自动预防。2013年,三星参与其中,将Servo移植到Android和ARM处理器上。Servo本身是一个开源项目,拥有超过750名贡献者。它正在积极开发中,其中包括已经用Rust实现的自己的CSS3和HTML5解析器。它在2014年3月通过了Web兼容性浏览器测试ACID2(维基百科ACID2)。

Servo目前支持Linux、OS X、Windows和Android。Servo的部分内容被合并到Gecko中(Firefox所基于的引擎),从而使Firefox项目受益于Servo项目的进步。

  • 20
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值