Rust源码组织结构

Rust源码组织结构


liballoc

内存分配库, 标准库中涉及到堆内存分配相关的代码在此;

  • alloc: 全局内存分配器Global(实现了AllocReftrait), 及内存分配相关的函数alloc/realloc/dealloc/alloc_zeroed的实现(他们是对libcore库中的内存分配函数的封装);
  • boxed: Box(指向堆内存的智能指针, 类似C++中的unique_ptr)的实现;
  • borrow: ToOwned trait实现, 实现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);
    • binary_heap: BinaryHeap二叉堆的实现(底层是Vec);
    • linked_list: LinkedList双向链表实现;
    • vec_deque: VecDeque双向队列实现(底层是RawVec);

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大小的内存区域)分配相关接口数据接口;
  • 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等内存操作相关函数封装;
  • pin: Pin指针;
  • slice: 切片操作相关辅助功能;
    • memchr: memchr/memrchr在切片中查找子片;
    • rotate: ptr_rotate切片旋转操作(为啥要实现这么复杂?);
    • sort: 插入排序, 堆排序, pattern-defeating快排实现;
  • unicode: Unicode编解码相关;
  • task: 异步任务相关;
    • wake: RawWaker/RawWakerVTable异步任务唤醒行为约定, Context异步任务的上下文描述;
    • poll: Pool异步任务状态;
  • sync: 同步相关;
    • atomic: 原子类型和内存顺序相关;
  • str: 字符串切片相关(迭代器/有损UTF-8字符串/模式匹配);
  • arith: 算术操作符重载traitAdd/Sub/Mul/Div/Rem/BitAnd/BitOr/BitXor/Shl/Shr, 及诸如+=形式操作符的重载traitAddAssign/...;
  • bit: 一元操作符重载traitNot/Neg;
  • deref: 解引用重载traitDeref/DerefMut;
  • drop: 实例对象的析构traitDrop;
  • function: 函数调用traitFnMut/Fn/FnOnce;
  • generator: 异步生成器traitGenerator;
  • index: 索引重载traitIndex/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用于枚举实例类型的判定;
  • iter: 迭代器语义实现;
    • 迭代器协议traitIterator, 其它常用的迭代操作的迭代器类型, 如reverse->Rev/filter->Filter等;
  • 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: HashSetHashMap实现;
  • 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等等);
    • redox,vxworks等等系统性类似, 不在赘述.;
  • 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/同步相关的系统函数;
      • 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;
    • unix: 类unix平台下就很熟悉了, 基本调用的都是POSIX接口, 不再赘述;
  • 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;

参考资料

posted @ 2020-08-09 18:28  mengsuenyan  阅读(1482)  评论(1编辑  收藏  举报