1
21
从很多方面来说,完全学习IL就像学习组装。 了解IL可以帮助您了解实际编译.NET代码时会发生什么。这非常有用,尤其是当您遇到性能关键的分析情况时(您发现了一个真正的问题,需要对其进行优化)。 然而,对于大多数“日复一日”的编程任务,我并不认为有必要了解IL,就像大多数C++程序员并不真正理解的那样。 需要 了解如何编写程序集。 这就是说,如果你理解汇编代码与C++背景,得到一个总的想法,IL将非常,非常容易… |
2
8
如果你只是想写一个.NET应用程序,你不需要任何有关IL代码的实用知识。大多数.NET开发人员不知道如何编写IL代码。 如果你想知道到底发生了什么,我会帮助你的。您可以使用它在计算机上编写更高效的代码,这在您正在编写的.NET语言中可能并不明显。 |
3
5
除了显而易见的(实现虚拟机)之外,某些类型的任务还需要对IL有一个非常透彻的理解。
我个人最感兴趣的方面之一是检查IL语言对实时编译器的影响。对比jvm和cli的一个显著例子是cli有一个非虚拟方法和直接调度的概念,它允许非优化(基线)编译器发出特别有效的调用。这种分析在JVM中比较昂贵,所以基线编译器不能优化很多情况。 回答最初的问题:一般来说,.NET开发人员不需要担心学习CIL。如果您的工作涉及运行时/动态生成的方法,那么您应该评估表达式API满足您需求的能力,因为它是 极大地 更可用/可维护。我花了几个星期的时间用ILGenerator发射CIL。我花了一次时间转换成表达式,节省了一百多行代码,还修复了我还没发现的旧错误。 对于任何实现CLI虚拟机或编写编译器(AOT或JIT)的人来说,CIL的详细知识都非常重要。我发现它既有趣又有用,但是在“成为一个有生产力的开发人员要知道的重要事情”的范围内,它并没有那么高。 |
4
3
在.NET框架中只有一个地方 有 要了解IL,请查看System.Reflection.Emit命名空间中的类。它允许您动态生成代码,这在某些情况下很有用。 曝光到IL的最佳方法是通过ildasm.exe工具,Reflector也可以工作。运行它的一个非常方便的方法是将它添加到“工具”菜单中。工具+外部工具,添加。
现在您可以编写一些托管代码,编译并快速查看generate il。如果你以前接触过机器代码,你会发现这很容易。请记住,IL是非类型化的,任何值类型都使用相同的操作码。 下一步是看看如何将IL转换为机器代码。开始调试,右键单击代码并选择“转到反汇编”。注意,除非您运行发布构建并启用JIT优化,否则您不会看到真正的机器代码。工具+选项,调试,取消勾选“模块加载时抑制JIT优化”。 |
5
1
视情况而定。了解IL可能会帮助您理解代码变成什么。如果您对IL有很好的了解,甚至可以在运行时创建新的组件(如果需要的话)。这是必要的吗?大概不会。 |
6
1
在VisualStudio中,了解汇编对C/C++非常有帮助。你总是可以去拆卸看看发生了什么。 如果您在C中尝试相同的方法,即“转到反汇编”,您仍然会转到本机代码,而不是IL。从这个意义上讲,IL并不像真正的组装那样有用。 但是IL很适合在没有源代码的程序集中进行查找。(但你可以用 reflector 为此) |
7
0
不,就像大多数人说的。另外,添加到他们的评论中,看看为什么使用C/C++,以及为什么使用.NET和它的语言(LIEK C *):
C/C++是以一种很好的抽象方式给你的计算机提供能量的。它几乎可以直接转换为汇编语言,并为善(和恶)提供强大的力量。像指针这样的东西是被鼓励的,并且没有垃圾收集。因此,您必须知道汇编语言代码正在做什么,因为您可以做什么。
.NET语言是为了快速制作优秀的应用程序,并限制您对这些应用程序所造成的损害。它不鼓励您在CPU上使用真正的电源(就像不鼓励指针,并且您在大多数情况下不必担心垃圾收集。)基本上,您可以做的损坏仅限于应用程序;与CPU无关(除非您涉足仅在极少数情况下使用的不安全代码[在我的经验中])。此外,.NET代码转换为IL,然后IL转换为程序集,等等…无论如何,您不会直接处理汇编语言。
|
Joe Huha · .net JIT编译器二次编译大型方法 10 年前 |
user2341923 · IL Asm函数名中的Unicode? 11 年前 |
Muepe · 动态方法,将返回值存储在本地 11 年前 |