1. 程式人生 > 實用技巧 >Rust原始碼組織結構

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;

參考資料