今天笔者温故了.NET CLR的相关知识,顺便拿出来和大家分享一下,笔者所讲的.NET CLR很基础,希望能给你带来帮助。
大家都知道.NET是支持所谓的多语言的,但其实.NET只有一种语言,就是MSIL,其它所有的语言,按照今天培训课上讲的,就是MSIL的一种子语言。MSIL看起来类似一种汇编语言,想当初,用MSIL做一个虚拟机,做的是云里来,雾里去的,对汇编还是怕的很。
在很多时候,MSIL都被当成一种基于栈的OO形式的汇编语言。而这种语言被.NET CLR所编译,转换成本地执行文件。在这里要注明的是,MSIL并不像其它的汇编语言,它所包含汇编指令不是应用于一台真正的机器上,而一种抽象的机器上,也因为此,基于MSIL的程序可以应用于不同的机器上,这也是MSIL的特点之一。
而在一台机器上,MSIL代码是不能被直接编译的,而是必须首先经过JIT转换成本地代码(native code)。
那么MSIL究竟能做什么呢?呵呵,即然做为.NET CLR的“唯一”的一种语言,凡是你在其它语言里能做到的,就是MSIL所做的。那在编译一个.NET CLR文件中,MSIL具体在何时何地扮演何种角色呢?(很想画个图,可是不知道怎么在CNBlog中实现,好像以前直接从word里可以直接copy,现在不行了) 大概描述一下编译的流程,大家应该就能明白了。
按照传统的编译流程,是将source code 编译成object code,再将object与一个library连接起来编译成binary文件,然后执行binary文件。而随后推出了Dynamic link Compilation, 即动态编译,其指的是将source code编译成一个object code,但是其在编译时不连接libary文件,而是在运行binary文件时,动态连接library 文件。
那可能有人就问,library文件是什么?它其实包含的就是metadata,元数据。而在.NET CLR中采用的是所谓的JIT Compilation, (Just In Time Compilation),它的实现原理与动态编译类似,将source code转换成MSIL,再利用JIT将MSIL转换成本地代码,在运行时,读取Assembly中的元数据进行相关操作。
大概的.NET CLR流程就是这样了,不多说了,这个要说下去,就该谈谈metadata, 还有一些编译过程的细节,比如说JIT Engine, BackPatch, JMI Thunk等一系列的编译机制。
【编辑推荐】