拓冰建站拓冰建站
首页 / 资讯中心 / 正文

.NET Runtime Mono 运行时源码术语表:从 AOT/JIT 到 SGEN 与 trampoline 的完整解读

语言运行时标准库JIT编译编译器【免费下载链接】runtime.NET is a cross-platform runtime for cloud, mobile, desktop, and IoT apps.项目地址https://gitcode.com/GitHub_Trending/runtime6/runtime点击查看免费下载导读在 .NET 运行时dotnet/runtime仓库中Mono 运行时的源码遍布src/mono/mono目录其中大量缩写术语AOT、EH、GC、JIT、Boehm、SGEN、SRE、trampoline、vt 等频繁出现在文件头注释、函数命名与代码评审中。本文以仓库中的 docs/design/mono/web/glossary.md 术语表为骨架逐一展开每个术语的定义、在源码中的真实落点与底层工作原理帮助读者在阅读 Mono 运行时源码时快速建立术语地图直接定位到对应实现文件。一、术语表在仓库中的位置与用途术语表文件位于 docs/design/mono/web/glossary.md它自身就开宗明义地说明其用途This is a glossary of terms/abbreviations used in the runtime source code即这是运行时源代码中使用的术语/缩写的速查表。它不是面向用户的功能文档而是为阅读 Mono 源码的开发者准备的解码器。全文共列出 9 个条目全部能在src/mono/mono下找到直接对应的源码文件或宏定义本文后续小节将逐一给出证据链。二、编译执行体系JIT、AOT 与 trampoline2.1 JIT — Just In Time Compiler即时编译器JIT 是 Mono 运行时最核心的执行引擎方法在首次被调用时由 JIT 将 CIL通用中间语言编译为当前宿主 CPU 的原生机器码之后直接执行机器码。Mono 的 JIT 编译器主要位于 src/mono/mono/mini 目录mini即 Mono 解释器/JIT 前端的统称。从源码结构看JIT 的入口与关键环节包括编译入口mono_jit_compile_method一类的函数在 mini-runtime.c、driver.c 等文件中被调用负责将方法体调度到 JIT 流水线IR 生成方法到中间表示IR的转换位于 method-to-ir.c可选 LLVM 后端Mono 还维护了一个基于 LLVM 的优化后端mini-llvm.c 的文件头注释直接将其描述为llvm Backend for the mono JIT用于把 IR 翻译成 LLVM IR 以获得更强的优化能力泛型共享针对泛型实例化的代码共享机制实现在 mini-generic-sharing.c。2.2 AOT — Ahead of Time Compiler预编译与 JIT 的运行时编译相对AOT 在部署/构建阶段就将方法预先编译为原生机器码。Mono 的 AOT 编译器实现在 src/mono/mono/mini/aot-compiler.c其文件头注释明确写道mono Ahead of Time compiler作者为 Dietmar Maurer、Zoltan Varga 等可追溯到 2002 年 Ximian 时代。AOT 的主要价值在于减少启动时 JIT 编译开销、降低内存占用、并支持在没有完整 JIT 的环境中如 iOS 等禁止动态代码生成的平台运行托管代码。AOT 编译产物在运行时由 aot-runtime.c 负责加载与查找这也解释了该文件中大量与 JIT 方法查找如mono_jit_info_table_find相关的实现。2.3 trampoline — 手工汇编实现的跳板函数术语表给出的定义非常精准A function implemented using hand written assembly code. It is usually called from JITted code.trampoline 是用纯手写汇编实现的函数通常被 JIT 生成的机器码调用。它在运行时中承担跳板/转接职责例如懒加载某个尚未 JIT 的方法、完成泛型共享代码的适配、或从托管代码过渡到运行时内部逻辑。仓库中每个受支持的 CPU 架构都有独立的 trampoline 实现文件位于 src/mono/mono/mini 下tramp-amd64.c文件头注释为 JIT trampoline code for amd64与 tramp-amd64-gsharedvt.ctramp-arm.c、tramp-arm64.c含各自的-gsharedvt泛型共享变体tramp-x86.c、tramp-ppc.c、tramp-riscv.c、tramp-s390x.c、tramp-wasm.c文件名中的gsharedvt表示 generic shared vtype泛型共享值类型场景专用的 trampoline负责在共享代码与具体值类型之间做参数布局适配——这正好与术语表末尾的vt/vtype术语相互呼应。三、内存管理三巨头GC、Boehm 与 SGEN3.1 GC — Garbage Collector垃圾回收器GC 是托管运行时的内存自动管理核心负责对象分配、存活标记与回收。在 Mono 中GC 是一个抽象层可以挂接不同的具体实现相关的内部接口定义在 src/mono/mono/metadata/gc-internals.h 与 src/mono/mono/metadata/gc_wrapper.h 中具体回收器实现在 src/mono/mono/sgen 目录下。3.2 Boehm — 保守式垃圾回收器Boehm 指的是Boehm-Demers-Weiser Conservative Garbage Collector一种以保守扫描著称的 GC它不要求对象头携带精确的类型/指针布局信息而是将栈和堆上看起来像指针的机器字都当作可能的引用处理因此非常适合与 C/C 代码混编、或作为托管运行时早期/简化的 GC 后端。仓库中的证据链如下src/mono/mono/metadata/boehm-gc.c 文件头注释GC implementation using either the installed or included Boehm GC——即它可以链接系统安装的 libgc也可以使用仓库内置的 libgcsrc/mono/mono/metadata/gc_wrapper.h 中以#ifdef HAVE_BOEHM_GC分支包裹对 libgc 头文件的引用并定义了GC_GCJ_SUPPORT等适配宏说明 Boehm 支持与否由构建配置config.h中的HAVE_BOEHM_GC决定此外 src/mono/mono/metadata/appdomain.c、src/mono/mono/metadata/domain-internals.h 等文件中也有 Boehm 相关的条件编译路径。需要说明的是在当前的 .NET 统一运行时中Mono 的默认/主要 GC 是 SGENBoehm 更多保留为历史兼容与特定场景下的可选后端。3.3 SGEN — Mono 自有的分代式垃圾回收器SGENSimple GENerational GC 的缩写是Mono 自己实现的分代垃圾回收器也是术语表中唯一标注自研的组件。其核心实现位于 src/mono/mono/sgen/sgen-gc.c文件头注释即Simple generational GC。从源码注释可以提炼出 SGEN 的关键设计约束分配必须返回清零内存文件头强调 allocation provides always zeroed memory, having to do a memset after allocation is deadly for performance——即内存天然清零事后 memset 会严重影响性能启动内存占用模型64 KB 固定pinned空间、64 KB 内部空间外加 nursery新生代大小并有对应的内存治理memory governor模块 sgen-memory-governor.c对 Mono 的最小假设2 词对象头首词为 vtable次词存转发指针、GC 描述符位于 vtable 第二词、8 字节对齐等见 sgen-gc.c 开头的编号列表模块划分清晰nursery 分配器sgen-nursery-allocator.c、标记-清除主堆sgen-marksweep.c、大对象空间sgen-los.c、卡片表sgen-cardtable.c、固定pinning机制sgen-pinning.c、并行工作线程sgen-workers.c等一应俱全。分代体现在新生代nursery与老年代的分层回收策略上配合sgen-minor-*、sgen-major-*系列文件如 sgen-minor-copy-object.h、sgen-major-copy-object.h实现复制式新生代回收与标记-清除式老年代回收。有趣的历史细节SGEN 的线程启动/停止逻辑改编自 Boehm GC见 sgen-gc.c 文件头对 Xerox、Silicon Graphics、Hewlett-Packard 等版权声明这正体现了术语表把 GC、Boehm、SGEN 三者并列的内在关联。四、EH — Exception Handling异常处理EH 是托管运行时实现try/catch/finally语义的机制。Mono 中异常处理的 JIT 相关实现位于 src/mono/mono/mini/mini-exceptions.c前面提到的 JIT 方法查找入口也出现在该文件中同时 src/mono/mono/metadata/exception.c 提供托管异常对象的构造与抛出辅助。异常处理需要运行时与 JIT 紧密协作JIT 为每个方法生成 EH 区域catch/finally/filter 子句的元数据运行时在异常抛出时根据这些区域执行栈展开stack unwinding并匹配处理器。阅读 mini-exceptions.c 可以看到运行时如何通过 JIT 信息表定位各方法内的 EH 子句。五、反射与类型系统SRE 与 vt/vtype5.1 SRE — System.Reflection.EmitSRE 是 .NET 中在运行时动态生成 IL 与程序集的反射 API。在运行时源码中SRE 的实现分布在 src/mono/mono/metadata 下与 reflection、method-builder、dynamic method 相关的文件中例如 method-builder-ilgen.c、method-builder-ilgen-internals.h 等*ilgen*命名即 IL generation 之意并被 boehm-gc.c 等文件包含引用。SRE 生成的动态方法最终同样会进入 JIT 编译管道执行因此它是连接反射层与 JIT 层的重要桥梁。使用场景包括表达式树编译、动态代理、序列化器生成等。5.2 vt / vtype — Valuetype值类型vt与vtype都是Valuetype值类型的缩写二者等价。值类型如int、struct、枚举与引用类型在 JIT 层有着截然不同的处理方式值类型的数据直接内联存放在栈或对象字段中不经过 GC 堆分配因此 JIT 需要为它们生成专门的复制、装箱boxing、参数传递逻辑。这也解释了为什么 Mono 的 trampoline 家族中存在专门的-gsharedvt变体如 tramp-amd64-gsharedvt.c——它们专门处理泛型共享代码 值类型这一组合下的参数布局与调用约定适配是vt概念在汇编层最典型的落点。六、术语速查总表缩写全称一句话定义仓库中的核心落点AOTAhead of Time Compiler预编译构建期将 IL 编译为原生机器码src/mono/mono/mini/aot-compiler.c、aot-runtime.cEHException Handling异常处理try/catch/finally 语义src/mono/mono/mini/mini-exceptions.cGCGarbage Collector垃圾回收器内存自动管理src/mono/mono/sgen、src/mono/mono/metadata/gc-internals.hJITJust In Time Compiler即时编译运行时将 IL 编译为机器码src/mono/mono/mini、method-to-ir.c、mini-llvm.cBoehmBoehm Conservative GC保守式垃圾回收器可作可选后端src/mono/mono/metadata/boehm-gc.c、gc_wrapper.h 中的HAVE_BOEHM_GCtrampoline—手写汇编实现的跳板函数通常被 JIT 代码调用tramp-amd64.c 及各架构tramp-*.cSGENSimple GENerational GCMono 自有的分代垃圾回收器sgen-gc.c 及整个 src/mono/mono/sgen 目录SRESystem.Reflection.Emit运行时动态生成 IL 与程序集的反射 APImethod-builder-ilgen.c 等*ilgen*文件vt / vtypeValuetype值类型两者等价tramp-*-gsharedvt.c 等泛型共享值类型适配实现七、如何基于本术语表继续深入 Mono 源码阅读 Mono 源码时可以按执行引擎 → 内存管理 → 元数据/反射三条主线推进执行引擎线从 mini-runtime.c 出发追踪方法如何经过 method-to-ir.c 生成 IR再被 JIT 后端含 mini-llvm.c 的 LLVM 后端翻译为机器码同时观察 trampoline 如何在其中承担延迟编译与泛型适配的角色内存管理线以 sgen-gc.c 为入口依次阅读 nursery 分配、标记-清除、卡片表与固定机制理解 SGEN 的分代模型如需对比保守式 GC可对照 boehm-gc.c反射与类型线从 method-builder-ilgen.c 理解 SRE 动态生成 IL 的机制再通过vt相关实现尤其-gsharedvttrampoline理解值类型在 JIT 层的特殊地位。掌握本术语表后上述源码中的文件头注释、函数命名如mono_jit_*、sgen_*、tramp_*与条件编译宏如HAVE_BOEHM_GC、MONO_ARCH_CODE_EXEC_ONLY都将变得可读可循这是深入 .NET 运行时 Mono 实现的第一步。赞分享语言运行时标准库JIT编译编译器【免费下载链接】runtime.NET is a cross-platform runtime for cloud, mobile, desktop, and IoT apps.项目地址https://gitcode.com/GitHub_Trending/runtime6/runtime点击查看免费下载相关推荐Mono AOTAhead-of-Time编译深入解析从 mono --aot 到 AOT 镜像的编译、链接与运行时加载原理Mono AOTAhead of Time编译深入解析从 mono aot 到 AOT 镜像的编译、链接与运行时加载原理 导读 本篇技术指南以 .NET语言运行时标准库JIT编译编译器.NET 运行时 WebAssembly AOT 代码生成技术解析Mono LLVM 后端与解释器协作方案.NET 运行时 WebAssembly AOT 代码生成技术解析Mono LLVM 后端与解释器协作方案 本文基于 .NET 运行时dotnet/runt语言运行时标准库JIT编译编译器.NET 运行时 Mono JIT 寄存器分配全解析从线性 IL 到机器码的关键一跃.NET 运行时 Mono JIT 寄存器分配全解析从线性 IL 到机器码的关键一跃 导读 寄存器分配Register Allocation是 JIT 编语言运行时标准库JIT编译编译器创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门