反射器 – 为什么人们反汇编.NET(CLR)二进制文件?

我对.NET有些陌生,但对编程并不陌生,我对有关反汇编编译.NET代码的趋势和兴奋感到有些困惑.这似乎毫无意义.

.NET的高级易用性是我使用它的原因.我在资源有限的环境中编写了C和实际(硬件处理器)程序集.为了提高效率,这就是为了这么多细节而花费精力的原因.在.NET领域,如果你浪费时间深入了解实现中最神秘的细节,那就有可能失去拥有高级面向对象语言的目的.在使用.NET的过程中,我调试了通常的性能问题,这是一个奇怪的竞争条件,我通过阅读自己的源代码完成了所有这些,从来没有想过编译器生成什么中间语言.例如,很明显,for(;;)循环比数组上的foreach()更快,考虑到foreach()将使用带有方法调用的枚举对象来进行下一次而不是变量的简单增量,这很容易通过几百万次紧密循环运行来证明(不需要拆卸).

究竟是什么让IL愚蠢地拆解是因为它不是真正的机器代码.这是虚拟机代码.我听说有些人实际上喜欢移动指令来优化它.你在跟我开玩笑吗?即时编译的虚拟机代码甚至不能以本机编译代码的速度对(;;)循环进行简单的紧缩.如果你想从处理器中挤出最后一个循环,那么使用C/C++并花时间学习真正的装配.这样你花在理解大量低级细节上的时间实际上是值得的.

那么,除了手上有太多时间之外,人们为什么要拆解.NET(CLR)二进制文件呢?

最佳答案
了解各种高级语言的编译器实际上正在对您的源进行操作是一项重要的技能,可以在掌握某个特定环境时获取,就像理解数据库引擎如何计划执行各种SQL查询一样可以折腾他们.要以一种熟练的方式使用一定程度的抽象,熟悉(至少)低于它的水平是一件非常好的事情;见例如some notes on my talk on the subject of abstractionthe slides for that talk,以及我在谈话中提到的Joel Spolsky的“泄漏抽象定律”.

转载注明原文:反射器 – 为什么人们反汇编.NET(CLR)二进制文件? - 代码日志