1 static void Main(string[] args) 2 { 3 Console.WriteLine("Hello,World!"); 4 Console.WriteLine("Hello,World!"); 5 }
一个很简单的Hello World程序在.net framework平台究竟是如何在计算机上运行的呢?
下面我将简单解答一下这个问题:
首先介绍CLR(公共语言运行时),CLR是一个可有多种编程语言使用的“运行时”,CLR的核心功能(例如内存管理、程序集加载、安全性、异常处理和线程同步)可以供支持CLR的编程语言所使用。CLR并不在意何种编程语言来写程序,只要编译器是面向CLR的。
我们所写的这个简单的C#程序在C#编译器的作用下是面向CLR的,当程序编译时,C#源代码首先通过C#编译器被执行为托管模板(IL和元数据)。
IL是中间语言,无论何种编程语言都会先转换为IL再通过转换成为机器指令控制CPU的运行,从而实现程序的运行。
元数据包括了源代码中定义的类型和成员以及源代码引用的类型和成员。
using System;
大多程序初始添加了一些常用的程序集,例如上面的using System。
程序集简单理解可以是多个托管模板和资源文件合并起来的一个文件。
在Main方法执行前,CLR会检测出Main代码引用的所有类型。这时CLR会分配一个内部数据结构来管理对引用类型的访问,此程序中引用了一个Console类型,在这个内部数据结构,Console类型的每一个方法都有一个地址,当我们调用WriteLine方法时会进行寻址。之后在CLR的作用下从元数据中取出该方法的IL,经由一个叫做JIT编译器的东东便可编译为本机CPU指令从而由计算机执行程序。在第二次执行Console.WriteLine时并不需经由JIT编译,这对于方法重复度高的程序来说可以节省性能。
这就是在面向CLR时编译、运行的基本思路。