.net 框架的即时编译器生成的是汇编语言还是二进制代码?换句话说,JIT 编译器的输出在进入处理器之前是否必须经过汇编程序。如果 JIT 生成的是汇编语言,有没有办法查看该汇编语言输出?
答案1
当您编译 .NET 程序时,会生成 MSIL(现在可能称为 CIL)。MSIL 是一种“字节码” - 类似于稍高级的汇编语言,并非设计用于在任何实际 CPU 上运行。
这必须“即时”编译 (JITted) 为本机代码。您的 CPU 只理解本机代码。本机代码是特定于体系结构的,即 ARM 本机代码无法在 x86 上运行,反之亦然。
目标代码是汇编程序或编译器在经过链接过程之前输出的内容。简单地说,链接使代码能够使用其他库(如 .dll)、框架(如 COM 等)和操作系统本身中的子例程、函数和 API - 链接后,您便拥有了一个可以使用的可执行文件。目标代码也是特定于体系结构的。
JIT 编译器不会调用单独的程序来创建汇编(至少在 Windows 上不会)——不会创建中间的人类可读文本“汇编语言”文件。我确信它只是直接发出二进制指令本身。您可以像对任何其他 .exe 一样对其进行逆向工程和反汇编。这非常复杂,通常需要大量工作。
所有代码,无论是文本、源代码、本机代码、机器代码、汇编代码、对象代码等,都是二进制数据流。加载后,它最终会以二进制数据流的形式进入 CPU 内存。当存储在文件中时,它通常被包装成可执行格式(Windows 上的可移植可执行文件或 PE),其中还包含其他数据,这些数据在根据操作系统的执行请求加载时放置在 RAM 的其他位置,例如程序引用的静态数据(常量整数和字符串、图标等资源)、它使用的 DLL 和其他内容。PE 格式的参考资料随时可用。
答案2
.NET 框架的 JIT 编译器“读取”字节码并生成纯二进制机器码:http://msdn.microsoft.com/en-us/library/ht8ecch6(v=vs.71).aspx
在运行 Microsoft 中间语言 (MSIL) 之前,必须 由 .NET Framework 即时 (JIT) 编译器转换为本机代码,它是特定于 CPU 的代码,可在与 JIT 编译器相同的计算机体系结构上运行。由于公共语言运行时为每个支持的 CPU 体系结构提供了一个 JIT 编译器,因此开发人员可以编写一组可进行 JIT 编译并在具有不同体系结构的计算机上运行的 MSIL。