Rust源码组织结构
Rust源码组织结构
目录
- Rust源码组织结构
- liballoc
- libcore
- libstd
- 编译过程
- librustc_apfloat
- librustc_arena
- librustc_serialize
- librustc_span
- librustc_data_structures
- librustc_index
- librustc_graphviz
- librustc_driver
- librustc_interface
- librustc_lexer
- librustc_macros
- librustc_ast
- librustc_ast_pretty
- librustc_ast_passes
- librustc_ast_lowering
- librustc_hir
- librustc_middle/librustc_mir
- librustc_codegen_ssa
- librustc_codegen_llvm
- 参考资料
liballoc
内存分配库, 标准库中涉及到堆内存分配相关的代码在此;
- alloc: 全局内存分配器
Global(实现了AllocReftrait), 及内存分配相关的函数alloc/realloc/dealloc/alloc_zeroed的实现(他们是对libcore库中的内存分配函数的封装); - boxed:
Box(指向堆内存的智能指针, 类似C++中的unique_ptr)的实现; - borrow:
ToOwnedtrait实现, 实现ToOwned的对象可以从实现了Borrow的对象中拷贝内容(Clonetrait仅负责T和&T类型的对象的拷贝).Cow写时复制(clone-on-write)智能指针; - fmt:
format格式化函数的实现; - macros:
vec!宏的实现; - raw_vec:
RawVec的实现(数组相关数据结构的底层实现, 如Vec); - rc:
Rc基于引用计数的单线程安全的智能指针实现, 类似于C++中的shared_ptr.Weak非所有权引用的智能指针实现 类似C++中的weak_ptr. 两者底层是RcBox; - slice:
[T]切片的实现; - str:
str字符串切片你的实现; - String:
StringUTF-8字符串的实现(String底层是Vec); - sync:
Arc基于引用计数的线程间安全的智能指针实现, 类似于C++中的atomic<shared_ptr>.Weak非所有权引用的智能指针实现. 两者底层是ArcInner; - task:
Waketrait实现; - vec:
Vec数组的实现(底层是RawVec); - collections: 集合容器的实现;
- btree: B树数据结构的实现;
- map:
BTreeMap基于B树的键值map实现; - node: B树根节点
Root, 树叶子LeafNode等相关的实现; - search: 根据指定键值搜索的相关函数;
- set:
BTreeSetset实现(底层是BTreeMap);
- map:
- binary_heap:
BinaryHeap二叉堆的实现(底层是Vec); - linked_list:
LinkedList双向链表实现; - vec_deque:
VecDeque双向队列实现(底层是RawVec);
- btree: B树数据结构的实现;
libcore
Rust核心库, Rust语言特性相关的实现在此中;
- any:
Anytrait实现; - ascii:
EscapeDefault/escape_defaultASCII字符集相关的特化操作; - bool:
bool类型的实现(非基础语言层面的实现, 提供一些额外的辅助功能); - borrow:
Borrowtrait的实现, 注意和AsRef的区别; - cell:
Cell内部可变性实现(interior mutability), 即不可变的实例可以被覆写(屏蔽编译器对immutable实例不可修改的限制, 该语义的实现是底层的UnsafeCell).RefCell屏蔽编译器的borrow规则, 只进行动态期的borrow规则检查, 底层是UnsafeCell; - clone:
Clonetrait实现; - cmp:
PartialEq/PartialOrd/Eq/Ord/Ordering比较相关的trait; - default:
Defaulttrait; - ffi:
c_void(做指针使用时等效于c的void指针),VaList(等效于C语言中的变参参数实现); - hint: 用于编译器优化相关的实现,
spin_loop/unreachable_unchecked/black_box; - internal_macros: 内部使用的宏的定义, 主要是一些操作符的通用宏. 因为Rust中某个trait实现blanket impl后, 外部crate就不能在某个类型上实现该trait了(orphan rule and overlap rule). 为了使外crate可以实现核心库中某些trait, 所以通过宏来一条条的对某些类型实现某个trait, 如
Add; - intrinsics: 暴露一些基本指令的函数接口;
- marker: 主要用于语法语义的标识trait, 如
Sync/Send/PhantomData等; - option:
Option; - panic/panicking: panic相关;
- raw:
TraitObject动态派发对象; - result:
Result; - time:
Duration; - tuple: 元组的某些trait实现, 当前这些trait实现上元组参数需小于等于12个. 注:
tuple_impls的宏实现很值得用于Rust宏学习; - unit:
(),*映射到(); - alloc: 内存分配相关;
- global:
GlobalAlloctrait, 内存分配器需实现的trait; - layout:
Layout内存布局抽象; AllocRef/AllocInit/MemoryBlock: 内存块(MemmoryBlock, 多了一个块大小的域, 因此可以标识0大小的内存区域)分配相关接口数据接口;
- global:
- array: 数组相关操作, 如
PartialEq/Borrow等(当前只支持长度小于等于32的数组); - char: 字符相关;
- convert:
From/TryFrom/Into/TryInto等转换相关trait(注意: 这些转换trait并不是as的重载trait)及对基本类型的这些traits实现,Infallible用于标识永远不会出现的Error; - ptr: 对裸指针的不同用途封装实现(零开销), 及对指针指向内存相关操作的函数封装;
- unique:
Unique该指针指向的实例应该只由该Unique指针修改, 而不应该通过其它指针修改(Unique指针必须是非空的). 注意:Unique并没有暴露给外部crate使用; - non_null:
NonNull该指针指向的实例必须是非空的; - mut_ptr:
*mut T指针相关的辅助功能(如对指针偏移计算, 不知为什么偏移计算为什么没有提供诸如Add<usize>的重载实现); - const_ptr:
*const T指针相关的辅助功能; drop_in_place/read/write等内存操作相关函数封装;
- unique:
- pin:
Pin指针; - slice: 切片操作相关辅助功能;
- memchr:
memchr/memrchr在切片中查找子片; - rotate:
ptr_rotate切片旋转操作(为啥要实现这么复杂?); - sort: 插入排序, 堆排序, pattern-defeating快排实现;
- memchr:
- unicode: Unicode编解码相关;
- task: 异步任务相关;
- wake:
RawWaker/RawWakerVTable异步任务唤醒行为约定,Context异步任务的上下文描述; - poll:
Pool异步任务状态;
- wake:
- sync: 同步相关;
- atomic: 原子类型和内存顺序相关;
- str: 字符串切片相关(迭代器/有损UTF-8字符串/模式匹配);
- arith: 算术操作符重载trait
Add/Sub/Mul/Div/Rem/BitAnd/BitOr/BitXor/Shl/Shr, 及诸如+=形式操作符的重载traitAddAssign/...; - bit: 一元操作符重载trait
Not/Neg; - deref: 解引用重载trait
Deref/DerefMut; - drop: 实例对象的析构trait
Drop; - function: 函数调用trait
FnMut/Fn/FnOnce; - generator: 异步生成器trait
Generator; - index: 索引重载trait
Index/IndexMut; - range:
Range/RangeFrom/RangeTo/RangeFull/RangeInclusive/RangeToInclusive; - try:
?重载traitTry; - unsize: 动态派发标识
DispatchFromDyn,CoerceUnsied标识可以在指针上完成unsize(编译器不知道指向内容具体大小)的操作; - num: 一些常用基本数据类型的算术常量定义;
- macros: 暴漏给外部crate使用的诸如
panic!/matches/format_args!等的宏定义; - mem: 内存操作相关;
- manually_drop:
ManuallyDrop标识手动析构drop的对象(禁止编译器自动drop); - maybe_uninit:
MaybeUninit用于标识可能未初始化对象; drop/forget/replace/transmute/discriminant等对象实例内存操作函数,Discriminant用于枚举实例类型的判定;
- manually_drop:
- iter: 迭代器语义实现;
- 迭代器协议trait
Iterator, 其它常用的迭代操作的迭代器类型, 如reverse->Rev/filter->Filter等;
- 迭代器协议trait
- hash: 通用hash接口定义;
Hash表示实现该trait的类型, 可以接收哈希器完成hash运算;Hashertrait约定哈希器的接口实现;BuildHasher约定哈希器的实例的创建接口;- sip:
SipHasher13siphash算法实现(虽然deprecated状态, 但还是当前内部使用的默认的哈希器);
- future: 异步语义实现;
Future异步计算接口约定trait;
- fmt: 字符串格式化相关;
Binary/Debug/Octal等约定不同格式化说明符时的输出行为;- float: 浮点数的格式化输出实现;
- num: 整数的格式化输出实现;
- rt/v1: 格式化输出的细节定义, 如对齐/填充等等;
libstd
libstd暴露的接口是对一些通用功能的抽象, 但是这些功能的细节实现通常依赖于具体的操作系统. 本节仅描述在libstd中定义实现的(非从libcore/liballoc中导入到该libstd的功能)功能接口, 对于具体的细节实现在后续的源码阅读中;
- alloc:
System由操作系统提供的默认内存分配器, 实现了AllocRef/GlobalAlloctrait; - backtrace:
Backtrace/BacktraceStatus操作系统线程异常信息捕获(底层Frame是对操作系统线程栈帧信息的封装); - env:
Arg/ArgOs应用程序启动时传入的命令行参数迭代器,Var/VarOs应用程序当前的环境变量迭代器,SplitPaths环境变量PATH迭代器; - sync, ffi,io,net,thread, time, error, f32,f64,fs,path,process: 见标准库文档描述;
- rt: rust运行时, 提供全局堆/异常处理等;
- HashMap:
HashMap底层使用的hashbrown库中的HashMap(底层实现是SwissTable算法), 哈希器采用的是SipHasher13; - HashSet:
HashSet由HashMap实现; - os: 和操作系统相关的特定功能;
- raw: C语言基本数据类型到Rust基本树类型的映射(
c_float->f32/c_int->i32等等). 注意c_void在libcore::ffi中定义了; - linux:
- fs:
MetadataExttrait特定平台下的文件元数据扩展信息; - raw: Linux平台下不同处理器架构上的一些数据类型到Rust类型的映射(如x86_64架构中Linux系统下
time_t->i64/off_t->u64/stat等等);
- fs:
- redox,vxworks等等系统性类似, 不在赘述.;
- raw: C语言基本数据类型到Rust基本树类型的映射(
- sys: 该模块封装了一些和操作系统具体实现相关的功能, 以对外提供一致的抽象接口;
- windows: Windows平台下的系统功能;
- c:
- windows系统中的一些基本数据类型到Rust数据类型的映射(如
BYTE->u8/ULONG_PTR->usize/LPVOID->*mut c_void等等), 定义的C基本类型从crate::os::raw模块导入. 以及定义了和Windows下等价的符合数据类型(如in_addr/in6_addr/fd_set/STARTUPINFO等等). 此外, 还导入了实现标准库所需的线程/网络/io/同步相关的系统函数;
- windows系统中的一些基本数据类型到Rust数据类型的映射(如
- time:
InstantTime: 使用QueryPerformanceCounter精确获取时间;SystemTime: 使用GetSystemTimePreciseAsFileTime精确获取系统时间;
- alloc:
System: 标准库的默认内存分配器的使用HeapAlloc/GetProcessHeap分配堆内存;
- args:
args: 标准库中的args()/args_os()的底层都是调用该函数, 其调用系统函数GetCommandLineW获取app的命令行输入参数;
- cmath: 数学函数底层调用;
- compat: win7和xp的兼容层(
GetProcAddress); - condvar: 标准库CondVar底层实现
SleepConditionVariableSRW/WakeConditionVariable/WakeAllConditionVariable; - env: 和特定系统相关的常量;
- fs: 主要函数:
FindNextFileW/FindClose/CreateFileW/FlushFileBuffers/SetFileInformationByHandle/GetFileInformationByHandle/GetFileInformationByHandleEx/SetFilePointerEx/CreateDirectoryW/CreateSymbolicLinkW/CreateHardLinkW/SetFileAttributesW/GetFinalPathNameByHandleW/CopyFileExW/DeviceIoControl, 主要数据结构:REPARSE_MOUNTPOINT_DATA_BUFFER/WIN32_FIND_DATAW/BY_HANDLE_FILE_INFORMATION/FILE_BASIC_INFO; - handle:
Handle文件/线程的句柄, 主要调用系统函数CreateEventW/ReadFile/WriteFile; - mutex: 标准库互斥锁
Mutex的底层AcquireSRWLockExclusive/TryAcquireSRWLockExclusive/ReleaseSRWLockExclusive/SRWLOCK,ReentrantMutex递归锁底层InitializeCriticalSection/EnterCriticalSection/TryEnterCriticalSection/LeaveCriticalSection/DeleteCriticalSection/SRWLOCK; - net: 网络库底层实现
WSAStartup/WSACleanup/WSASocketW/WSARecv/WSASend; - rand: 随机数生成底层实现
RtlGenRandom/BCryptGenRandom; - rwlock: 读写锁
AcquireSRWLockShared/TryAcquireSRWLockShared/AcquireSRWLockExclusive/TryAcquireSRWLockExclusive/ReleaseSRWLockShared/ReleaseSRWLockExclusive; - thread:
CreateThread/WaitForSingleObject/SwitchToThread;
- c:
- unix: 类unix平台下就很熟悉了, 基本调用的都是POSIX接口, 不再赘述;
- windows: Windows平台下的系统功能;
- sys_common: 抽象出来的和平台无关的公共接口, 在sys上面封装的一层, 不再赘述;
编译过程
graph TD;
RustSource -->|Parsing and Desugaring| HIR
HIR -->|Type checking| MIR
MIR -->|Borrow checking and Optimization| LLVM_IR
LLVM_IR -->|Optimization| MachineCode
librustc_apfloat
任意精度浮点数, IEEE浮点数语义抽象, 实际最多支持128位的总位长;
- ieee: ieee浮点数语义抽象;
Half/Single/Double/Quad/X87DoubleExtended: 对应16/5, 32/8, 64/11, 128/15, 80/15浮点数(总位长/指数位长);
- ppc: PowerPC平台下的浮点语义实现;
DoubleDouble: 64/11;
librustc_arena
Arena内存分配器, TypedArena分配只能存储某个类型的内存. Arena分配可以存储任意类型的内存, 需要调用者手动管理内存;
librustc_serialize
- serialize:
Encoder/Decoder/Decodable/Encodabletrait序列化/分序列化协议; - json:
Json;
librustc_span
源文件描述和相关帮助函数, 几个关键数据结构如下:
-
SourceFile源文件相关信息的描述, 如: 源文件所在的crate, 所使用的外部crate, 源代码, 文件名等等; -
Span/SpanData: 表示代码片段的位置; -
SourceMapFiles/SourceMap: 源文件集, 文件加载器等等; -
Symbol: 内部使用的字符串缓存; -
kw: 关键字Symbol; -
Ident: 标识符Symbol; -
caching_source_map_view:
librustc_data_structures
- atomic_ref:
AtomicRef原子引用; - base_n:
push_str/encode将无符号整数转为base_64字符串(这里的BASE_64编码集是该crate自定义的, 非常用的BASE_STD/BASE_URL编码集); - box_region:
PinnedGenerator处理自引用数据; - captures:
Capturetrait用于标识需要捕获的对象的生命周期; - const_cstr:
const_str!给字符串加上\0C字符串终止符; - fingerprint:
Fingerprint哈希指纹; - flock:
Lock文件锁; - frozen:
Frozen对象不可被修改; - map_in_place:
MapInPlacetrait, Vec实现了该trait(T->U, 去掉了一些安全性检查); - profiling: 编译器self-profiling;
- sip128:
SipHasher128128位SIP哈希器; - small_c_str:
SmallCStr短C字符串, 小于37个字符的在栈上, 否则在堆上; - sorted_map:
SortedMapMap数据结构, 底层实现Vec<(K,V)>, 增删查时间复杂度O(log(n)).SortedIndexMultiMap; - stable_hasher:
StableHasher包装器, 对外提供一个稳定的哈希器接口(当前是对SipHasher128的封装); - stable_map:
StableMap对外提供一个稳定的HashMap接口(当前是对FxHashMap的封装); - stable_set:
StableSet对外提供一个稳定的HashSet接口(当前是对FxHashSet的封装); - stack: 定义了一些栈相关的常量, 栈最小大小100KB, 递归栈大小按指数增长(2^n * 1MB);
- svh:
Svh哈希值, 用于增量编译比较crate编译的源是否相同; - sync:
Lrc/Lock/RwLock/MTLock/MtRef一些锁封装, 配置了parallel_compiler则是使用parking_lot中的锁, 否则使用的是std::cell中的相关容器; - thin_vec:
ThinVec底层是Option<Box<Vec<T>>>, 0大小的数组不分配堆内存; - tiny_list:
TinyList底层是Option<Element<T>>, 1个元素的链表不分配堆内存; - transitive_relation:
TransitiveRelation传递关系; - work_queue:
WorkQueue底层VecDeque<T>, 只不过T约束了Index, 入队操作会检查索引是否已存在; - graph:
DirectedGraph/WithNumNodes/WithnumEdges/WithSuccssors/WithPredecessors/WithStartNodetrait约定有向图实现结构, 不同的图实现VecGraph/Sccs/Graph; - obligation_forest:
ObligationForest职责森林实现, 用于加速编译速度;
librustc_index
BitSet/BitMatrix/SparseBitSet/SparseBitMatrix/GrowableBitSet/位数组和位矩阵;
librustc_graphviz
生成DOT文件, 用于Graphviz可视化显示;
Labeller定义了获取图形节点的属性的协议(如节点id/label/style等等),GraphWalk定义了流程图上节点关系,render渲染生成.dot文件;
librustc_driver
Rust编译器入口
librustc_interface
rustc编译器作为一个库, 封装给使用者的同一接口;
- interface:
run_compiler: 调用编译器进行编译的入口函数;Compiler: 编译器会话实例;Config: 编译器参数配置实例, 传给run_compiler创建Compiler会话实例;
- queries:
Queries: 用于实现编译器Demand-Driven的编译;
librustc_lexer
词法分析器;
first_token/strip_shebang: 词法解析的入口函数
tokenize: 生成Token的迭代器, 主要数据结构:Token/TokenKind/LiteralKind;
librustc_macros
宏展开器;
librustc_ast
抽象语法树定义;
- token: 编译器内部使用的
Token定义; - tokenstream:
TokenTree:Token树;TokenStream:TokenTree序列;
- ptr:
P: 用于AST中的智能指针, 是Box的封装. 该智能指针不能获得*mut T指针修改其指向的内容, 其Deref/DerefMut实现返回的是指针的借用(&ptr/ &mut ptr,Box是的解引用返回的是指针指向实例的借用);
- visit:
Visitor: 遍历AST的trait接口定义;
- mut_visit:
MutVisitor: 遍历AST的trait接口定义;
- parser:
AssocOp/ExprPrecedence: 定义了二元运算符和表达式的优先级;
- util/comments:
CommentStyle: 定义了注释风格;Comment: 描述了注释的内容/风格/位置等;
- ast:
Label: 标签;LifeTime: 实例对象的生命周期;PathSegment/Path: 某个类型/常量/模块的路径, 如std::option::Option;GenericArgs/AngleBracketedArgs/ParenthesizedArgs/GenericArg/GenericParam/WhereClause/Generics: 泛型相关;Pat/PatKind/FieldPat: 模式匹配相关;StmtKind/Local/Field/Block/ExprKind/Expr: 语句表达式相关;Item/ItemKind: AST元素;
librustc_ast_pretty
抽象语法树格式化输出
librustc_ast_passes
对抽象语法树进行一些语法验证;
librustc_ast_lowering
AST转为HIR;
lower_crate/LoweringContext:
librustc_hir
HIR
librustc_middle/librustc_mir
MIR
librustc_codegen_ssa
提供MIR转为二进制的统一的抽象接口;
librustc_codegen_llvm
MIR转为二进制, 后端为LLVM;
浙公网安备 33010602011771号