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

rer*_*run 14 .net il

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

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

Ree*_*sey 21

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

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

但是,对于大多数"日常"编程任务,我认为理解IL并不是必要的,就像大多数C++程序员并不真正需要知道如何编写汇编一样.

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


Dav*_*rab 8

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

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


Sam*_*ell 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非常重要.我发现它既有趣又有用,但在"要知道成为富有成效的开发人员的重要事项"的范围内,它并不是那么高.