代码之家  ›  专栏  ›  技术社区  ›  rerun

对IL的深入了解对.NET开发很重要

  •  14
  • rerun  · 技术社区  · 14 年前

    当我主要是C++的时候,虽然知道汇编是很重要的,并且编写了一些非试用的ASM代码,这样我才能真正理解正在发生的事情。我现在主要做.NET,虽然我对IL有一些了解,但我绝对不精通。

    IL是一项应该了解的技能,还是将更全面地学习IL,以告知我如何使用和编写.NET代码?

    7 回复  |  直到 14 年前
        1
  •  21
  •   Reed Copsey    14 年前

    从很多方面来说,完全学习IL就像学习组装。

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

    然而,对于大多数“日复一日”的编程任务,我并不认为有必要了解IL,就像大多数C++程序员并不真正理解的那样。 需要 了解如何编写程序集。

    这就是说,如果你理解汇编代码与C++背景,得到一个总的想法,IL将非常,非常容易…

        2
  •  8
  •   David Basarab    14 年前

    如果你只是想写一个.NET应用程序,你不需要任何有关IL代码的实用知识。大多数.NET开发人员不知道如何编写IL代码。

    如果你想知道到底发生了什么,我会帮助你的。您可以使用它在计算机上编写更高效的代码,这在您正在编写的.NET语言中可能并不明显。

        3
  •  5
  •   Sam Harwell    14 年前

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

    • 正在写入动态代码。这已经被system.linq.expressions API很好地取代了,特别是考虑到它在.net 4中的能力。
    • 为新语言编写编译器以针对CLI。像这样的项目 Common Compiler Infrastructure 目的减少实际CIL代码编译器编写者必须编写的代码量。

    我个人最感兴趣的方面之一是检查IL语言对实时编译器的影响。对比jvm和cli的一个显著例子是cli有一个非虚拟方法和直接调度的概念,它允许非优化(基线)编译器发出特别有效的调用。这种分析在JVM中比较昂贵,所以基线编译器不能优化很多情况。

    回答最初的问题:

    一般来说,.NET开发人员不需要担心学习CIL。如果您的工作涉及运行时/动态生成的方法,那么您应该评估表达式API满足您需求的能力,因为它是 极大地 更可用/可维护。我花了几个星期的时间用ILGenerator发射CIL。我花了一次时间转换成表达式,节省了一百多行代码,还修复了我还没发现的旧错误。

    对于任何实现CLI虚拟机或编写编译器(AOT或JIT)的人来说,CIL的详细知识都非常重要。我发现它既有趣又有用,但是在“成为一个有生产力的开发人员要知道的重要事情”的范围内,它并没有那么高。

        4
  •  3
  •   Hans Passant    14 年前

    在.NET框架中只有一个地方 要了解IL,请查看System.Reflection.Emit命名空间中的类。它允许您动态生成代码,这在某些情况下很有用。

    曝光到IL的最佳方法是通过ildasm.exe工具,Reflector也可以工作。运行它的一个非常方便的方法是将它添加到“工具”菜单中。工具+外部工具,添加。

    • 标题= ILDASM
    • 命令=C:\Program Files\Microsoft SDK\Windows\V6.0A\bin\ildasm.exe
    • 参数=$(targetpath)
    • 初始目录=$(TARGETDIR)

    现在您可以编写一些托管代码,编译并快速查看generate il。如果你以前接触过机器代码,你会发现这很容易。请记住,IL是非类型化的,任何值类型都使用相同的操作码。

    下一步是看看如何将IL转换为机器代码。开始调试,右键单击代码并选择“转到反汇编”。注意,除非您运行发布构建并启用JIT优化,否则您不会看到真正的机器代码。工具+选项,调试,取消勾选“模块加载时抑制JIT优化”。

        5
  •  1
  •   FrustratedWithFormsDesigner    14 年前

    视情况而定。了解IL可能会帮助您理解代码变成什么。如果您对IL有很好的了解,甚至可以在运行时创建新的组件(如果需要的话)。这是必要的吗?大概不会。

        6
  •  1
  •   Arve    14 年前

    在VisualStudio中,了解汇编对C/C++非常有帮助。你总是可以去拆卸看看发生了什么。

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

    但是IL很适合在没有源代码的程序集中进行查找。(但你可以用 reflector 为此)

        7
  •  0
  •   Phil    14 年前

    不,就像大多数人说的。另外,添加到他们的评论中,看看为什么使用C/C++,以及为什么使用.NET和它的语言(LIEK C *):

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


    .NET语言是为了快速制作优秀的应用程序,并限制您对这些应用程序所造成的损害。它不鼓励您在CPU上使用真正的电源(就像不鼓励指针,并且您在大多数情况下不必担心垃圾收集。)基本上,您可以做的损坏仅限于应用程序;与CPU无关(除非您涉足仅在极少数情况下使用的不安全代码[在我的经验中])。此外,.NET代码转换为IL,然后IL转换为程序集,等等…无论如何,您不会直接处理汇编语言。


    这些都说,了解IL对于头部的知识是很好的,可以帮助你一点。但是,了解它并不能极大地帮助你创建一个伟大的应用程序——这是大多数开发人员不在微软工作的.NET语言的要点。