找回密码
 立即注册
首页 业界区 业界 借老赵和包子的春风,我也来谈谈IL与汇编(上) ...

借老赵和包子的春风,我也来谈谈IL与汇编(上)

亢安芙 2025-5-29 20:26:48
园子里两个大牛正争的如火如荼,小生不才,借一下两个名人的名气也来谈一下Microsoftintermediate language (MSIL,就是大家口里的IL)和ASM(这里指针对X86汇编,排除其他一切“高级汇编”)。为了达成共识,我们先对一些概念回忆一下:
CPU只能执行机器码,不能执行IL
这个应该没有什么疑问吧。机器码就是传说的0、1的组合,虽然今天的CPU运算速度已经非常非常快,而且非常非常智能,但它和上个世纪的CPU还是一样,还只能认识0、1的组合的这种机器码。
说到IL就应该提一提编译器的前端和后端。众所周知,微软的.NET平台上有众多的语言,大家熟悉的有C#、VB.NET、Jscript.NET,而这些不同语法的“高级”语言,经过CSC.Exe(C#编译器)、VBC.Exe(VB.NET编译器)等编译后得到IL,这之前的部分我们称之为前端,实际上事情并没有到这里结束,当CLR加载托管程序集,运行某一个方法时,CLR发现这个方法还没有被即时编译(JIT),这个时候就会调用JIT编译器对这个方法的IL编译,编译的结果就是我们的目标代码(目标代码可以是汇编代码或机器码,这里不加以区分)。而这之后的JIT编译等过程我们可以认为是编译器的后端。
有了上面这段描述,各位同学大脑中应该有这样一幅画面:
1.png

 
通过这幅图我们看到,微软通过实现不同的前端,而共一个后端实现了一个平台,多种语言的目标。这也就是为什么你用VB.NET写的组件,我用C#可以直接使用,甚至是
我用C#写的类直接派生自一个VB.NET写的类。
因为IL相对于机器码来说相对简单,因为IL不能操作寄存器。所以你甚至可以自己定义一个语法,然后实现一个编译器的“前端”,将你自己的语言加入到.NET这个大家族
中(貌似园子里的装配脑袋正在做这方面的工作)。这样你自己的语言也可以享受.NET的类库了,.NET的垃圾回收机制了。
从这里我们了解到IL起一个桥梁的作用。那好,我们学习IL到底可以干些什么?
1:探究C#这些编译器内部所作所为:
记得以前博客园有一场对访问集合对象时,使用for好还是foreach好的大讨论,那我就用这个例子来用IL说明一下使用for访问
 static void Main(string[] args)
        {
            ArrayList arr = new ArrayList();
            for (int i = 0; i 
您需要登录后才可以回帖 登录 | 立即注册