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 = ;
int num2 = ;
int num3 = ;
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 //执行构造函数时,评估堆栈可容纳数据项的最大个数。评估堆栈是保存方法中所需要变量的值的一个内存区域,该区域在方法执行结束时会被清空,或者存储一个返回值。
.locals init (
[] int32 num,
[] int32 num2,
[] int32 num3) //表示定义int类型的变量,变量名分别为num,num2,num3。存储在调用栈。
L_0000: nop //No operation的意思,即没有任何操作。
L_0001: ldc.i4. //将“1”压入评估栈,此时“1”处于评估栈的栈顶。
L_0002: stloc. //此指令表示把值从评估栈中弹出,并赋值给调用栈的第0个变量num。
L_0003: ldc.i4.
L_0004: stloc.
L_0005: ldc.i4.
L_0006: stloc. //从.locals init到L_0006,相当于C#代码的为i,j,k赋值。
L_0007: ldloc. //取调用栈中位置为0的元素压入评估栈(取i的值)。
L_0008: ldloc. //取调用栈中位置为1的元素压入评估栈(取j的值)。
L_0009: add //做加法操作
L_000a: ldloc. //取调用栈中位置为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指令详解。

【IL】IL入门的更多相关文章

  1. IL接口和类的属性

    上一篇文章学习了IL的入门,接下来我们再通过两个例子来了解下类的属性.构造函数以及接口的使用 一.类的属性.构造函数 1.先看下我们要构建的类的C#代码,然后再进行IL的实现,示例代码如下: [Ser ...

  2. 读懂IL代码(一)

    以前刚开始学C#的时候,总有高手跟我说,去了解一下IL代码吧,看懂了你能更加清楚的知道你写出来的代码是如何运行互相调用的,可是那时候没去看,后来补的,其实感觉也不晚.刚开始看IL代码的时候,感觉非常吃 ...

  3. 谈谈托管代码、IL、CLR、ISAPI?

    什么是托管代码?       托管代码是可以使用20多种支持Microsoft .NET Framework的高级语言编写的代码,这些语言包括:C#, J#, Microsoft Visual Bas ...

  4. C#基础拾遗系列之一:先看懂IL代码

    一.前言 首先,想说说为什么要写这样系列的文章,有时候在和同事朋友聊天的时候,经常会听到这样的话题: (1)在这家公司没什么长进,代码太烂,学不到东西.(你有没有想想框架为什么这样写,代码还可以怎么去 ...

  5. C# to IL 3 Selection and Repetition(选择和重复)

    In IL, a label is a name followed by the colon sign i.e ":". It gives us the ability to ju ...

  6. IL and 堆于栈

    CIL的基本构成+CIL操作码速记表+CIL操作码大全速查 引用类型:引用类型存储在堆中.类型实例化的时候,会在堆中开辟一部分空间存储类的实例.类对象的引用还是存储在栈中. 值类型:值类型总是分配在它 ...

  7. 【转载】读懂IL代码就这么简单 (一)

    一前言 感谢 @冰麟轻武 指出文章的错误之处,现已更正 对于IL代码没了解之前总感觉很神奇,初一看完全不知所云,只听高手们说,了解IL代码你能更加清楚的知道你的代码是如何运行相互调用的,此言一出不明觉 ...

  8. vs 查看IL

    vs--工具--外部工具--新增1 标题:随便填, 2 命令:C:\Program Files (x86)\Microsoft SDKs\Windows\v8.0A\bin\NETFX 4.0 Too ...

  9. 数位dp 的简单入门

    时间紧张,就不讲那么详细了. 之前一直被深搜代码误解,以为数位dp 其实就是记忆化深搜...(虽说爆搜确实很舒服而且还好想) 但是后来发现数位dp 的标准格式其实是 预处理 + dp ...... 数 ...

  10. Python之路,第五篇:Python入门与基础5

    python 循环语句 作用:  根据一定的条件,重复的执行一个或多个语句 两种循环语句: while 语句 for 语句 while 语句: 语法: while    真值表达式: 语句1 ... ...

随机推荐

  1. CAD VC++安装失败 1603错误

    问题描述 想安装一个高版本的CAD来着,可安装报错始终报错1603.具体表现为 DESKTOP-F7K8C37    Installing Microsoft Visual C++ 2008 SP1 ...

  2. ArcMap工具箱参数名称的Bug

    已经忍了很久了,今天一定要说一说,强大的 ArcGIS居然还存在这种Bug问题.如下图所示:使用了追加工具,有三个要素图层,且三个数据与目标数据不是同一数据,但它们的名称一致,这样执行,将会出现&qu ...

  3. 从n个数中随机选取m个

    咋一看,这是个很简单的问题,但是如果n是个不确定的数呢?比如服务器每天会收到数以亿计的请求,但是目前服务器端不希望保存所有的请求,只想随机保存这些请求中的m个.试设计一种算法,能够使服务器实时保存m个 ...

  4. 【树莓派】Squid代理以及白名单配置

    Squid安装: sudo apt-get install squid3 -y 首先,建议备份一下这个配置文件,以免配错之后,无法恢复,又得重新安装: sudo cp /etc/squid3/squi ...

  5. 开发JAVA9以上的项目时,出现ClassNotFoundException: javax.xml.bind.JAXBException的解决方法

    一.问题描述: 开发JAVA9以上的项目时,出现ClassNotFoundException: javax.xml.bind.JAXBException的解决方法 二.问题样例 三.解决方案 打开mv ...

  6. Go语言中Socket通信之Tcp客户端

    1.用法: (1)定义远程IP地址.使用net.ResolveTCPAddr()方法,定义一个TCP地址,做为目标连接地址. (2)调用net.DialTCP("tcp",nil, ...

  7. 算法笔记_214:第六届蓝桥杯软件类校赛真题(Java语言A组)

    目录 1 题目一 2 题目二 3 题目三 4 题目四 5 题目五 6 题目六 7 题目七 前言:以下代码仅供参考,若有错误欢迎指正哦~ 1 题目一 一个串的子串是指该串的一个连续的局部.如果不要求连续 ...

  8. InfluxDB和MySQL的读写对比测试

    今天进行了InfluxDB和MySQL的对比测试,这里记录下结果,也方便我以后查阅. 操作系统: CentOS6.5_x64InfluxDB版本 : v1.1.0MySQL版本:v5.1.73CPU ...

  9. Java 安装和变量环境配置

    //1.分别安装sdk和jre,需要2个均安装才是完整的 //1)jdk_8u60_windows_i586_V8.0.600.27.1440040557 //2)jre_8u60_windows_i ...

  10. 上海期货交易所CTP行情和交易接入

    发布时间:2018-09-25   技术:C++11,动态库的制作   概述 CTP的接入Demo 详细 代码下载:http://www.demodashi.com/demo/14125.html 本 ...