初识Rust语言

起因:公司里面看到一个关于Rust的分享,好奇听了一下。本文记录一些感兴趣的部分以及我的一些评论。


1. Rust的复合类型组合方式

  a. struct {} / tuple ()

    在几乎所有语言中都会见到的组合类型,没什么好说。

  b. enum {}

    枚举,同时也是union类型。

2. 关于null与Void

  不支持null(认为是不好的设计),nullable类型实际上是 notnull类型 + None 的union类型。(即Option)

  使用空enum {}的不可实例化特性来代表无返回。(对于写程序的人意义不大,可能是为了增强类型系统的一致性,便于编译器的实现?)

3. Rust的内存管理机制

  ownership、move、borrow、lifetime

  将“部分场景”下C++的内存管理最佳实践内化为语言的基本特性(即你必须时刻关注所有变量的生命周期是受到什么控制的)。但是显然Rust也没有办法使用限制如此强烈的内存管理机制来支持所有场景,于是使用smartpointers、unsafe来支持剩下的场景。前面的想法有多迷人,后面的补丁就有多遗憾。

4. 默认immutable

  符合我个人的习惯,写C++的时候每见变量必先考虑:1. 能不能const,2. 能不能传引用。

5. share(borrow) immutable 不兼容

  这个特性没有详细了解,smartpointers与此相关。

6. buffer overflow的防御

  运行时特性,有额外开销。属于安全-性能间的tradeoff。

7. system language(可以用来写操作系统,意思展开如下)

  a. 依赖

    i. 不依赖虚拟机/可以编译到主流架构。

    ii. 不必须依赖标准库(当然标准库不依赖于操作系统接口也可以)。

    iii. 可内嵌汇编。

  b. 高性能(编译优化)

    i. 编译器:编译器的优化能力很重要,这个其实并不是语言本身的功劳,看具体编译器实现。

    ii. 静态信息:语言提供的静态信息的丰富程度和语言标准(比如C的UB)会影响编译器优化的上限。

    iii. 动态需求:语言提供的动态能力越丰富,额外开销越多,比如上面提到的越界检查,再比如其他语言的自省、动态类型等。

    iv. 原生结构优化:集合类、迭代器等的原生支持可以让编译器对特定代码做更好的优化。否则程序行为依赖第三方代码的具体实现则难以做优化。

8. cargo包管理

  暂不评论。


总结:Rust对我来说总体属于有启发性但是没有达到革命性的层次,使用意愿中等。另外让我回想起了王垠的《对Rust语言的分析》:)。

posted @ 2020-01-15 21:50  rainforwind  阅读(465)  评论(0)    收藏  举报