.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需要被即时编译器重新编译。

最新文章

  1. 微博mid和id转换
  2. Java并发编程:Synchronized及其实现原理
  3. 我想有个梦想(I want have a dream)
  4. ios 画圆环进度条
  5. 【MongoDb--初入江湖】windows下安装MongoDb
  6. 500 OOPS: vsftpd: refusing to run with writable root inside chroot()解决方法
  7. 机器学习——KMeans
  8. 18.22 sprintf函数功能
  9. windows下mongodb基础玩法系列二CURD附加一
  10. 查看docker容器日志
  11. makefile高级应用
  12. 一个简单的JavaScript实例
  13. 华中农业大学预赛 B Handing Out Candies 余数的和
  14. 利用JS验证查询参数-选择月份后必须选择年份
  15. java未来发展方向!新手入门了解
  16. json再理解
  17. 适用于所有页面的基础样式base.css
  18. mysql 处理日期格式
  19. [RK3288][Android6.0] USB OTG模式及切换【转】
  20. High Performance Browser Networking

热门文章

  1. javascript 和 下拉列表
  2. MySQL 命令总结
  3. html ie
  4. python--return小练习
  5. siege压力测试工具安装和介绍
  6. 扩展中国剩余定理 (exCRT) 的证明与练习
  7. 20165319 《JAVA程序设计》第一周学习总结
  8. java读写excel文件( POI解析Excel)
  9. 2200: [Usaco2011 Jan]道路和航线 (拓扑排序+dijstra)
  10. linux进阶命令第一天