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;

參考資料


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM