.NET语言的编译分为两个阶段.首先高级语言被编译成一种称作IL的中间语言,与高级语言相比,IL更像是机器语言,然而,IL却包含一些抽象概念(比如:类、异常),这也是这种语言被称为中间语言的原因。IL被打包在DLL或EXE文件中,而DLL和EXE在.NET中的主要区别就是:只有EXE可以直接被运行,而二者都可被某个正在执行的进程动态装载(后文详述)。由于机器的CPU只能执行本地汇编语言,而不是IL,进一步将IL编译成汇编语言的工作(也就是第二阶段)需要在运行时进行,这个过程由即时编译器(JIT)完成。 
高级语言在初次被编译时,编译器做两件事:首先把编译得到的IL存储在DLL或EXE中,然后为类的每个方法创建一个stub函数,此函数会调用即时编译器,并将自身的地址作为参数传给编译器。即时编译器则从DLL或EXE中获取相应的IL,编译成机器语言,并将内存中的原零时调用函数替换成机器语言。这个过程的思想,是用已编译的方法调用未编译的方法,实质上被调用的是stub函数;stub函数再调用编译器,将自身编译为本地机器语言;最后,.NET会重新调用该方法,方法此时才被真正地执行。函数被反复调用时,机器指令会被直接执行,而只由编译器对方法进行初次编译需要花费时间。至于那些没有被调用的方法,则不会被编译。 

当编译器生成一个EXE文件后, 该程序的入口函数为Main() 方法。装载器将这个EXE 文件载入,探测到该这是一个托管EXE,于是又载入 .NET运行时库文件(包括即时编译器), 接着调用了EXE 的Main() 方法。这将触发对Main()方法的即时编译, Main()方法在内存中被替换为本地机器语言,于是 .NET应用程序开始运行。在被编译为本地语言后,应用程序便可以自由调用本地代码了。当程序中止时,本地代码从内存中释放,所以在下次运行时,IL需要被即时编译器重新编译。

.NET语言的编译过程:中间语言(IL)和即时编译器(JIT)相关推荐

  1. -i 可以编译添加多个_C语言的编译过程

    大家对C语言的编译过程可能有个大致的理解,但是,详细到每一步具体都干了啥,可能有的人不是很清楚啦,也包括我,要不然,就不会做笔记了,哈哈... 0.主要步骤 ① 步骤 编写源程序(.c) → 预处理 ...

  2. c语言的编译过程,从文本到可执行文件

    从文本文件到可执行文件 以hello world举例. #include<stdio.h> int main(){printf("hello,world!\n");re ...

  3. C语言的编译过程常见的错误和警告

    C语言的编译过程: 一. C语言编译过程 C语言的编译过程可分为四个阶段: 1.预处理(Preprocessing) 对源程序中的伪指令(即以#开头的指令)和特殊符号进行处理的过程. 伪指令包括:1) ...

  4. c语言的编译过程详解

    c语言的编译过程详解 IDE的使用让很多和我一样的人对C/C++可执行程序的底层生成一知半解,不利于我们深入理解原理.在这里小结一下,望路过的大神指正~ 前言:从一个源文件(.c文件)到可执行程序到底 ...

  5. C 设计语言编译生成的是中间语言IL,一、源代码-面向CLR的编译器-托管模块-(元数据IL代码)...

    本文脉络图如下: 1.CLR(Common Language Runtime)公共语言运行时简介 (1).公共语言运行时是一种可由多种编程语言一起使用的"运行时". (2).CLR ...

  6. 【C 语言】编译过程 分析 ( 预处理 | 编译 | 汇编 | 链接 | 宏定义 | 条件编译 | 编译器指示字 )

    相关文章链接 : 1.[嵌入式开发]C语言 指针数组 多维数组 2.[嵌入式开发]C语言 命令行参数 函数指针 gdb调试 3.[嵌入式开发]C语言 结构体相关 的 函数 指针 数组 4.[嵌入式开发 ...

  7. Linux上C语言程序编译过程详解

    点击蓝字 关注我们 因公众号更改推送规则,请点"在看"并加"星标"第一时间获取精彩技术分享 来源于网络,侵删 本文将介绍如何将高层的C/C++语言编写的程序转换 ...

  8. C语言程序编译过程 2

    C语言的编译链接过程要把我们编写的一个c程序(源代码)转换成可以在硬件上运行的程序(可执行代码),需要进行编译和链接.编译就是把文本形式源代码翻译为机器语言形式的目标文件的过程.链接是把目标文件.操作 ...

  9. c语言编译生成cpp,C语言的编译过程

    编译: 编译程序读取源程序(字符流),对之进行词法和语法的分析,将高级语言指令转换为功能等效的汇编代码,再由汇编程序转换为机器语言,并且按照操作系统对可执行文件格式的要求链接生成可执行程序. 流程:C ...

最新文章

  1. 常用排序算法对比(时间复杂度、稳定性)
  2. SpringBoot + Vue + nginx项目一起部署
  3. 搞定系统设计 00:开篇
  4. 高程图 GridMap
  5. mac 上使用docker
  6. MyBatis出现红色错误,已解决(Establishing SSL connection without)
  7. C++11 新关键字
  8. 【Luogu1631】序列合并(优先队列)
  9. 从认知语言学的角度来看计算机没有,从认知语言学的角度来看「ところ」
  10. 竞选计算机协会网络部部长,计算机协会部长竞选演讲稿
  11. Beini FeedingBottle[小巧的无线密码破解系统]
  12. 幅频特性和相频特性的物理意义
  13. matlab幅度调制滚动条的程序_利用MATLAB实现信号的幅度调制与解调
  14. Linux查看增量文件,Linux 利用 rsync 命令提取增量文件
  15. java程序员必备---2020年idea官方最新版ideaIU-2020.1.1.exe
  16. oracle数据库生成流水号,oracle 中生成流水号 步骤
  17. python中snip_Snip滚动截屏_腾讯Snip For Mac官方下载-华军软件园
  18. 蓝阔无线打印服务器怎么连接5g,TP-Link TL-WDR7500路由器5G无线WDS桥接设置
  19. quartus驱动无法识别分析
  20. python 列表嵌套 元素全部相同

热门文章

  1. OpenCV微笑探测器smile detector的实例(附完整代码)
  2. Qt Quick中的The Visual Canvas
  3. malloc分配内存的原理?
  4. c++如何定义一个只能在堆上(栈上)生成对象的类?
  5. QT的QDesignerCustomWidgetInterface类的使用
  6. c++状态模式state
  7. 经典C语言程序100例之八二
  8. mysql导入存储过程报错_mysql导入建立存储过程或函数报错This function has none of DETERMINISTIC, NO SQL解决办法...
  9. python包裹 函数_什么是最干净的方法调用一个Python函数从C++与一个Sigg包裹的Obj....
  10. excel平均值公式_投资组合Normal VaR的具体计算方法(Excel版)