看到最近园里很多人在讨论汇编和IL。忍不住要说两句。先看看什么是汇编。首先要知道的是汇编是和CPU指令有关的。intel和amd CPU的指令集是不一样的(当然,可能有一部分指令是相同的的)。这就要对不同的CPU实现相应的汇编器,汇编器的功能就是将汇编助记符号(象add、mov)翻译成相对某类CPU的机器码,最终生成象exe、dll、so等二进制文件。
      既然不同的CPU的机器指令不完全相同,那么我们如何编写跨CPU的程序呢?当然, 一个好主意是有一种通用的语言,通过这种语言的编译器,可以将源代码转换(编译)成不同CPU的指令。但这有一个问题,就是需要为各种CPU实现不同的编译器,比较麻烦。为了更方便,可以先将这种语言转换成汇编语言。然后再使用不同CPU平台的汇编器转换成机器码。这样编译器可以只有一个,而汇编器需要对不同的CPU来实现。不过汇编器的实现可以编译器容易得多哦。刚才说的这种语言就是高级语言,象C、C++语言。 在这里,汇编语言不仅仅是起到了助记符的作用,还起到了对CPU的抽象作用。如对于不同的CPU,某个助记指令可以对应的CPU指令码不同。
     再看看IL,由于不同的基于.net的语言有不同的语法。而CLR对语言的语法并不感兴趣,而只对实际的运行指令感兴趣,就象CPU,只对机器指令感兴趣一样。因此,需要一种描述CLR可识别的运行指令的语言,这就是IL。我们可以和汇编的位置进行对比。在.net中,CLR是.net虚拟机,相当于“CPU+操作系统”的地位。而VB.net、C#相当于高级语言,和C、C++是一样的。而IL呢,正好相当于汇编的地位,承前启后。CLR将IL再编译成机器指令是非常快的。因此,可以得出一个结论。如果说IL就是汇编,那么这个汇编并不是相对于CPU的,而是相对于CLR的,也就是说,IL是CLR的汇编。而CLR可以被称为.net虚拟机,因此,可以将IL称为虚拟汇编