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
(實現了AllocRef
trait), 及內存分配相關的函數alloc/realloc/dealloc/alloc_zeroed
的實現(他們是對libcore庫中的內存分配函數的封裝); - boxed:
Box
(指向堆內存的智能指針, 類似C++中的unique_ptr
)的實現; - borrow:
ToOwned
trait實現, 實現ToOwned
的對象可以從實現了Borrow
的對象中拷貝內容(Clone
trait僅負責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:
String
UTF-8字符串的實現(String底層是Vec
); - sync:
Arc
基於引用計數的線程間安全的智能指針實現, 類似於C++中的atomic<shared_ptr>
.Weak
非所有權引用的智能指針實現. 兩者底層是ArcInner
; - task:
Wake
trait實現; - vec:
Vec
數組的實現(底層是RawVec
); - collections: 集合容器的實現;
- btree: B樹數據結構的實現;
- map:
BTreeMap
基於B樹的鍵值map實現; - node: B樹根節點
Root
, 樹葉子LeafNode
等相關的實現; - search: 根據指定鍵值搜索的相關函數;
- set:
BTreeSet
set實現(底層是BTreeMap
);
- map:
- binary_heap:
BinaryHeap
二叉堆的實現(底層是Vec
); - linked_list:
LinkedList
雙向鏈表實現; - vec_deque:
VecDeque
雙向隊列實現(底層是RawVec
);
- btree: B樹數據結構的實現;
libcore
Rust核心庫, Rust語言特性相關的實現在此中;
- any:
Any
trait實現; - ascii:
EscapeDefault/escape_default
ASCII字符集相關的特化操作; - bool:
bool
類型的實現(非基礎語言層面的實現, 提供一些額外的輔助功能); - borrow:
Borrow
trait的實現, 注意和AsRef
的區別; - cell:
Cell
內部可變性實現(interior mutability), 即不可變的實例可以被覆寫(屏蔽編譯器對immutable實例不可修改的限制, 該語義的實現是底層的UnsafeCell
).RefCell
屏蔽編譯器的borrow規則, 只進行動態期的borrow規則檢查, 底層是UnsafeCell
; - clone:
Clone
trait實現; - cmp:
PartialEq/PartialOrd/Eq/Ord/Ordering
比較相關的trait; - default:
Default
trait; - 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:
GlobalAlloc
trait, 內存分配器需實現的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運算;Hasher
trait約定哈希器的接口實現;BuildHasher
約定哈希器的實例的創建接口;- sip:
SipHasher13
siphash算法實現(雖然deprecated狀態, 但還是當前內部使用的默認的哈希器);
- future: 異步語義實現;
Future
異步計算接口約定trait;
- fmt: 字符串格式化相關;
Binary/Debug/Octal
等約定不同格式化說明符時的輸出行為;- float: 浮點數的格式化輸出實現;
- num: 整數的格式化輸出實現;
- rt/v1: 格式化輸出的細節定義, 如對齊/填充等等;
libstd
libstd暴露的接口是對一些通用功能的抽象, 但是這些功能的細節實現通常依賴於具體的操作系統. 本節僅描述在libstd中定義實現的(非從libcore/liballoc
中導入到該libstd的功能)功能接口, 對於具體的細節實現在后續的源碼閱讀中;
- alloc:
System
由操作系統提供的默認內存分配器, 實現了AllocRef/GlobalAlloc
trait; - 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:
MetadataExt
trait特定平台下的文件元數據擴展信息; - 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上面封裝的一層, 不再贅述;
編譯過程
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/Encodable
trait序列化/分序列化協議; - 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:
Capture
trait用於標識需要捕獲的對象的生命周期; - const_cstr:
const_str!
給字符串加上\0
C字符串終止符; - fingerprint:
Fingerprint
哈希指紋; - flock:
Lock
文件鎖; - frozen:
Frozen
對象不可被修改; - map_in_place:
MapInPlace
trait, Vec實現了該trait(T->U, 去掉了一些安全性檢查); - profiling: 編譯器self-profiling;
- sip128:
SipHasher128
128位SIP哈希器; - small_c_str:
SmallCStr
短C字符串, 小於37個字符的在棧上, 否則在堆上; - sorted_map:
SortedMap
Map數據結構, 底層實現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/WithStartNode
trait約定有向圖實現結構, 不同的圖實現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;