假设您使用 C#、VB 或任何 .NET 编写应用程序
当你点击构建时,它真的会编译你的代码吗?我是这么认为的,直到我开始在我的一些程序集上使用 redgates 反射器并逐字查看我的代码。我本来期望展开循环并进行大量优化,但什么也没有。
那么编译实际上什么时候发生呢?我认为当它被构建时,代码变成IL(中间语言)并且当执行发生时,它被加载到CLR中?它是否仅在 CLR 期间进行优化,而从不在构建时进行优化?
当你在VS中编译时
- 您的源代码被编译为称为通用中间语言 (CIL) 或 MSIL(Microsoft 中间语言)的字节代码。
- 来自每个类和每个方法(以及所有其他内容:O)的元数据都包含在生成的可执行文件(无论是 dll 还是 exe)的 PE 标头中。
- 如果您正在生成可执行文件,则 PE 标头还包含一个传统的引导程序,该引导程序负责在执行可执行文件时加载 CLR(公共语言运行时)。
当你执行:
- 引导程序初始化 CLR(主要通过加载 mscorlib 程序集)并指示它执行您的程序集。
- CLR 执行您的主条目。
- 现在,类有一个向量表,其中保存方法函数的地址,因此当您调用 MyMethod 时,会搜索该表,然后对该地址进行相应的调用。启动后,所有表的所有条目都有 JIT 编译器的地址。
- 当调用此类方法之一时,将调用 JIT 而不是实际方法并接管控制权。然后,JIT 将 CIL 代码编译为适当架构的实际汇编代码。
- 一旦代码被编译,JIT 就会进入方法向量表并用编译后的代码替换该地址,以便每个后续调用不再调用 JIT。
- 最后,JIT 处理编译代码的执行。
- 如果您调用另一个尚未编译的方法,则返回到 4...依此类推...
我也在这里发布答案,因为另一个问题与此无关......
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)