【IL】IL入门

1.IL基本介绍
1.1 CLR介绍
在介绍IL之前,先说一说CLR。CLR的全称Commen Language Runtime 公共语言运行时。因为CLR的存在,使得多语言开发成为可能。下面给出一张图片,解释支持CLR的几种语言的关系。

从上面的图片可以看出,CLR其实是不关心开发人员用哪一种语言写源代码。这意味着在选择编程语言时,应该选择最容易表达自己意图的语言。可用任何一种语言开发代码,只要编译器是面向CLR的就可以了。

Microsoft创建了好几种面向CLR的语言编辑器,包括:C/C++、C#、Visual Basic、F#、Iron Python、Iron Ruby、IL编辑器,当然面向CLR的语言绝不止Miscrosoft提供的这几种。

在上面的图片,有一点值得提出,IL编译器也是面向CLR的。虽然最终CLR会把托管模块中的IL代码编译成本机CPU指令,但是IL编译器本身也是面向CLR的,所以可以直接利用IL进行开发。查看 如何对C#程序进行反编译,获得更详细的内容。

1.2 IL介绍

在上面介绍CLR概念的时候,知道了IL也是面向CLR的,IL的全称是中间代码(intermediate code),也称为托管代码(managed code)。所有面向CLR的编译器,最终都会把相应的代码编译为托管模块。注意,高级语言通常只公开了CLR全部功能的一个子集,然而,IL汇编语言是允许开发人员访问CLR的全部功能的,例如:C++编译的托管模块,希望能够在C#程序中调用,但是C++和C#可能由于支持的功能不一样,在C#中有可能不会成功调用,反之,C#的程序可能在C++中也不会 成功调用,无论怎样IL是支持的,也就是说IL是能够全部访问所有CLR功能的。如果在开发中,遇到一种语言不能解决的问题,可以考虑使用另一种语言,或是使用IL语言。
2.IL案例讲解

在这里笔者使用C#作为源代码:

static void Main(string[] args)
{
            int num = 1;
            int num2 = 2;
            int num3 = 3;
            Console.WriteLine(num+num2+num3);
}

IL代码为:

//hidebysig指令表示如果当前类为父类,用该指令标记的方法将不会被子类继承
//cil managed表明方法体中的代码是IL代码,且是托管代码,即运行在CLR运行库上的代码
.method private hidebysig static void Main(string[] args)cil managed
{
    .entrypoint //该指令代表该函数程序的入口函数。每一个托管应用程序都有且只有一个入口函数,CLR加载程序时,首先从.entrypoint函数开始执行。
    .maxstack 2 //执行构造函数时,评估堆栈可容纳数据项的最大个数。评估堆栈是保存方法中所需要变量的值的一个内存区域,该区域在方法执行结束时会被清空,或者存储一个返回值。
    .locals init (
        [0] int32 num,
        [1] int32 num2,
        [2] int32 num3) //表示定义int类型的变量,变量名分别为num,num2,num3。存储在调用栈。
    L_0000: nop  //No operation的意思,即没有任何操作。
    L_0001: ldc.i4.1  //将“1”压入评估栈,此时“1”处于评估栈的栈顶。
    L_0002: stloc.0  //此指令表示把值从评估栈中弹出,并赋值给调用栈的第0个变量num。
    L_0003: ldc.i4.2
    L_0004: stloc.1
    L_0005: ldc.i4.3
    L_0006: stloc.2 //从.locals init到L_0006,相当于C#代码的为i,j,k赋值。
    L_0007: ldloc.0  //取调用栈中位置为0的元素压入评估栈(取i的值)。
    L_0008: ldloc.1  //取调用栈中位置为1的元素压入评估栈(取j的值)。
    L_0009: add  //做加法操作
    L_000a: ldloc.2 //取调用栈中位置为2的元素压入评估栈(取k的值)。
    L_000b: add  //做加法操作
    L_000c: call void [mscorlib]System.Console::WriteLine(int32) //调用输出方法
    L_0011: nop  //No Operation
    L_0012: call valuetype [mscorlib]System.ConsoleKeyInfo [mscorlib]System.Console::ReadKey() //调用ReadKey方法
    L_0017: pop //把评估栈的内容清空
    L_0018: ret  //return 标记返回值
} //Main方法结束

