编译过程

来源:互联网 发布:广州恒大淘宝股价 编辑:程序博客网 时间:2024/06/08 15:05

官网翻译:https://docs.microsoft.com/en-us/dotnet/standard/managed-execution-process
(PS:用的是谷歌在线翻译,有些直译不通顺的根据个人理解调整了一下,翻译到后面感觉内容越来越冗余,但还是收获很大的。)
看完官网的理论后,再看看这流程图,似乎感觉不再困惑。

Choosing a compiler
1. 要获得公共语言运行时的好处,首先必须使用一个或多个针对运行时的语言编译器

Compiling your code to MSIL
2. 编译器将源代码转换为MSIL(Microsoft中间语言),并生成所需的元数据

Compiling MSIL to native code
3. JIT编译器将MSIL转换为本机代码。编译期间,通过检查MSIL和元数据的验证过程,以确定呢代码是否可以被确定为类型安全。

Running code
4. 公共语言运行库提供基础设施和服务以运行本机代码

Choosing a compiler

  • .Net平台是一个多语言执行环境,所以运行时支持各种各样的数据类型和语言特性,您使用的语言编译器决定了哪些运行时的功能是可以用的,并且会使用这些功能来设计代码。
  • 在编写代码时,编译器就决定了我们必须使用的语法
  • 如果您的组件在以其他语言编写时,仍然完全可用。则组件的导出类型必须显示包含有语言独立和语言无关组件(CLS)的语言特性。PS:总觉得这段不太能理解、

Compiling your code to MSIL

  1. 编译器把源代码编译成中间语言代码(即MSIL ,也俗称托管代码),这是一组独立于CPU的指令集,可以有效地转换为本机代码。
  2. MSIL包括包括用于加载、存储、初始化和调用对象的方法的指令,以及用于算术和逻辑操作、控制流程,直接内存访问,异常处理和其他操作的指令
  3. 公用语言运行时为其支持的每个计算机体系结构提供一个或者多个JIT编译器,使得在任何支持的体系结构上对同一组MSIL进行JIT编译和运行
  4. 编译器不只生成MSIL时,还会生成元数据。元数据描述代码中的类型,包括每种类型的定义、每种类型成员的签名,代码引用的成员以及运行时在执行时使用的其他数据。
  5. MSIL和元数据包含在基于并扩展了历史上用于可执行内容的已发布的Microsoft PE 和通用对象文件格式(COFF)便携式可执行文件(PE)文件里。该文件格式适用于MSIL或本机代码以及元数据,使操作系统能够识别公共语言运行时映像(PS:识别什么映像并不理解)。
  6. 在上面的PE文件里的元数据和MSIL足以使您的代码描述自身,这意味着不需要类型库或接口定义语言,运行时根据需要即可在文件中定位和提取元数据。

Compiling MSIL to native code

在运行MSIL之前,公共语言运行时把它编译为目标机器体系结构的本机代码。.Net Framework提供了两种执行此转换的方法分别是.Net Framework JIT编译器和 .Net Framework Ngen.exe

Compilation by the JIT Compiler

  1. 当程序集的内容被加载和执行时,JIT编译将在应用程序运行时将MSIL转换为本机代码。 由于公共语言运行时为每个受支持的CPU架构提供了一个JIT编译器,所以开发人员可以构建一组可以在不同计算机上使用不同机器架构进行JIT编译和运行的MSIL程序集。 但是,如果您的托管代码调用特定于平台的本机API或特定于平台的类库,则只会在该操作系统上运行。
  2. JIT编译考虑到再执行期间可能永远不会调用某些代码的可能性,因此会在执行期间根据需要转换MSIL,然后将生成的本机代码存储在内存中,以便在该进程中的上下文中可以访问后续调用。
  3. 在JIT编译过程中(PS:此时还没有正式用到JIT编译器),加载和初始化类型时,加载器将在类型中为每个方法创建一个存根。存根将控制传递给JIT编译器,该编译器将该方法的MSIL转换为本机代码,并修改存根直接指向生成的本机代码。因此,对JIT编译方法的后续调用直接转到本地代码。

Install-Time Code Generation Using NGen.exe

  1. 由于在调用程序集定义的各个方法时,JIT编译器才将程序集的MSIL转换为本机代码,所以影响了性能。Anyway,大多数情况下,性能微微下降是可以接受的。只是,由JIT编译器生成的代码绑定到触发编译的进程不能共享。
  2. 为了允许生成的代码在应用程序的多个调用或共享一组程序集的多个进程共享,公共语言运行时支持提前编译模式。这个模式是通过使用Ngen.exe(本地映像生成器)将MSIL程序转换为本地代码,就想JIT编译器一样。
  3. Ngen.exe 操作与 JIT编译的操作有三种不同:
    • 在运行应用程序执行之前,完成从MSIL到本机代码的转换。
    • 一次编译整个程序集,而非一个编译一个方法。
    • 生成的代码作为文件保留在磁盘上

Code Verification

  1. 作为本地代码编译的一部分,MSIL代码和元数据必须通过验证过程,除非管理员已经建立了允许绕过验证的安全策略。验证和检查MSIL和元数据,是为了确定代码是否类型安全,这意味只可以访问它已经授权访问的内存位置。
  2. 类型安全有助于隔离对象,免受无意或恶意的损害。
  3. 运行时依赖以下条件来验证是否安全
    • 对类型的引用 和 引用的类型是否严格兼容
    • 对对象只调用适当定义的操作
    • 所声称的身份(PS:不太懂)

略、、、

Running code

略、、、(没看了)

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 药流一直不排出怎么办 宝宝脸过敏红了怎么办 小孩湿疹脸上都是红红的怎么办 眼周刺痛红红的怎么办 脸敷面膜刺痛红红的怎么办 脸上有凹凸不平的坑怎么办 宝宝脸上角质层薄有红血丝怎么办 红衣军到决赛圈怎么办 宝宝湿疹留下的黑印怎么办 出牙宝宝很烦躁怎么办 法斗嘴唇破了怎么办 狗嘴巴周围红了怎么办 脸上起红包还痒怎么办 睾丸胀痛有下坠感怎么办 英语不好又不会读怎么办 七个月宝宝手上长倒刺怎么办 字母纹身纹反了怎么办 花甲生的吃了怎么办 别人告我欠他钱怎么办 实习手册没有公司的印章怎么办? 家长管的太严怎么办 对于老公沉迷于股票怎么办 月经期吃了香瓜怎么办 月经漏到内裤上怎么办 上班没时间养狗怎么办 宝宝呼吸道感染反复发烧怎么办 熬夜后头晕想吐怎么办 生气后全身无力酸痛怎么办? 久坐导致的腰疼怎么办 削土豆手变黑了怎么办 熬夜后头痛眼痛怎么办 孩子毎天通宵游戏怎么办 熬夜写作业困了怎么办 三十多岁白头发越来越多怎么办 AI界面字体太小怎么办 睡不着怎么办躺倒床上脑子混乱 作息规律不正常夜里睡不着怎么办 作息不规律引起身体痒怎么办 在大学里好无聊怎么办 开会时间通知错了怎么办 商场要求商户变更位置怎么办