.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. C语言的编译过程、安装gcc编译器以及设置环境变量

    以我对C语言编译过程的了解,我用了一点时间画了一个图,提供给大家参考一下,希望有些能对您的问题提上帮助. 前几天刚初步学习了C语言的编译过程,感触挺深的.在C语言中头文件其实起了一个很大的作用. 1. ...

  2. 李洪强漫谈iOS开发[C语言-004]-开发概述程序设计语言程序编译过程

    汇编语言 指令用特定的名字来标记,这就是汇编语言 人比较容易看懂汇编语言 汇编直接和程序一一对应的 有汇编器把程序翻译成机器码 把高级语言编译成计算机识别的语言 程序编译过程 命令行 UNIX 系统中 ...

  3. 我学C的那些年[ch01]:浅淡C语言的编译过程

    前几天大致学习了C语言的编译过程,那么今天就和大家分享一下 首先,编译C语言,需要一个文本编辑器(windows自带的也行),和一个MinGW编译器(需要配置环境),就可以将.c文件编译成.exe文件 ...

  4. c语言的编译过程和GCC 编译参数

    原文: http://www.cnblogs.com/zhangShanGui/p/4912135.html C语言的编译过程和GCC编译参数 C语言的编译一般有三个步骤: 预编译: gcc -E - ...

  5. 4、C语言的编译过程链

    在学校学C语言的时候,很多人都不是很注重编译过程链,但是其实编译过程是项目过程中很重要的一部分,有时候有些语法诸如static.volatile等关键词不理解时大多数都是对整个C语言编译链没有进行过详 ...

  6. C语言的编译过程和GCC编译参数

    C语言的编译一般有三个步骤: 预编译: gcc -E -o a.e a.c 预编译a.c文件,生成的目标文件名为a.e 预编译就是将include包含的头文件内容替换到C文件中,同时删除代码中没用的注 ...

  7. C语言的编译过程

  8. C语言编译过程详解

    前言 C语言程序从源代码到二进制行程序都经历了那些过程?本文以Linux下C语言的编译过程为例,讲解C语言程序的编译过程. 编写hello world C程序: // hello.c #include ...

  9. C语言基础(21)-C语言编译过程及GCC参数简介

    任何C语言的编译过程可分为以下三部分: 一.预编译 在C语言中,以#开头的语句又叫预编译指令.预编译主要做以下两件事情: 1.将#include包含的头文件做简单的文本替换: 2.将代码中的注释删除. ...

随机推荐

  1. Jhipster Registry(Eureka Server) Docker双向联通与高可用部署

    使用Compose来编排这个Eureka Server集群: peer1配置: server: port: 8761 eureka: instance: hostname: eureka-peer-1 ...

  2. HTTP.sys远程执行代码漏洞

    远程执行代码漏洞存在于 HTTP 协议堆栈 (HTTP.sys) 中,当 HTTP.sys 未正确分析经特殊设计的 HTTP 请求时会导致此漏洞. http://bbs.safedog.cn/thre ...

  3. redis中实现redis-cli任意目录执行

  4. jQuery懒加载插件 – jquery.lazyload.js简单调用

    Lazy Load 是一个用 JavaScript 编写的 jQuery 插件. 它可以延迟加载长页面中的图片. 在浏览器可视区域外的图片不会被载入, 直到用户将页面滚动到它们所在的位置. 这与图片预 ...

  5. 查看当前的app运行的是哪个Activity

    1.确认手机连接了adb-->检查方式:adb devices 2.手机运行任意app,随意进入一个页面 3.此时cmd运行:adb shell "dumpsys window | g ...

  6. SSM整合——完全版

    1, 2, 3, 4,项目建立好后: 覆盖pom.xml,地址在:https://blog.csdn.net/mark_lirenhe/article/details/80875266 alt+F5= ...

  7. CentOS 7 休眠系统

    CentOS 7的电源按钮只有关机和重启两项,但是可以用命令来休眠系统: 重启: $ systemctl reboot 退出系统并停止电源: $ systemctl poweroff 待机: $ sy ...

  8. html5手势操作与多指操作封装与Canvas图片裁切实战

    当前情况,移动端的开发占比越来越高,单指的拖拽触碰等操作是常规需要.特殊的多指操作与手势操作还需另做处理,而且还涉及到兼容性问题. // 屏幕上存在两根或两根以上的手指 时触发 仅IOS存在手势事件, ...

  9. Java8中的 lambda 和Stream API

    前言 ​ 由于项目中用到了比较多有关于 Java8 中新的东西,一开始自己只是会写,但是写起来不太顺,然后就在网上找到了一个很好的关于Java8新特性的视频,所以就进行了学习了一下,以下是自己对 la ...

  10. Xamarin Essentials教程发送邮件Email

    Xamarin Essentials教程发送邮件Email   邮件是一种更为灵活的数据分享方式.它可以帮助用户将一个应用程序的数据分享给其他用户,而其他用户不需要安装特定的应用程序,就可以在任意时间 ...