观察上面的IL代码,可以发现,汇编语言和高级语言的不一样之处,在汇编语言中,声明一个变量,首先要把变量名存储, 然后把值压入到栈堆中,最后把值弹出并且赋值给相应的变量。关于Il的指令详细,可以查看 IL指令详解。

原文地址:https://www.cnblogs.com/HDK2016/p/8605735.html

时间: 2024-10-11 09:07:19

【IL】IL入门的相关文章

IL接口和类的属性

上一篇文章学习了IL的入门,接下来我们再通过两个例子来了解下类的属性.构造函数以及接口的使用 一.类的属性.构造函数 1.先看下我们要构建的类的C#代码,然后再进行IL的实现,示例代码如下: [Serializable] public class Dynamic { public int _a = 0; public const string ConstField = "const"; /// <summary> /// 定义属性 /// </summary>

Python之路,第四篇:Python入门与基础5

python 循环语句 作用:  根据一定的条件,重复的执行一个或多个语句 两种循环语句: while 语句 for 语句 while 语句: 语法: while    真值表达式: 语句1 ... else: 语句2 ... 语法说明: else子句可以省略 执行顺序: (1) 先判断真值表达式是否为True (2)如果第1步为True,则执行语句1后跳到第1步,否则跳到第3步: (3)执行else 子句 (4)结束 while 语句的执行 >>> n = 1 >>>

Expanding Rods-二分

A - Expanding Rods Time Limit:1000MS     Memory Limit:30000KB     64bit IO Format:%I64d & %I64u Submit Status Practice POJ 1905 Description When a thin rod of length L is heated n degrees, it expands to a new length L'=(1+n*C)*L, where C is the coeff

《数字图像处理原理与实践(MATLAB版)》一书之代码Part9

本文系<数字图像处理原理与实践(MATLAB版)>一书之代码系列的Part9,辑录该书第431至第438页之代码,供有需要读者下载研究使用.至此全书代码发布已经接近尾声,希望这些源码能够对有需要的读者有所帮助.代码执行结果请参见原书配图,建议下载代码前阅读下文: 关于<数字图像处理原理与实践(MATLAB版)>一书代码发布的说明 http://blog.csdn.net/baimafujinji/article/details/40987807 首先给出的是原书P438所列之程序源

HDU5322 Hope

Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 420    Accepted Submission(s): 227 Problem Description Hope is a good thing, which can help you conquer obstacles in your life, just keep fightin

完美拖拽 &amp;&amp;仿腾讯微博效果&amp;&amp; 自定义多级右键菜单

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-

【BZOJ】1074: [SCOI2007]折纸origami

http://www.lydsy.com/JudgeOnline/problem.php?id=1074 题意:一开始有一个左上角是(0,100),右下角是(100,0)的纸片,现在可以沿有向直线折n次(n<=8,右边折向左边),折完后,有m个询问(m<=50),每次询问一个点在最终的图形中穿过了几次纸片. #include <cstdio> #include <cstring> #include <cmath> #include <string>

【BZOJ】1038: [ZJOI2008]瞭望塔

http://www.lydsy.com/JudgeOnline/problem.php?id=1038 题意:给出n个x轴各不相同的整点且升序,n<=300,求这些点依次连接后折线的上面取一个点(x, y)使得:x0<=x<=xn,且这个点可以看得到所有线段的所有点.要求这些点到(垂直到)折线的y值之差最小. #include <cstdio> #include <cstring> #include <cmath> #include <stri

多线程之线程同步

多线程内容大致分两部分,其一是异步操作,可通过专用,线程池,Task,Parallel,PLINQ等,而这里又涉及工作线程与IO线程:其二是线程同步问题,鄙人现在学习与探究的是线程同步问题. 通过学习<CLR via C#>里面的内容,对线程同步形成了脉络较清晰的体系结构,在多线程中实现线程同步的是线程同步构造,这个构造分两大类,一个是基元构造,一个是混合构造.所谓基元则是在代码中使用最简单的构造.基元构造又分成两类,一个是用户模式,另一个是内核模式.而混合构造则是在内部会使用基元构造的用户模