小谈.NET CLR
今天的一节培训课上谈起了.NET 的体系结构,让我也想起了当初所学的.NET CLR的相关知识。所以在这里小谈一下,也算是个“温故而知新”了, 还记的很久以前,曾在自己的另一篇文章中讨论过CLR和CLI的关系。从大家的回复中也明白了很多。(文章链接) 大家有空自己再看看,我就不多啰嗦这一点了。
大家都知道.NET是支持所谓的多语言的,但其实.NET只有一种语言,就是MSIL,其它所有的语言,按照今天培训课上讲的,就是MSIL的一种子语言。MSIL看起来类似一种汇编语言,想当初,用MSIL做一个虚拟机,做的是云里来,雾里去的,对汇编还是怕的很。在很多时候,MSIL都被当成一种基于栈的OO形式的汇编语言。而这种语言被CLR所编译,转换成本地执行文件。在这里要注明的是,MSIL并不像其它的汇编语言,它所包含汇编指令不是应用于一台真正的机器上,而一种抽象的机器上,也因为此,基于MSIL的程序可以应用于不同的机器上,这也是MSIL的特点之一。而在一台机器上,MSIL代码是不能被直接编译的,而是必须首先经过JIT转换成本地代码(native code)。
那么MSIL究竟能做什么呢?呵呵,即然做为.NET的“唯一”的一种语言,凡是你在其它语言里能做到的,就是MSIL所做的。那在编译一个.NET文件中,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中的元数据进行相关操作。
大概的流程就是这样了,不多说了,这个要说下去,就该谈谈metadata, 还有一些编译过程的细节,比如说JIT Engine, BackPatch, JMI Thunk等一系列的编译机制。有机会,下次再继续谈。先这样,呵呵,后会有期。
大家都知道.NET是支持所谓的多语言的,但其实.NET只有一种语言,就是MSIL,其它所有的语言,按照今天培训课上讲的,就是MSIL的一种子语言。MSIL看起来类似一种汇编语言,想当初,用MSIL做一个虚拟机,做的是云里来,雾里去的,对汇编还是怕的很。在很多时候,MSIL都被当成一种基于栈的OO形式的汇编语言。而这种语言被CLR所编译,转换成本地执行文件。在这里要注明的是,MSIL并不像其它的汇编语言,它所包含汇编指令不是应用于一台真正的机器上,而一种抽象的机器上,也因为此,基于MSIL的程序可以应用于不同的机器上,这也是MSIL的特点之一。而在一台机器上,MSIL代码是不能被直接编译的,而是必须首先经过JIT转换成本地代码(native code)。
那么MSIL究竟能做什么呢?呵呵,即然做为.NET的“唯一”的一种语言,凡是你在其它语言里能做到的,就是MSIL所做的。那在编译一个.NET文件中,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中的元数据进行相关操作。
大概的流程就是这样了,不多说了,这个要说下去,就该谈谈metadata, 还有一些编译过程的细节,比如说JIT Engine, BackPatch, JMI Thunk等一系列的编译机制。有机会,下次再继续谈。先这样,呵呵,后会有期。