0

我正在学习 .net 框架理论概念(使用 wiki 和 google)。正如我从wiki 上的这张图片中了解到的那样,.net 框架中编译和执行过程的主要(也是最基本的)视图表明 c#、j#、vb.net 等中的各种源代码被编译成一个平台中立的字节码称为 CLI 代码(通用中间语言代码),然后将其编译(或者它是否被解释?)成一个依赖于平台的代码,称为本机代码。此代码的创建方式可在特定平台上提供无问题且易于执行的方式。但是我对这里给出的源代码到字节码编译阶段的详细描述感到困惑。我的问题是:

  1. 为什么 CIL 代码存储在这个程序集、PE 格式和清单中?
  2. 这些是什么?
  3. 为什么不直接将其转换为本机可执行代码。此外,还提到 CIL 代码被编译为 1) 字节码(被解释为可执行代码)。或 2) 二进制可执行代码。
  4. 您能否举例说明 .net 分别应用这两种技术的一些平台?请用简单的术语解释一下。

先感谢您。

4

1 回答 1

0

PE 格式是 exe 和 dll 的结构。它最初是为本地代码中的东西而设计的。重用它意味着他们不必重写窗口,而是在文件中放置一个“.net标志”,如果设置了它,操作系统会告诉.net运行时间从前端“运行它”(如你双击桌面上的图标,更改是透明的。

您详细说明了 IL 的使命陈述原因,您自己,如果您想了解它的真正含义,请查看 mono 项目。

IL 没有被解释,只有两个编译阶段,一个是 IL(如果你愿意,你可以编写原始 IL)。然后从 IL 到本地。优点很多,但很容易看出有多少 .net 语言。它们都被编译为 .IL,然后每个目标架构(例如 32 / 64 位)都有一个本地 IL。因此,如果您说六种 .net 语言和四种操作系统/体系结构,那就是十个要编写和维护的程序,如果没有 IL,它实际上是 24...

.net 运行时执行所谓的 JIT 编译。您提到的第一个术语是您的汽车装配中的 Car 类,它将 Car 编译为本机代码,然后从那时起使用它。如果您运行该应用程序并且只查看自行车,则不会编译汽车。这很好,但编译可能需要时间,在某些情况下太多了,所以有一个名为 NGEN 的工具可以编译很多。作为安装的一部分,您可以这样做,不再需要 JIT 成本。

在我看来,您提供的关于被解释为 JIT 的链接有点误导。你当然没有理由不能拥有 IL 解释器,但这不是框架所做的。JustInTime 编译,是通常发生的事情。但是,您可以做的是使用一个名为 NGEN 的工具,该工具对 exe / dll 进行完整编译,将 JIT 排除在外。JIT 中固有的延迟不常见但可能会成为一个问题。NGEN 基本上会提前手动编译所有内容,因此您的应用程序不必因编译而延迟。

于 2012-05-14T15:28:34.063 回答