C#语言在.NET中,编译分为两个阶段:
(1) 将源代码编译为Microsoft中间语言(CIL)。
(2) CLI把CIL编译为平台专用的代码。
不仅是编译问题:程序执行问题
- C#程序还需要在一个代理(托管)的上下文中执行。
- 负责管理C#程序执行的代理就是:虚拟执行系统(Virtual Execution System,VES)
- 更通俗称呼为:“运行时”。
运行时:负责加载和运行程序,并在程序执行时提供额外的服务。
如下图:是C#编译执行情况。
C#与C/C++对比
C/C++程序编译过程与运行过程https://blog.csdn.net/xiaoyaolangwj/article/details/123898733
C和C++的编译如上文。
- 由于C和C++之类的语言会直接编译成机器码,所以这些语言的平台是底层的操作系统和机器指令集,即Microsoft Windows、Linux和MacOS等。
- 但是C#不同,C#的底层上下文是“运行时”或说VES。
C#编译需要两个步骤。
1.C#编译器将C#转换为CIL(公共中间语言(Common Intermediate Language))。
2.将CIL转换为处理器能执行的指令。
“运行时”能理解CIL语句,并能将它们编译为机器码。
通常要由“运行时”内部的一个组件执行从CIL到机器码的编译。该组件称为即时(just-in-time,JIT)编译器 。
程序安装或执行时,便可能发生JIT编译,或者说即时编译 (jitting)。
运行时Running-Time
即使“运行时”将CIL代码转换为机器码并开始执行,也在继续管理代码的执行。在“运行时”这样的一个代理上下文中执行的代码称为托管代码,在“运行时”控制下的执行过程称为托管执行。对执行的控制转向数据,数据就成为了托管数据 ,因为数据所需的内存是由“运行时”自动分配和回收的。
平台可移植性
代码的移植工作必须由“运行时”的实现来完成,而不是由应用程序的开发者来完成(感谢.NET Standard)。