Rust 有静态的Garbage Collector
steveklabnik 写了这篇博文,主要是因为看到了类似这样的言论:
手动内存管理比GC要做更多的工作,当然这样是为了提高性能或使用更多底层资源的权衡。所以Rust在什么时候或在什么场景使用要取决于你自己。
steveklabnik认为这是对Rust 无GC的一种误解。
GC算法目前比较常用的有分代回收,比如Ruby里就用到分代垃圾回收技术。但是还有一种与GC相关的概念,那就是「逃逸分析(escape analysis)」,这是一种优化技术。简而言之,就是在函数内定义的对象,如果从不在函数外使用,则将其存在栈上,否则,如果函数外有使用,就将其放到堆上。比如Java,比如Golang,都使用了逃逸分析。Go在一定程度消除了堆和栈的区别,因为Go在编译的时候进行逃逸分析,来决定一个对象放栈上还是放堆上,不逃逸的对象放栈上,可能逃逸的放堆上。这也是Go没有采用分代GC的原因,因为逃逸分析的存在,分代GC也带不来多少优势。你可以把逃逸分析看成是分代GC的更强版本,任何放到堆上的对象,可以算是老一代对象。
目前,普通有个观点就是GC是运行时。既然人们把语言一分为二,动态和静态,那么为什么不能把GC也一分为二,分成动态和静态呢? 在这方面C++做了很多的工作。Rust语言站在C++的基础上,继续开创静态GC这条路。
在某些方面,你可以把Rust借用检查看作是一种更强大的逃逸分析。就像是TypeScript里存在的渐进式类型(gradual typing)那样(TypeScript允许你同时使用动态类型和静态类型,有助于让学习者逐渐适应静态类型),你也可以把Rust里提供的这些内存自动化管理的功能看作是一种渐进式GC。
所以,Rust的GC,实际上是一种静态式GC,不要再以传统的观念来看待GC,也不要以传统的系统级语言看待Rust,以为Rust也是纯手动管理内存,实际上Rust的自动内存管理是非常先进的。
注: 以上并非翻译,只是对文章表达意思的总结,详细请看原文
Bible.rs | 使用Actix Web和Diesel编写的在线《圣经》网站
并且开源,可以作为一个actix-web框架全栈学习案例
关于Rust中类型布局和ABI的笔记
德国Rust线下meetup主题:在工业和自动化中使用Rust
德国的工业4.0据说很猛,从这meetup主题可见一斑。
「油管」Andrea Pessino 展示Rust实现的三次参数曲线(Cubic Curves)
Cubic Curves是贝赛尔曲线(Bézier Curve)的基础,一个三位空间曲线通过转换投影到2D平面的曲线。
Andrea Pessino是曾开发 《战神:奥林匹斯之链》 和《 战神:斯巴达之魂》 的业界大厂 Ready at Dawn Studios 的CTO。
评论区
写评论还没有评论