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

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

时间: 2024-08-24 17:06:24

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

C语言的编译过程、安装gcc编译器以及设置环境变量

以我对C语言编译过程的了解,我用了一点时间画了一个图,提供给大家参考一下,希望有些能对您的问题提上帮助. 前几天刚初步学习了C语言的编译过程,感触挺深的.在C语言中头文件其实起了一个很大的作用. 1.头文件可以不需要编译 2.可以查看具体的声明 3.头文件加上实现文件的o文件提交给使用者即可 ,不需要知道源代码 4..o文件预先编译,所以整个项目编译时,会大大提高编译的时间 . 5.当一个文件(A.c文件)依赖于头文件(b.h)时 ,如果b.c编译之后形成的b.o文件重新编译后,a.o的文件不需

C语言程序编译过程

最近在编译DM8168的ARM端程序时经常出现未定义.重定义等报错,由于源码文件多,包含关系比较多,所以自己添加时容易乱.深深的体会到,好的代码风格是如此重要,之前也在看代码重构,以后应该更加注意代码的质量.经思考总结规律如下: 1.公用的数据结构等写为一个头文件,其他源文件包含此头文件.同时为了让不同源文件里的函数都可以使用,公用的函数可以放在此头文件中声明. 2.其他源文件里声明的变量,如果想在另一个文件里用,需要extern声明,这样可以避免各种全局变量的交互混杂. 理解的比较浅,希望高人

李洪强iOS开发之C语言程序编译过程

汇编语言 指令用特定的名字来标记,这就是汇编语言 人比较容易看懂汇编语言 汇编直接和程序一一对应的 有汇编器把程序翻译成机器码 把高级语言编译成计算机识别的语言 程序编译过程 命令行 UNIX 系统中自带了C语言的编译器,编译器的名字叫CC CC 的含义是C Compler Linux系统是一个开源的,它自带的C编译器叫GCC GCC 不仅可以编译C 还可以编译Python 和OC MAC OS 的编译器是苹果公司自己研发的 Clang 在用CC或者GCC 的命令的时候,本质是调用了clang

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

C语言的编译一般有三个步骤: 预编译: gcc -E -o a.e a.c 预编译a.c文件,生成的目标文件名为a.e 预编译就是将include包含的头文件内容替换到C文件中,同时删除代码中没用的注释 示例: //main.c #include <stdio.h> #include "sum.h" int main(){ int m = 6; int n = 5; int result = sum(m,n);  printf("hello\n%\n",

C语言的编译过程

预处理 gcc-E-o  a.i  001.c 编译: gcc-S-o  a.s a.i 汇编: gcc-c-o a.o a.s 链接: gcc-o a.o 跟查找头文件的目录 gcc -I 预处理的使用: #define 宏名  宏体 #define ABC 5+3 #define ABC(x) (5+(x)) #ifdef #else #endif gcc -DABC - o    --> #define ABC include<stdio.h> int main() { #ifde

C语言的编译

C语言的编译 一.gcc的编译参数 gcc -o a a.c 二.C语言的编译过程: 预编译(.c文件)-->编译-->链接(可执行程序) 1)预编译:gcc -E -o a.c a.c 将#include包含的头文件替换成具体代码(也可自定义头文件,<头文件> "头文件"),同时将没有的代码(包括注释)删除 2)编译:C语言-->汇编语言 gcc -S -o a.s a.c 将代码编译成二进制文件gcc -c -o a a.c 3)链接:gcc没有任何参

C语言学习笔记---001C语言的介绍,编译过程原理,工具等

技术qq交流群:Dream:251572072 ----------------------------------------------------------------------- a.C语言的历史 起源 标准化 b.基于c的语言 编程语言都借鉴了c语言的特性 c++语言:包含所有c语言特性,增加了类和其他的特性支持面向对象编程 java:基于C++的,包含了一些c的特性 C#:是由java和c++发展起来的 Perl:脚本语言 c.c语言特性: c语言是一种底层语言,为了适应系统编程

C语言编译过程简介

刚开始接触编程的时候,只知道照书敲敲代码,一直都不知道为什么在windows平台下代码经过鼠标那样点击几下,程序的结果就会在那个黑色的屏幕上.现在找了个机会将C语言的编译原理做一下小小的总结,这样也能为以后我们进军linux编程做一些准备工作,现在这里和大家一起分享分享.O(∩_∩)O~ 讲到编译原理,我觉得首先我们得明白一些基本概念. 编辑器:我们编写代码的一些窗口,如:记事本.word.notepad 等. 编译器:检查用户代码的一些语法错误并且将其编译成汇编代码. 汇编器:将编译出来的文件

C语言link过程详解(多文件编译过程)

原文摘自:http://www.cppblog.com/shifan3/archive/2007/01/05/17325.html详解link有些人写C/C++(以下假定为C++)程序,对unresolved external link或者duplicated external simbol的错误信息不知所措(因为这样的错误信息不能定位到某一行).或者对语言的一些部分不知道为什么要(或者不要)这样那样设计.了解本文之后,或许会有一些答案.首先看看我们是如何写一个程序的.如果你在使用某种IDE(V