rust简介

Rust是由Mozilla主导开发的通用、编译型编程语言。设计准则为“安全、并发、实用”,支持函数式、并发式、过程式以及面向对象的编程风格。第一个有版本号的Rust编译器于2012年1月发布。Rust 1.0是第一个稳定版本,于2015年5月15日发布。

由于可靠的性能以及靠近底层的控制能力,rust语言非常适合系统工具的开发。rust也是webassembly的常选开发语言之一,它克服了Javascript性能较差的劣势,与Javascript不同,rust是一门静态类型语言(但它通常可以自动判断值的类型)。

Rust的性能

在性能上,具有额外安全保证的代码会比C++慢一些,例如对Rust的数组进行操作时默认会检查索引是否越界,尽管可以通过一些方式绕过,而C++则不会,但是如果以C++也手工提供保证的情况下,则两者性能上是相似的。

语法

Rust的语法设计,与C语言和C++相当相似,区块(block)使用大括号隔开,流程控制的关键字如if、else、while等等。在保持相似性的同时,Rust也加进了新的关键字,如用于模式匹配(pattern matching)的match(与switch相似)则是使用C/C++系统编程语言的人会相对陌生的概念。尽管在语法上相似,Rust的语义(semantic)和(C/C++)非常不同。

内存安全

为了提供存储器安全,它的设计不允许空指针和悬空指针。 指针只能透过固定的初始化形态来建构,而所有这些形态都要求它们的输入已经分析过了。Rust有一个检查指针生命期间和指针冻结的系统,可以用来预防在C++中许多的类型错误,甚至是用了智能指针功能之后会发生的类型错误。

内存管理

早期的Rust虽然有垃圾回收系统,但非如Java或.NET平台的全自动垃圾回收。Rust 1.0已不再使用垃圾回收器,而是全面改用基于引用计数的智能指针来管理内存。

类型与多态

它的类型系统直接地模仿了Haskell语言的类型类概念,并把它称作“traits”,可以把它看成是一种特设多态。Rust的作法是透过在宣告类型变量(type variable)的时候,在上面加上限制条件。至于Haskell的高端类型变量(Higher-kinded polymorphism)则还未支持。

类型推导也是Rust提供的特性之一,使用let语法宣告的变量可以不用宣告类型,亦不需要初始值来推断类型。但如果在稍后的程序中从未指派任何值到该变量,编译器会发出编译时(compile time)错误。 函数可以使用泛型化参数(generics),但是必须绑定Trait。没有任何方法可以使用方法或运算符,又不宣告它们的类型,每一项都必确明确定义。

Rust的对象系统是基于三样东西之上的,即实现(implementation)、Trait以及结构化资料(如struct)。实现的角色类似提供Class关键字的编程语言所代表的意义,并使用impl关键字。继承和多态则透过Trait实现,它们使得方法(method)可以在实现中被定义。结构化资料用来定义字段。实现和(trait)都无法定义字段,并且只有(trait)可以提供继承,藉以躲避C++的“钻石继承问题”(菱型缺陷)。

环境配置

安装rust

这一节的环境配置以在linux发行版manjaro上配置基本的rust开发环境为例,可套用到大部分linux开发环境。

rust适用于各种常见的操作系统(Windows、MacOS、Linux)在rust语言官方网站:https://www.rust-lang.org/页面上点击get started即可进入安装/试用rust页面。根据操作系统选择进行相应操作即可。

在Linux终端使用如下命令安装rustup,rustup是rust语言及其工具链的安装工具:

  1. curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

Rust语言工具链包括rust编译器rustc,构建工具cargo,以及rustup

Hello rust

安装好Rust后,在任意目录下进行测试,创建文件hello.rs(.rs是rust源文件的后缀名),键入以下内容:

  1. pub fn main(){
  2. println!("Hello rust!");
  3. }

打开终端,在当前目录下运行下列指令进行编译:

  1. rustc ./hello.rs

运行成功后目录下会多出一个二进制程序hello,终端运行./hello看见如下输出:

  1. Hello rust!

至此环境配置完毕。