Rust原始碼組織結構
Rust原始碼組織結構
目錄
liballoc
記憶體分配庫, 標準庫中涉及到堆記憶體分配相關的程式碼在此;
- alloc: 全域性記憶體分配器
Global
(實現了AllocRef
trait), 及記憶體分配相關的函式alloc/realloc/dealloc/alloc_zeroed
的實現(他們是對libcore庫中的記憶體分配函式的封裝); - boxed:
Box
(指向堆記憶體的智慧指標, 類似C++中的unique_ptr
)的實現; - borrow:
ToOwned
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上面封裝的一層, 不再贅述;
編譯過程
graph TD; RustSource -->|Parsing and Desugaring| HIR HIR -->|Type checking| MIR MIR -->|Borrow checking and Optimization| LLVM_IR LLVM_IR -->|Optimization| MachineCodelibrustc_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;