内容
- 介绍
- 特性总结
- rust 语言的特性(零开销的抽象,移动语义)
- 结论
介绍
Rust是一门关注与安全,速度与并发的编程语言。它的设计理念就是比C或者C++开发更安全,比Python或者Ruby速度更快。Rust语言的绝大部分的安全检查与内存管理都是在程序的编译期完成,因此的程序的运行时开销不会很大。这个特性使得Rust在以下用例(1. 程序需要可预测的资源申请, 2.嵌入式设备,3.底层代码类似设备驱动)下比java之类的语言更安全。Rust也可以被用来开发Web后端Server。
特性总结
Rust成功解决的一些问题。
-
问题:由于虚函数(运行时动态确定)调用的高成本,更倾向于将重复代码抽象
-
解决:零成本抽象(本人不理解。。。)零抽象应该说的是,只用只需要用的,不用不需要的,也就是说,不调用不多余的东西,它并不说由编译器生成的代码,肯定是最好的选择,不会出现性能损耗。
-
问题: 内存释放后使用,两次释放同一内存,悬空指针
-
解决: 通过智能指针以及引用的使用避免这些问题以及通过编译时期限制原始指针的使用
-
问题:Null指针解引用的错误
-
解决:Rust中提出Option类型作为null指针的替代品
-
问题: 数据竞争
-
解决: Rust在编译期通过内置的静态分析工具来检测和预防可能的数据竞争
-
问题: 未初始化的变量
-
解决: 编译器要求所有的变量在使用前都都必须初始化。
-
问题: 标准库中大量使用的实用程序类型的遗留设计(不了解)
-
解决: 内置,可组合,结构化的类型: 元组,结构,枚举类型。模式匹配可以方便的使用结构化的类型,一些标准库全面拥抱模式匹配。
-
问题: 嵌入式设备对程序的运行时开销要求高
-
解决: Rust的运行时开销很低
-
问题: 调用C语言或者其他语言的库
-
解决: 看不懂(Only header declarations are needed to call C functions from Rust, or vice versa。No overhead in calling C functions from Rust or calling Rust functions from C)
Rust语言的特点
零成本抽象
抽象是 Rust 开发人员用来处理复杂代码的一个很好的工具。 一般来说,抽象带有运行时成本,因为抽象代码比特定代码更低效。 然而,通过好的语言设计和编译器优化,一些抽象可以使运行时成本有效地为零。 这些优化的通常来源是静态多态性(模板)和内联函数,两者都被Rust完全包含。 迭代器是通常使用的抽象(因而是大量优化)抽象的一个例子。Rust的迭代器提供了许多内置的组合器来操作数据序列,使程序的表达更加简洁。
let data1 = &[3, 1, 4, 1, 5, 9, 2, 6];
let data2 = &[2, 7, 1, 8, 2, 8, 1, 8];
let numbers = data1.iter() // {3, 1, 4...}
.zip(data2.iter()) // {(3, 2), (1, 7)...}
.map(|(a, b)| a * b) // {6, 7, ...}
.filter(|n| *n > 5) // {6, 7....}
.take(4) // 总共取4个
.collect::Vec<_>();
println!("{:?}", numbers);
复制代码
函数组合器(map, zip,filter之类)使用了闭包和匿名函数,如果compile natively(本地编译,是啥?)会有明显的运行开销,但是由于LLVM的优化,使用这个代码执行效率和手编版的一样。
use std::cmp::min;
let mut numbers = Vec::new();
for i in 0...min(data1.len(), data2.len()) {
let n = data1[i] * data2[i];
if n > 5 {
numbers.push(n);
}
if numbers.len() == 4 {
break;
}
}
复制代码