本书github链接:inside-rust-std-library
前面章节参见:
深入RUST标准库内核(序言) - (jianshu.com)
引言
RUST无疑是编程语言史中最难学的高级语言,在仅依靠静态编译的前提下实现一门安全的编程语言,这是必须付出的代价。无论如何,成为一门编程语言的老手的最佳办法就是深入分析,学习,理解优秀的代码,那RUST标准库的代码必然是不可绕过的最佳教材。另外,掌握RUST也必然意味对标准库的熟练掌握,深入了解标准库接口后面的内核无疑能帮助我们更好的掌握如何使用标准库。
本书目的
本书主要是对RUST标准库代码进行分析,希望通过对标准库代码的学习,分析,能让读者对RUST代码的编写技巧,规则有更好的理解,为读者成为RUST老手奠定基础。
目标读者
本书不适合初级程序员,本书针对的最佳对象是资深的C/C++程序员, 转学RUST。本书也适合已经采用RUST编写了一段时间程序,但希望对RUST有更深的了解,尤其是希望进行操作系统内核编程或通用编程框架编程的程序员。对于Java/python/go等语言的资深程序员,本书可以作为RUST与其他语言相比较的一个参考。阅读本书之前,读者最好已经学习过官方教程,中文翻译版链接如下RUST程序设计语言。本书不是标准库参考手册,如需要参考手册,中文翻译版链接如下RUST标准库参考手册。本书难度应该属于死灵书级别,中文翻译版死灵书链接如下RUST秘典
本书约定
对于代码的解析,以代码中文注释的方式放在本书的代码中。
RUST标准库体系概述
RUST语言的设计目标是操作系统内核级的系统编程语言,使用静态编译,并且不采用GC机制,保证开发出的应用极高性能。同时又具备现代编程语言的语法特点, 在编译阶段就保证内存安全,并发安全,分支安全等安全性。
现代高级语言的标准库是语言的一个紧密的组成部分,语言的很多特性实际是标准库实现。RUST的库也是如此,但与其他采用GC方案的语言不同,其他语言编程目标是在操作系统之上运行的用户态程序,只需要考虑一种模型。RUST的编程目标要加上操作系统内核,需要考虑内核与用户态两种模型。C语言在解决这个问题的方法是只提供用户态的标准库,操作系统内核的库由个操作系统自行实现。
RUST的现代语言特性决定了标准库无法象C语言那样把操作系统内核及用户态程序区分成完全独立的两个部分,所以只能更细致的设计,做模块化的处理。RUST标准库体系分为三个模块:语言核心库--core; alloc库;用户态 std库。
core库
RUST语言核心库,适用于操作系统内核及用户态,包括RUST的基础类型,基本Trait, 类型行为函数,其他函数等内容。core库是硬件架构和操作系统无关的可移植库。主要内容:
编译器内置intrinsics函数
包括内存操作函数,算数函数,位操作函数等, 这些函数通常与CPU硬件架构紧密相关,且一般需要汇编来提供最佳性能。 intrinsic函数实际上也是对CPU指令的屏蔽层。
基本Trait
推荐这个链接
本节给出core库中的Trait一览
运算符(ops)Trait
主要是各种用于表达式的RUST符号重载,包括算数计算符号,逻辑运算符号,位操作符号,解引用(*)符号, [index]数组下标符号, start..=end /start..end/start../..end/..=end/.. 等Range范围符号, ?号,||{..}闭包符号等,RUST原则是所有的运算符号都要能重载, 所以所有运算操作都定义了重载Trait。
编译器内部实现的派生宏 Trait
如果类型结构中的每一个变量都实现了该Trait, 则此结构的该Trait可通过派生宏实现
Clone, Copy: Copy浅复制,Clone提供深复制
Debug: 类型的格式化输出
Default: 类型的default值,
Eq, Ord,PartialEQ, PartialOrd: 实现后可以对类型的变量做大,小,相等比较
Sync, Send: 实现此Trait的类型变量的引用可以安全在线程间共享
Hash: 实现结构的整体Hash值,这个Trait Hash是因为复杂才被加入,意义没有前面的大
Iterator
迭代器,RUST基础构架之一,也是RUST所有学习资料的重点。也是每个类型结构代码分析的重点。
类型转换Trait
AsRef, AsMut, From,Into,TryFrom,TryInto, FloatToInt, FromStr。
异步编程Trait
此处略,需要单独做分析
内存相关Trait
此处略,需要单独做分析
基本数据类型
包括整数类型,浮点类型,布尔类型,字符类型,单元类型,内容主要是实现运算符Trait, 类型转换Trait, 派生宏Trait等,字符类型包括对unicode,ascii的不同编码的处理。整数类型有大小端变换的处理。
数组、切片及Range
这些类型对Iterator Trait, 运算符Trait, 类型转换Trait, 派生宏Trait及其他一些行为函数。
Option/Result/Marker等关键的语言级别Enum类型
RUST安全特性的重点,也是各种学习资料的重点,不赘述。后继章节将对代码给以说明
RUST内存相关类型及内容
alloc, mem, ptr等模块,RUST的内存操作。是本书代码分析的第一个重点。
RUST字符串相关库
字符串str,string,fmt, panic, debug, log等
RUST时间库
Duration等
alloc库
alloc库主要实现需要进行动态堆内存申请的智能指针类型,集合类型及他们的行为,函数,Trait等内容,这些仅需要建立在core库模块之上,std会对alloc模块库的内容做重新的封装。alloc库适用于操作系统内核及用户态程序。
包括:
1.基本内存申请;Allocator Trait; Allocator的实现结构Global
2.基础智能指针:Box
3.动态数组内存类型: RawVec
4.字符串类型:&str, String
5.并发编程指针类型: Arc
6.指针内访问类型: Cell
还有些其他类型,一般仅在标准库内部使用,后文在需要的时候再介绍及分析。
std库
std是在操作系统支撑下运行的只适用于用户态程序的库,core库实现的内容基本在std库也有对应的实现。其他内容主要是将操作系统系统调用封装为适合rust特征的结构和Trait,包括:
1.进程,线程库
2.网络库
3.文件操作库
4.环境变量及参数
5.互斥与同步库,读写锁
6.定时器
7.输入输出的数据结构,
8.系统事件,对epoll,kevent等的封装
可以将std库看做基本常用的容器类型及操作系统封装库。
小结
RUST的目标和现代编程语言的特点决定了它的库需要仔细的模块化设计。RUST的alloc库及std库都是基于core库。RUST的库设计非常巧妙和仔细,使得RUST完美的实现了对各种硬件架构平台的兼容,对各种操作系统平台的兼容