关于referent和borrow的详细规则可见下图(原图地址)。
所有的这些规则都由编译器实现。简而言之,Rust通过编译期的规则实现了没有GC下的内存安全。
1.2 线程安全性在内存安全的基础上,Rust更进一步地保证了线程安全性。
默认情况下一个对象只能被拥有所有权的线程访问。
实现了Send trait的数据类型所有权能够在多个线程间转移,但线程间不存在共享数据。
实现了Sync trait的数据类型能够被多个线程同时访问,代表着该数据类型实现了线程间的同步操作。
需要说明的是,Send和Sync都属于编译器自动添加的标记(marker trait),并不需要开发人员实现。如果某个数据类型所有成员都是Send或Sync的,那么该数据类型也会被自动标记为Send或Sync。这样如果代码能够编译通过就自然而然地说明线程安全。
1.3 性能benchmark显示Rust有着媲美C/C++的效率,就执行速度而言狂虐Golang/Java。
在TechEmpower进行的主流Web框架性能测试中,由微软员工Kim使用Rust构建的actix开源框架在多项测试场景中拔得头筹。
依据历年的数据,70%的安全漏洞都和内存安全有关。Rust完美解决了安全性和性能的两难问题,也让它成为了开发底层应用的更优选择。目前,Intel、微软和Linux都在积极准备使用Rust开发驱动程序甚至操作系统内核以改善日益严峻的安全问题。
近年来CVE中内存安全类漏洞比例图 2.兼容并包 —— 支持多种编程范式Rust在设计之初被定位为多范式语言(multi-paradigm language),在汲取了其它语言大量成功经验基础上,并不限定用户采用某种特定的范式。
2.1 命令式风格与函数式风格Rust支持传统的命令式风格(imperative style)代码无须赘述。Rust同时也吸取了大量ML阵营函数式风格(functional style)编程语言的诸多特性,比如模式匹配、不可变量与无副作用方法、Haskell类型系统、反向类型推导和trait特性系统等。这使Rust拥有极致的性能和对底层细腻的掌控能力的同时,具备高度抽象的表达能力。
2.2 多线程模型使用Rust进行多线程应用开发,同样拥有极高的自由度。
可以选择线程间共享数据,通过传统的操作系统原语同步或者lockless数据结构;
也可以选择CSP(Communicating sequential processes)模型,就如Golang开发手册中总结的那样“Do not communicate by sharing memory; instead, share memory by communicating.”。
还可以选择如Erlang那样的异步Actor模型
3 v1.39添加了async/await 异步编程支持对于高并发I/O应用的开发,异步编程是首选项。传统的异步依赖于回调或者闭包,实现起来麻烦不说,代码可读性也差强人意。而Rust这次新添加的两个关键字类似于C#和Python中的async / await ,用户无需再依赖于回调或者闭包,用最自然的方式编写可读性佳的I/O操作代码,代码看上去和同步代码无异,而编译器将异步调用部分编译为状态机从而实现异步执行。这点感觉非常好。
4.个人使用体会