标签:系统 native 操作系统 class inner 文件 就是 load window
ILBC 规范:
加载程序集:
ILBC 程序集 有 2 种,
1 Byte Code 程序集, 扩展名 为 .ilb, 表示 “ILBC Byte Code” 。
2 Native Code 程序集, 扩展名 遵循 操作系统 定义的 动态链接库 规范, 比如 Windows 上就是 .dll 文件,
Native Code 程序集 就是 操作系统 定义的 动态链接库 。
假设 操作系统 是 Windows, 程序集 名字 是 A, 加载 A 的 过程 是:
在 当前目录 下 先查找 A.ilb, 若存在 则 JIT 编译 A.ilb 为 本地代码 A.dll, 加载 A.dll,
若找不到 A.ilb, 则找 A.dll, 若存在 则 加载 A.dll 。
加载 本地库 A.dll 的 方式 遵循 操作系统 定义的 动态链接 规范 。
JIT 编译 A.ilb 为 本地代码 并 加载 的 过程 可以在 内存中 完成, 不一定要 生成 文件 A.dll (如果 技术上 可以实现 在 内存 中加载的话)。
高级语言(D#) 编译 的 过程:
高级语言(D#) 编译 有 2 种方式,
1 AOT, 高级语言(D#) 编译器 先根据 高级语言(D#) 源代码 生成 C 语言 中间代码, 再由 InnerC (InnerC to Byte Code) 编译为表达式树, 再由 InnerC(Byte Code to Native Code) 把 表达式树 生成为 Native Code 。 Native Code 是一个 本地库, 比如 .dll 。
2 JIT , 高级语言(D#) 编译器 先根据 高级语言(D#) 源代码 生成 C 语言 中间代码, 再由 InnerC (InnerC to Byte Code) 编译为表达式树, 把 表达式树 序列化 得到 Byte Code, 将 Byte Code 保存为 ilb 文件 即 得到 Byte Code 程序集(.ilb) 。
.ilb 在 运行的时候 由 ILBC 运行时 的 InnerC (Byte Code to Native Code) 把 Byte Code 反序列化 为 表达式树, 再把 表达式树 编译为 Native Code 。
链接程序集:
ILBC 的 链接 是 类似 .Net / C# 的 动态链接,
ILBC 的 链接 以 程序集 为 单位, 采用 延迟加载(Lazy Load) 的方式, 只有用到 程序集 的时候才加载, “用到” 是指 第一次 用到 程序集 里的 类(Class) 。
将 程序集 加载 到 应用程序 以后, 对 程序集 里的 类(Class) 也采用 延迟加载(Lazy Load) 的方式,
第一次 用到 类 的 时候才会 进行 类 的 链接工作,
假设 有 2 个程序集 A 、B,
类 的 链接 工作 完成后,
标签:系统 native 操作系统 class inner 文件 就是 load window
原文地址:https://www.cnblogs.com/KSongKing/p/10354824.html