编译过程
来源:互联网 发布:广州恒大淘宝股价 编辑:程序博客网 时间: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
- 编译器把源代码编译成中间语言代码(即MSIL ,也俗称托管代码),这是一组独立于CPU的指令集,可以有效地转换为本机代码。
- MSIL包括包括用于加载、存储、初始化和调用对象的方法的指令,以及用于算术和逻辑操作、控制流程,直接内存访问,异常处理和其他操作的指令
- 公用语言运行时为其支持的每个计算机体系结构提供一个或者多个JIT编译器,使得在任何支持的体系结构上对同一组MSIL进行JIT编译和运行 。
- 编译器不只生成MSIL时,还会生成元数据。元数据描述代码中的类型,包括每种类型的定义、每种类型成员的签名,代码引用的成员以及运行时在执行时使用的其他数据。
- MSIL和元数据包含在基于并扩展了历史上用于可执行内容的已发布的Microsoft PE 和通用对象文件格式(COFF)的便携式可执行文件(PE)文件里。该文件格式适用于MSIL或本机代码以及元数据,使操作系统能够识别公共语言运行时映像(PS:识别什么映像并不理解)。
- 在上面的PE文件里的元数据和MSIL足以使您的代码描述自身,这意味着不需要类型库或接口定义语言,运行时根据需要即可在文件中定位和提取元数据。
Compiling MSIL to native code
在运行MSIL之前,公共语言运行时把它编译为目标机器体系结构的本机代码。.Net Framework提供了两种执行此转换的方法分别是.Net Framework JIT编译器和 .Net Framework Ngen.exe
Compilation by the JIT Compiler
- 当程序集的内容被加载和执行时,JIT编译将在应用程序运行时将MSIL转换为本机代码。 由于公共语言运行时为每个受支持的CPU架构提供了一个JIT编译器,所以开发人员可以构建一组可以在不同计算机上使用不同机器架构进行JIT编译和运行的MSIL程序集。 但是,如果您的托管代码调用特定于平台的本机API或特定于平台的类库,则只会在该操作系统上运行。
- JIT编译考虑到再执行期间可能永远不会调用某些代码的可能性,因此会在执行期间根据需要转换MSIL,然后将生成的本机代码存储在内存中,以便在该进程中的上下文中可以访问后续调用。
- 在JIT编译过程中(PS:此时还没有正式用到JIT编译器),加载和初始化类型时,加载器将在类型中为每个方法创建一个存根。存根将控制传递给JIT编译器,该编译器将该方法的MSIL转换为本机代码,并修改存根直接指向生成的本机代码。因此,对JIT编译方法的后续调用直接转到本地代码。
Install-Time Code Generation Using NGen.exe
- 由于在调用程序集定义的各个方法时,JIT编译器才将程序集的MSIL转换为本机代码,所以影响了性能。Anyway,大多数情况下,性能微微下降是可以接受的。只是,由JIT编译器生成的代码绑定到触发编译的进程不能共享。
- 为了允许生成的代码在应用程序的多个调用或共享一组程序集的多个进程共享,公共语言运行时支持提前编译模式。这个模式是通过使用Ngen.exe(本地映像生成器)将MSIL程序转换为本地代码,就想JIT编译器一样。
- Ngen.exe 操作与 JIT编译的操作有三种不同:
- 在运行应用程序执行之前,完成从MSIL到本机代码的转换。
- 一次编译整个程序集,而非一个编译一个方法。
- 生成的代码作为文件保留在磁盘上
Code Verification
- 作为本地代码编译的一部分,MSIL代码和元数据必须通过验证过程,除非管理员已经建立了允许绕过验证的安全策略。验证和检查MSIL和元数据,是为了确定代码是否类型安全,这意味只可以访问它已经授权访问的内存位置。
- 类型安全有助于隔离对象,免受无意或恶意的损害。
- 运行时依赖以下条件来验证是否安全
- 对类型的引用 和 引用的类型是否严格兼容
- 对对象只调用适当定义的操作
- 所声称的身份(PS:不太懂)
略、、、
Running code
略、、、(没看了)
阅读全文
0 0
- 编译过程
- 编译过程
- 编译过程
- 编译过程
- 编译过程
- 编译过程
- 编译过程
- 编译过程
- 编译过程
- 编译过程
- 编译过程
- 编译过程
- 编译过程
- 编译过程
- 编译过程
- 编译过程
- 编译过程
- 编译过程
- https://segmentfault.com/u/manxisuo这个node大神
- svn分支开发与主干合并(branch & merge)
- 分别用Java应用程序和Applet程序实现星星三角形图案的绘制
- java学习笔记-父与子的关系
- java中的多线程
- 编译过程
- 容斥
- 二分查找
- 可以让布局旋转的xml属性
- jersey服务调用python脚本并动态传参
- 面部识别辅助监控系统 人工智能为城市安全保驾护航
- 后台管理系统模板随意切换插件
- 15个常用的javaScript正则表达式
- HenCoder文章汇总