.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 编译的方法的后续调用将直接转到该本机代码。

    

  

时间: 2024-12-26 09:42:17

.net编译原理学习的相关文章

编译原理学习导论

编译原理学习导论 大学课程为什么要开设编译原理呢?这门课程关注的是编译器方面的产生原理和技术问题,似乎和计算机的基础领域不沾边,但是编译原理却一直作为大学本科的必修课程,同一时候也成为了研究生入学考试的必考内容.编译原理及技术从本质上来讲就是一个算法问题而已,当然因为这个问题十分复杂,其解决算法也相对复杂.我们学的数据结构与算法分析也是讲算法的,只是讲的基础算法,换句话说讲的是算法导论,而编译原理这门课程讲的就是比較专注解决一种的算法了.在20世纪50年代,编译器的编写一直被觉得是十分困难的事情

编译原理学习笔记 -- 绪论1

1. 语言处理器 语言处理系统 _________ 经过预 _______ 源程序 --> |预处理器| --> 处理的 --> |编译器| --> 目标汇编程序 -------- 源程序 ------- _______ 可重定位的 ______________ --> |汇编器| --> 机器代码 --> |链接器/加载器| --> 目标机器代码 ------- -------------- ↑ 库文件/可重定位对象文件 预处理器:把源程序聚合在一起,并宏

编译原理学习

编译原理学习笔记---- 不确定有穷自动机(NFA) 一个不确定的有穷自动机T是一个五元组,M={K,∑,f,S,Z} ⒈K是一个有穷集他的每一个元素称作一个状态. ⒉∑是一个字母表,他的每一个元素称为一个输入符号. ⒊f是一个从Kx∑*到K的子集映射即K*∑*->2^K,其中2^K表示K的幂集. ⒋S包含于K集,是一个非空初态集合. ⒌Z包含于K是一个非空的终态集合. 确定有穷自动机(DFA) 一个确定的有穷自动机M是一个五元组:M=(K, ∑,f,S,Z)其中, 1)K是一个有穷集,他的每个

[编译原理学习]词法分析

此前一直没能系统完整地学过编译原理,只有很粗浅的理解,虽然其实对工作里的任务也没啥影响,但总觉得缺了一大块知识,加上对所谓程序员三大浪漫(编译器,操作系统,图形学)的向往,所以最近跟着网易云课堂推出的计算机专业课程来学习编译原理.无奈生性懒惰,常常下班之后觉得累了,打打游戏啊看看视频啊,拖延症就犯了.......所以在这里打算将学习的过程,心得记录下来,也算是对自己的一个督促.课程传送门http://mooc.study.163.com/learn/USTC-1000002001#/learn/

编译原理学习:TINY语言词法扫描程序实现

最近对解释型程序(类似python或者是linux里的bc计算器)非常感兴趣,就开始学习一下编译原理.今天自己实现了TINY语言的词法扫描程序.大部分参考<编译原理及实践>一书.但是我做了一些小小的改进. 先说一下TINY语言: 1.注释:放在一对大括号内.书上的注释不能嵌套,我做了一点改进,允许嵌套. 2.关键字:read write if end repeat until else 3.类型:只支持整型和布尔型. 4.计算:+ - * / ( ) < = :=,其中:=为赋值运算,=

0909 关于编译原理学习的想法

1.编译原理旨在介绍编译程序构造的一般原理和方法,关注的是编译器方面的产生原理和技术问题.学习编译原理有利于提高编程人员的素质和技术. 2.通过学习编译原理可以更好地了解程序设计语言的内部机制,从而更好地了解和运用程序设计语言,最终能运用编译程序构造的原理和技术完成相关软件工具的设计和开发工作. 3.(1)反复钻研书本:(2)结合源代码来学习:(3)先行学习简单的,提高兴趣,再来学习困难的. 4.

编译原理学习随笔

编译原理就是什么? 编译原理是计算机必修的一门重要学科.编译原理及技术从本质上来讲就是一个算法问题而已,当然由于这个问题十分复杂,其解决算法也相对复杂. 我们学的数据结构与算法分析也是讲算法的,不过讲的基础算法,换句话说讲的是算法导论,而编译原理这门课程讲的就是比较专注解决一种的算法了. 学习编译原理有什么好处? 可以大大提高我们的编程能力,能更好的了解计算机内部运行结果,对进一步研究计算机系统有很大帮助,同时学会了编译原理也相当于学会了一种解决问题的方法,而且是强有力的方法.能让你一直在寻求高

编译原理学习基本概念汇总

对于计算机专业的学生来说,肯定听说过或者上过一门课,叫做--编译原理,被称为计算机专业的天书,反正不管是学习这门课的时候,还是现在,我都是没搞懂其中的技术和知识.但就期末考试而言,提前做了几道题目,得到了90+的分数,也算是可喜可贺.各位ITer如果想检验自己的智商的话,大可以去学习编译原理,你会收获很多的.现在我把大学时整理的编译原理最基本的概念分享出来. 第一章-绪论 1. 翻译,是指在计算机中放置一个能由计算机直接执行的翻译程序,它以某一种程序设计语言(源语言)所编写的程序(源程序)作为翻

编译原理学习笔记(十一)错误处理

错误处理 说明:以老师PPT为标准,借鉴部分教材内容,AlvinZH学习笔记. 1. 目标:编译程序对于语法和语义正确的源程序要正确地编译生成等价的目标代码:而对于错误的源程序不能一发现就停止,而是要能检查出错误的性质和出错位置,并使编译能继续下去,同时尽可能多而准确地发现错误和指出各种错误. 2. 编译器的错误处理能力 诊察各类错误的能力. 报错及时准确(出错位置,错误性质). 一次编译找出错误的多少. 改正错误的能力. 遏制重复错误信息的能力. 3. 错误分类:语法错误.语义错误. 语法错误