[转帖]wiki Rust
Rust[编辑]
![]() |
|
编程范型 | 编译语言、并发计算、 函数式、指令式、 面向对象、结构化 |
---|---|
设计者 | Graydon Hoare |
实现者 | Mozilla |
发行时间 | 2010年 |
当前版本 |
|
类型系统 | 静态类型、强类型、 类型推论、结构类型 |
操作系统 | Linux、macOS、Windows FreeBSD、Android、iOS等[2] |
许可证 | Apache许可证2.0及MIT许可证[3] |
文件扩展名 | .rs、.rlib |
网站 | rust-lang.org |
启发语言 | |
Alef[4]、C#[4]、C++[4]、Cyclone[4][5] Erlang[4]、Haskell[4]、Hermes[4]、Limbo[4] Newsqueak[4]、NIL[4]、OCaml[4]、Ruby[4] Scheme[4]、Standard ML[4]、Swift[4][6] |
|
影响语言 | |
C# 7[7]、Elm[8]、Idris[9]、Swift[10]、Carbon |
Rust是由Mozilla[11]主导开发的通用、编译型编程语言。设计准则为“安全、并发、实用”[12][13],支持函数式、并发式、过程式以及面向对象的编程风格。
Rust语言原本是Mozilla员工Graydon Hoare的个人项目,而Mozilla于2009年开始赞助这个项目 [14],并且在2010年首次公开[15]。也在同一年,其编译器源代码开始由原本的OCaml语言转移到用Rust语言,进行自我编译工作,称做“rustc”[16],并于2011年实际完成[17]。这个可自我编译的编译器在架构上采用了LLVM做为它的后端。
第一个有版本号的Rust编译器于2012年1月发布[18]。Rust 1.0是第一个稳定版本,于2015年5月15日发布[19]。
Rust在完全公开的情况下开发,并且相当欢迎社区的反馈。在1.0稳定版之前,语言设计也因为透过撰写Servo网页浏览器排版引擎和rustc编译器本身,而有进一步的改善。它虽然由Mozilla资助,但其实是一个共有项目,有很大部分的代碼是来自于社区的贡献者[20]。
目录
设计[编辑]
Rust的设计目标之一,是要使设计大型的互联网客户端和服务器的任务变得更容易[21]。因此更加强调安全性、存储器配置、以及并发处理等方面的特性。
性能[编辑]
在性能上,具有额外安全保证的代碼会比C++慢一些,例如Rust对数组进行操作时会进行边界检查(尽管可以通过一些方式[22]绕过[23]),而C++则不会,但是如果等价的C++代碼作手工检查,则两者性能上是相似的[24]。
编译报错[编辑]
比起C/C++,Rust编译器的对于代码中错误的提示更清晰明了,开发者可根据提示轻松地修复代码中的错误。
编译速度[编辑]
由于其编译器会做出额外的安全检查,Rust的编译速度有时低于C/C++。
语法[编辑]
Rust的语法设计,与C语言和C++相当相似,区块(block)使用大括号隔开,控制流程的关键字如if
、else
、while
等等。在保持相似性的同时,Rust也加进了新的关键字,如用于模式匹配的match
(与switch
相似)则是使用C/C++系统编程语言的人会相对陌生的概念。尽管在语法上相似,Rust的语义(semantic)和C/C++非常不同。
内存安全[编辑]
为了提供内存安全,它的设计不允许空指针和悬空指针[25] [26]。 指针只能透过固定的初始化形态来建构,而所有这些形态都要求它们的输入已经分析过了[27]。Rust有一个检查指针生命期间和指针冻结的系统,可以用来预防在C++中许多的类型错误,甚至是用了智能指针功能之后会发生的类型错误。
所有权[编辑]
Rust设计了一个所有权系统,其中所有值都有一个唯一的所有者,并且值的作用域与所有者的作用域相同。值可以通过不可变引用(&T
)、可变引用(&mut T
)或者通过值本身(T
)传递。任何时候,一个变量都可以有多个不可变引用或一个可变引用,这实际上是一个显式的读写锁。Rust编译器在编译时强制执行这些规则,并检查所有引用是否有效。[28][29]
内存管理[编辑]
早期的Rust虽然有垃圾回收系统,但非如Java或.NET平台的全自动垃圾回收。Rust 1.0已不再使用垃圾回收器,而是全面改用基于引用计数的智能指针来管理内存。
类型与多态[编辑]
它的类型系统直接地模仿了Haskell语言的类型类概念,并把它称作“traits”,可以把它看成是一种特设多态。Rust的作法是透过在宣告类型变量(type variable)的时候,在上面加上限制条件。至于Haskell的高阶类型变量(Higher-kinded polymorphism)则还未支持。
类型推导也是Rust提供的特性之一,使用let
语法宣告的变量可以不用宣告类型,亦不需要初始值来推断类型。但如果在稍后的程序中从未指派任何值到该变量,编译器会发出编译时(compile time)错误[30]。 函数可以使用泛型化参数(generics),但是必须绑定Trait。不能使用方法或运算符而不声明它们的类型,每一项都必确明确定义。
Rust的物件系统是基于三样东西之上的,即实现(implementation)、Trait以及结构化资料(如struct)。实现的角色类似提供Class关键字的编程语言所代表的意义,并使用impl
关键字。继承和多态则通过Trait实现,它们使得方法(method)可以在实现中被定义。结构化资料用来定义字段。实现和(trait)都无法定义字段,并且只有(trait)可以提供继承,藉以躲避C++的“钻石继承问题”(菱型缺陷)。
历史[编辑]
2006年,Rust作为Graydon Hoare的个人项目首次出现。
2009年,Graydon Hoare成为Mozilla雇员[14]。
2010年,Rust首次作为Mozilla官方项目出现[15]。同年,Rust开始从初始编译(由OCaml写成)转变为自编译[16]。
2011年,Rust成功的完成了移植[17]。Rust的自编译器采用LLVM作为其编译后端。
2012年1月20日,第一个有版本号的预览版Rust编译器发布[18]。
2013年4月4日,Mozilla基金会宣布将与三星集团合作开发浏览器排版引擎Servo,此引擎将由Rust来实现[31]。
2015年5月16日,Rust 1.0.0发布[32]。
2020年3月27日,Rust核心团队成员Steve Klabnik在官方博客发表了一篇名为《Goodbye, docs team 》的文章,叙述了Rust文档的现状[33]。
2021年2月8日,AWS、华为、Google、微软以及Mozilla宣布成立Rust基金会[34][35]。
2022年9月19日,Linux初始开发者林纳斯·托瓦兹表示在Linux核心6.1版中会有对Rust的初步支持[36]。
2023年4月6日,Rust基金会发布了新商标政策草案,修订了关于如何使用Rust标志和名称的规则,导致了Rust用户社区的负面反应和抗议。[37]
生态系统[编辑]
除了编译器和标准库,Rust生态系统还包括用于软件开发的额外组件。官方推荐使用Rustup,一个Rust工具链安装程序来管理这些组件。
Cargo[编辑]
Cargo是Rust的软件包管理器,用来下载和构建依赖关系。Cargo还充当了Clippy和其他Rust组件的封装器。它要求项目遵循一定的目录结构。[38]
Cargo.toml文件指定了项目所需的依赖和版本要求,告诉Cargo哪些版本的依赖关系与该包兼容。Cargo默认从crates.io中获取依赖,但Git仓库和本地文件系统中的包也可以作为依赖。[39]
代码示例[编辑]
下面的代码在Rust 1.3中测试通过。
Hello World[编辑]
fn main() {
println!("Hello, World!");
}
如果不想使输出包含换行符(\n),可以使用print!
宏代替println!
宏。
阶乘[编辑]
下面是三个不同版本的阶乘函数,分别以递归、循环和迭代器的方法写成:
// 這個函數的if-else語句中展示了Rust中可選的隱式返回值,可用於寫出更像函數式程式設計風格的代碼
// 與C++和其他類似的語言不同,Rust中的if-else結構不是語句而是運算式,有返回值
fn recursive_factorial(n: u32) -> u32 {
if n <= 1 {
1
} else {
n * recursive_factorial(n - 1)
}
} fn iterative_factorial(n: u32) -> u32 {
// 變數用`let`定義,`mut`關鍵字使得變數可以變化
let mut i = 1u32;
let mut result = 1u32;
while i <= n {
result *= i;
i += 1;
}
result // 顯式返回值,與上一個函數不同
} fn iterator_factorial(n: u32) -> u32 {
// 迭代器有多種用於變換的函數
// |accum, x| 定義了一個匿名函數
// 內聯展開等最佳化方法會消去區間和fold,使本函數的運行效率和上一個函數相近
(1..n + 1).fold(1, |accum, x| accum * x)
} fn main() {
println!("Recursive result: {}", recursive_factorial(10));
println!("Iterative result: {}", iterative_factorial(10));
println!("Iterator result: {}", iterator_factorial(10));
}
并发计算[编辑]
一个简单的Rust并发计算例子:
use std::thread; // 這個函數將創建十個同時並行的執行緒
// 若要驗證這一點,可多次運行這個程式,觀察各執行緒輸出順序的隨機性
fn main() {
// 這個字串是不可變的,因此可以安全地同時被多個執行緒訪問
let greeting = "Hello"; let mut threads = Vec::new();
// `for`迴圈可用於任何實現了`iterator`特性的類型
for num in 0..10 {
threads.push(thread::spawn(move || {
// `println!`是一個可以靜態檢查格式字串類型的巨集
// Rust的巨集是基於結構的(如同Scheme)而不是基於文本的(如同C)
println!("{} from thread number {}", greeting, num);
}));
} // 收集所有執行緒,保證它們在程式退出前全部結束
for thread in threads {
thread.join().unwrap();
}
}
[转帖]wiki Rust的更多相关文章
- [转帖]什么是 LLVM?Swift, Rust, Clang 等语言背后的支持
要了解用于以编程方式生成机器原生代码的编译器框架是如何让新语言的推出以及对现有的语言进行增强比以往更加容易了. https://www.oschina.net/translate/what-is-ll ...
- D、GO、Rust 谁会在未来取代 C?为什么?——Go语言的定位非常好,Rust语言非常优秀,D语言也不错
不要管我的地位和 D 语言创造者之一的身份.我会坦诚的回答这个问题.我熟悉 Go 和 Rust,并且知道 D 的缺点在哪里.我鼓励人们在 Rust 和 Go 社区相似身份的人,也可以提出他们诚恳的观点 ...
- rust
books--------------Rust 中文教程 RustPrimer http://wiki.jikexueyuan.com/project/rust-primer/any/any.html ...
- [转帖][分享] 关于系统DIY--by 原罪
http://wuyou.net/forum.php?mod=viewthread&tid=399277&extra=page%3D1 前几天我发了一个帖子<Windows组件w ...
- rust 参考的资料 转
http://blog.csdn.net/loveisasea/article/details/46292715 rust官方学习文档: 1.http://doc.rust-lang.org/book ...
- 我持续推动Rust语言支持Windows XP系统
前言 Rust好像长期以来不支持Windows XP系统.有不少用户发帖提议官方支持XP,基本上都被Rust官方开发人员明白的拒绝了.他们的对话大致上是以这种形式開始和结束的(当中乙方代表官方及其拥趸 ...
- 专访Rust——由Mozilla开发的系统编程语言(目标人群就是那些纠结的C++程序员,甚至也是他们自己)
Rust是由Mozilla开发的专门用来编写高性能应用程序的系统编程语言.以下是对Rust的创始人——Graydon Hoare的采访. Graydon Hoare,自称为职业编程语言工程师,从200 ...
- rust crates 国内镜像加速配置
rust 很不错,但是crates 经常下载有点慢,当前阿里云还没有相关的镜像,还有科大为我们提供了一个 配置方法 添加crates 配置 $HOME/.cargo/config 目录 [regist ...
- rust cargo 一些方便的三方cargo 子命令扩展
内容来自cargo 的github wiki,记录下,方便使用 可选的列表 cargo-audit - Audit Cargo.lock for crates with security vulner ...
- rust学习
Rust (github) 1. install (https://rustup.rs/) 2. play on line curl https://sh.rustup.rs -sSf | sh e ...
随机推荐
- Java通过SSH连接路由器,输入命令并读取响应
最近需要读取和修改华为路由器的配置,使用Java语言开发,通过SSH连接,输入命令并读取响应. 1.添加mwiede/jsch依赖 如果使用Maven,可以在pom.xml文件中添加以下依赖: < ...
- 密码加密处理MD5与Salt
作用:一般用来加密或者签名(校验和) 特点: MD5算法不可逆如何内容相同无论执行多少次md5生成结果始终是一致 生成结果:始终是一个16进制32位长度字符串 //使用MD5 + salt +hash ...
- 如何快速部署本地训练的 Bert-VITS2 语音模型到 Hugging Face
Hugging Face是一个机器学习(ML)和数据科学平台和社区,帮助用户构建.部署和训练机器学习模型.它提供基础设施,用于在实时应用中演示.运行和部署人工智能(AI).用户还可以浏览其他用户上传的 ...
- MRS大企业ERP流程实时数据湖加工最佳实践
本文分享自华为云社区<MRS大企业ERP流程实时数据湖加工最佳实践>,作者:晋红轻 . 本文将以ERP流程实践为例介绍MRS实时数据湖方案的演进 案例实践需求解析: 业务描述 AE表:会计 ...
- 划重点丨详解Java流程控制语句知识点
摘要:流程控制语句就是用来控制程序中各语句执行的顺序,下面将详细介绍java流程控制语句. 流程控制语句就是用来控制程序中各语句执行的顺序,下面将详细介绍java流程控制语句. Q: break后面加 ...
- vue2升级vue3:vue3创建全局属性和方法
vue2.x挂载全局是使用Vue.prototype.$xxxx=xxx的形式来挂载,然后通过this.$xxx来获取挂载到全局的变量或者方法 在vue3.x这种方法显然是不行了,vue3中在setu ...
- dom4j selectNodes 取不到值 因为XML带有命名空间 HL7
xml 如下: <?xml version="1.0" encoding="UTF-8"?> <POOR_IN200901UV ITSVers ...
- django中间件需要了解的方法 importlib模块 csrf校验策略 csrf相关装饰器
目录 django中间件三个需要了解的方法 process_view process_exception process_template_response 基于django中间件实现功能的插拔式设计 ...
- SSL 证书变革之时已至,这些变化你都清楚吗?
现代社会最离不开的是"安全",无论是生命.财产.数据还是其他任何事物都需要各种手段来保证安全,互联网自然也无法免俗.HTTP 协议作为无法加密数据,让所有通信数据都在网络中明文&q ...
- 锁定/解锁账户BAPI
一.锁定/解锁账户 锁定账户后,该账户不能在SAP系统登录,但是已经登录的用户,仍然可以继续使用 解锁账户后,该账户就可以正常登录使用 "-------------------------- ...