深入了解IL对.net开发的重要性

时间:2010-02-08 18:06:14

标签: .net il

当我主要使用c ++时,虽然知道汇编并编写一些非试验性的asm代码是至关重要的,这样我才能真正了解正在发生的事情。我现在主要做.net,虽然我对IL有所了解,但我并不精通。

IL是一个应该具备知识的技能,还是将更完整地学习IL继续告知我如何使用和编写.net代码?

7 个答案:

答案 0 :(得分:21)

完全学习IL就像学习装配一样,在很多方面。

了解IL可以帮助您了解在实际编译.NET代码时会发生什么。这可能非常有用,特别是如果您遇到性能关键的性能分析情况(您发现了一个真正的问题,需要对其进行优化)。

然而,对于大多数“日常”编程任务,我认为没有必要理解IL,就像大多数C ++程序员并不真正需要知道如何编写组装

话虽如此,如果您了解具有C ++背景的汇编代码,那么了解IL将会非常非常容易......

答案 1 :(得分:8)

如果您只是想编写.NET应用程序,则不需要任何IL代码的工作知识。大多数.NET开发人员不知道如何用IL代码编写。

如果您想了解真正发生的事情,IL会帮助您。您可以使用它在计算机上编写更高效的代码,这在您编写的.NET语言中可能并不明显。

答案 2 :(得分:5)

除了显而易见的(实现虚拟机)之外,某些类型的任务需要对IL进行非常透彻的理解。

  • 编写动态代码。这已被System.Linq.Expressions API取代,特别是考虑到它在.NET 4中的功能。
  • 编写新语言的编译器以定位CLI。像Common Compiler Infrastructure这样的项目旨在减少实际CIL代码编译器编写者必须编写的数量。

我个人最感兴趣的一个方面是研究IL语言对即时编译器的影响。与JVM和CLI形成对比的一个值得注意的例子是CLI具有非虚拟方法和直接分派的概念,这允许非优化(基线)编译器发出特别有效的调用。这种分析在JVM中更昂贵,因此基线编译器无法优化尽可能多的情况。

回答原来的问题:

通常,.NET开发人员不必担心学习CIL。如果您的工作涉及运行时/动态生成的方法,那么您应该评估Expressions API满足您需求的能力,因为它非常更加可用/可维护。我花了几周时间用ILGenerator发送CIL。我花了一个时间来转换为Expressions,保存了超过一百行代码并修复了我刚才没想过的旧错误。

对于实现CLI虚拟机或编写编译器(AOT或JIT)的任何人来说,详细了解CIL非常重要。我发现它既有趣又有用,但在“要知道成为富有成效的开发人员的重要事项”的范围内,它并不是那么高。

答案 3 :(得分:3)

.NET框架中只有一个地方您知道IL,即System.Reflection.Emit命名空间中的类。它允许您动态生成代码,这在特定情况下非常有用。

接触IL的最佳方式是通过Ildasm.exe工具,Reflector也可以工作。运行它的一种非常方便的方法是将其添加到“工具”菜单中。工具+外部工具,添加。

  • Title = Ildasm
  • Command = c:\ Program Files \ Microsoft SDKs \ Windows \ v6.0A \ Bin \ ildasm.exe
  • Arguments = $(TargetPath)
  • 初始目录= $(TargetDir)

您现在可以编写一些托管代码,编译并快速查看生成IL。如果你之前已经接触过机器代码,你会发现它很容易。请记住,IL是无类型的,相同的操作码用于任何值类型。

下一步是看看IL如何转换为机器代码。开始调试,右键单击代码并选择Go To Disassembly。请注意,除非运行Release版本并启用JIT优化,否则不会查看真实的机器代码。工具+选项,调试,取消勾选“在模块加载时抑制JIT优化”。

答案 4 :(得分:1)

取决于。了解IL可能会帮助您了解您的代码变成了什么。如果你对IL有很好的了解,你甚至可以在运行时创建新组件(如果需要)。这是必要的吗?可能不是。

答案 5 :(得分:1)

了解程序集对Visual Studio中的C / C ++非常有用。你总是可以去反汇编看看发生了什么。

如果您在C#中尝试相同的操作,即“转到反汇编”,您仍然会转到本机代码,而不是IL。从这个意义上讲,IL并不像真正的装配那样有用。

但是IL很适合查看你没有源代码的程序集。 (但你可以使用reflector

答案 6 :(得分:0)

不,像大多数人说的那样。另外,要添加他们的评论,请看看为什么使用C / C ++以及为什么要使用.NET及其语言(liek C#):

C / C ++是以一种很好的抽象方式通过计算机为您提供电源的。它被ALMOST直接转换为汇编语言,并为你提供了很好的力量(和邪恶的东西。)像指针这样的东西被鼓励,没有垃圾收集。因此,您必须知道汇编语言代码正在做什么,因为您可以做什么。


.NET语言可以快速制作出色的应用程序,并限制您可以对这些应用程序造成的损害。它不鼓励你在CPU上使用真正的权力(不喜欢指针,你不必担心垃圾收集大部分。)基本上,你可以做的损害仅限于应用程序;与CPU几乎没有关系(除非你涉及不安全的代码,这种代码仅在极少数情况下使用[根据我的经验])。此外,.NET代码转换为IL,然后IL转换为汇编等等......无论如何,您并不是直接处理汇编语言。


这些说,很高兴知道IL的头脑知识,可以帮助你一点点。但是知道它不会极大地帮助您创建出色的应用程序 - 这是.NET语言的重点,因为大多数开发人员都没有在Microsoft工作。