一早看到包同学的驳文《批驳小赵之IL无用论(1)》,甚是期待,但看了第一个回应,却让我大失所望。包同学能否看清了老赵以前说过的,自己以前说过的,以及老赵昨天说的东西以后再进行反驳呢?我们很多明明是同样的观点,为什么变成相互驳斥了呢?更何况,从标题上看包同学是要证明IL有用,但是……没看到哪。
包同学说,老赵认为UltraEdit32无法看IL,于是说:
我曾经指出,UltraEdit32也可以观察IL中的一些数据,但是没有给出具体操作办法。于是赵劼就单方面理解为我是信口开河,并多次在公开场合抓住这个话柄对我进行诋毁。我其实不是很想提及这个办法,所以一直没有说破,因为这个法子太过BT。介绍如下……
包兄弟,你究竟有没有看我的文章呢?我也摘抄一段我前文说的内容。我可是在说UltraEdit32无法看“汇编”:
IL是一种高度抽象,在运行之前,还需要由JIT转化为机器码才行。同样的IL代码,可以由不同CPU架构下的JIT编译成不同的机器码(同样的IL代码在同样的机器上是否也生成同样的机器码呢?答案是否定的,例如“泛型”……下一篇文章中我们会对此进行观察)。甚至于,CLR在运行了一段时间之后,可以让JIT重新生成一段更适合当前环境,性能更高的机器码供CPU执行。从这个角度上说,IL是静态的,而汇编是动态的。设法使用一个静态查看工具UltraEdit32来阅读一个动态的,不确定的内容,这又该如何实现呢?
然后我立即“同意”了包同学在今天的文章中的观点,UltraEdit32可以看IL:
不过真要说起来,使用UltraEdit32从理论上的确可以阅读一个编译后的IL代码,因为此时IL已经以二进制的形式存储在程序集文件中。例如IL Disassembler(ildasm.exe)和.NET Reflector便是通过读取程序集文件的数据(而不是在将程序集加载到CLR中)来获得IL代码,微软也发布了Common Compiler Infrastructure: Metadata和CCI: Code and AST两个和.NET基础结构有关的开源项目。而近在“博客园”中,也有Anders Liu大牛写过一个CliPeViewer,从程序集的物理结构中读取其元数据,再进一步便可获取到IL代码了。
然后我花了大段来解释微软IL和汇编有着本质的不同,但是似乎还是被忽略了。
包同学后来接着说:
但是,要看懂赵劼的文章《从汇编入手,探究泛型的性能问题》,没有IL这方面的修为是绝对不行的。
我想说明的是,无论是我的《浅谈尾递归的优化方式》还是《从汇编入手,探究泛型的性能问题》,都没有牵涉到对IL的了解,了解得是“汇编”,你完全可以不知道IL,真的不需要,我也根本没有谈及过IL——你可以说IL是CLR上的汇编,但是老赵这里说的就是“汇编”就是指“机器码使用助记符的表现形式”,而不是MS IL Team的定义——它的定义一定是正确的吗?就算是正确的,我们的理解是否正确?没错,IL对于CLR看来它的确是“汇编”,但是它和真正的“汇编”区别是完全不同的,因此老赵说这两者根本不可同日而语。包同学的意思,已经接近是说“IL也是一种汇编,虽然是面向CLR平台的,也应该和CPU平台一样的理解,其作用也是差不多的”,这个对吗?包同学从证明了IL也可以使用“汇编”这个名词,但是这和“x86汇编”能够相提并论吗?老赵从头到底就是为了区分“汇编”和“IL”的概念,包同学却在强调“名字”。
老赵讨论问题从来便是摆事实,讲道理的,相信看了我下面的文章,我是否是在“误导”就会非常清楚了。
对了,我一直说的是“对大部分程序员来说,学习IL是没有用的”,“如果你没有明确目标,就放过IL和汇编吧”。《老赵谈IL》中的最后一篇又是什么呢?《什么时候应该学IL,该怎么学IL》——我们就是要讨论这个问题嘛。其余还有例如老赵举的那些书,想说明“很少有书使用IL讲解问题”,但是包同学却举了C# Team对IL的定义进行反驳……莫非他们在用IL讲C#?
驳文不看文,实在可怕。我们程序员最讲究的“逻辑”到哪里去了?
引用:《老赵谈IL(1):IL是什么,它又不是什么?那么汇编呢?》