首页 > 代码库 > .net编译原理学习

.net编译原理学习

  今天来学习一些.net 的编译原理

首先通过书本上内容了解了:

  .net framewrok 的核心是运行库执行环境,称为公共语言运行库(CLR),在CLR控制下运行的代码称为代码托管(managed code)

  但是在CLR执行已经编写好的源代码之前,需要先进行编译它们,编译分为两个阶段:

    1.将源代码编译为microsoft中间语言(MSIL,简称IL)

    2.将IL编译为平台专用的代码

  稍微详细一点的过程是:

    1.如果使用vs进行开发,则将源代码编译为IL的过程由vs来完成。

    2.IL代码由CLR从可执行文件(好像是dll文件,我猜的)中取出,交给JIL(jusi-in-time)编译器,根据相应的元数据(metadata)这里不明白元数据是怎么意思),实时编译为本机代码后执行。

  第二阶段(IL编译为本机代码)详解:

  这里是网上查到的资料http://www.cnblogs.com/szny/archive/2011/12/28/2304485.html

  运行IL之前,必须先根据公共语言运行库将其编译为合适目标计算机体系结构的本机代码(应该是本地计算机的机器语言吧)。

  .net framework 提供了两种方式来执行此类转换:

    .net framework 实时编译器 JIL

    .net framework 本机映像生成器 Ngen.exe 

  JIL:

  在应用程序运行时,JIT 编译器可以在加载和执行程序集内容的过程中根据需要将 IL 转换为本机代码。

  由于公共语言运行库为所支持的每种 CPU 体系结构都提供了一个 JIT 编译器

  (一种体系结构一个编译器,不是一个CPU一个编译器,刚看的时候看花眼了...如果一种CPU,一个编译器的话...呵呵

  因此开发人员可以生成一组可在具有不同的计算机体系结构的不同计算机进行 JIT 编译和运行的 IL 程序集

  (小学语文是体育老师教的,这句话我看了大概有5分钟才搞懂)。

  但是,如果托管代码调用特定于平台的本机 API 或特定于平台的类库,则将只能在特定的操作系统上运行。

  (只能在某个特定的平台中使用的API或者类库,大概意思好比我写的“狂草”,只有我能看懂,其他人看不懂,不知道对不对

  JIT 编译考虑了在执行过程中某些代码可能永远不会被调用的事实。它不是耗费时间和内存将可移植可执行 (PE) 文件中的所有 MSIL 都转换为本机代码

  (java字节码好像是通过这种方式,书上看到的

  而是在执行期间根据需要转换 MSIL 并将生成的本机代码存储在内存中,以供该进程上下文中的后续调用访问。

  (这里有点疑问,书上说“代码编译过一次后,得到的本地可执行程序就存储起来,知道退出该应用程序为止”,书上说得到的是本地可执行程序,这里是本机代码,我不知道怎么回事,求解析。

  在加载并初始化类型时,加载程序将创建存根 (stub) 并将其附加到该类型的每个方法中。当首次调用某个方法时,存根 (stub) 会将控制权交给 JIT 编译器,后者会将该方法的 MSIL 转换为本机代码,并修改存根 (stub) 以使其直接指向生成的本机代码。这样,对 JIT 编译的方法的后续调用将直接转到该本机代码。

    

  

.net编译原理学习