ILBC 规范

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,  

类 的 链接 工作 完成后,  

猜你喜欢

转载自www.cnblogs.com/KSongKing/p/10354824.html