.NET学习笔记 -- 那堆名词到底是啥(CLR、CLI、CTS、CLS、IL、JIT)
什么是CLR?
CLR,公共语言运行时(Common Language Runtime)是一个由多种语言使用的“运行时”。他的核心功能包括(内存管理、程序集加载、安全性、异常处理和线程同步),可以被面向CLR的所有语言使用。这里的“运行时”,就是一个运行时环境,就像JAVA虚拟机一样。哦,错了,确切的说是JRE(Java Runtime Enviromental)。JVM确切的说不是一个实体的java虚拟机,而是一个规范,就像CLI一样。会有不同的实现,如:JRockit还是Hotspot(前者是Oracle的JVM商业实现,后者是Sun的开源实现——当然现在也是Oracle的)
什么是CLI?
公共语言基础结构(Common Language Infrastructure),定义了构成.NET Framework基础结构的可执行代码,以及代码运行时的环境规范。它定义了一个与语言无关的跨体系结构的运行环境,这使得开发者可以用规范内定义的各种高级语言来开发软件,并且无须修正即可将软件运行在不同的计算机体系结构上。CLI是一个开放型的技术规范,由微软、惠普和英特尔于2000年向ECMA倡议的。说白了,CLI就是一套规范,CLR是对CLI的一种实现。那么CLI这份规范中具体定义了哪些内容呢?不妨去ECMA的网站下一份看看,也可以在这里下载:
如上面截图所示:包含了6部分,:
Partition I: Concepts and Architecture –描述.NET CLI的全部体系结构,提供公共类型系统(CTS,Common Type System)、虚拟执行系统(VES,Virtual Execution System)和公共语言规范(CLS,Common Language Specification)的标准化描述,还提供对元数据(Metadata)的信息性描述。
通用类型系统(CTS):规范.NET中数据的类型。
元数据系统(Metadata):是.NET中描述数据的数据。
通用语言规范(CLS):描述多语言之间进行交互的语言规范,.NET系统包括的语言有C#、C++、VB、J#,它们都遵守通用语言规范。
虚拟执行系统(VES):是一个可运行受管理代码(Managed Code)的运行环境,它提供了运行受管理代码所需要的内置数据类型(data type),以及假定的机器型态与状态设置、流程控制与例外处理等参数。
Partition II: Metadata Definition and Semantics - 提供元数据的标准化描述,包括元数据在.NET扩展PE文件格式中的位置(以.NET扩展PE文件格式的形式表示),元数据的逻辑内容(以表格及其关联的集合的形式表示,实际上使用了形式化方法表示)和元数据的语义(以汇编成为虚拟机代码的汇编器ilasm理解的形式表示)。
Partition III: CIL Instruction Set –描述CIL的指令集(注意,是CIL,不是CLI哦)
Partition IV: Profiles and Libraries- 提供CLI库的简要介绍,以及将其分解为Profile和库的规范。这里有一个配套的文件CLILibraryTypes.xml,考虑过随这一部分一起发布,不过该文件是XML格式的,该文件提供了CLI库中每一个类、值类型和接口的细节说明。“Profile”一词在这里的含义是库的集合,一起组合起来构成提供一定功能级别的一致性整体,换而言之,不同的Profile对应不同的库集合,提供的功能级别也不同。
Partition V: Debug Interchange Format- 描述了CLI 产品的调试交互的标志方式;
Partition VI: Annexes- 提供了一些用ILAsm(CIL Assembly Language)写的例程等
什么是CTS?
CLR是完全围绕类型展开的,通过类型,通过一种编程语言写的代码可以与另一种语言写的代码沟通。所以Microsoft制定了一个正式的规范,“通用类型系统”(Common Type System,CTS),它描述了类型的定义和行为。上面已经提到,Microsoft已经将CTS和,NET Framework的其他组件 -- 包括(文件格式、元数字、中间语言及对底层平台的)提交给ECMA完成标准化工作,最终形成的标准称为“公共语言基础结构”(Common Language Infrastructure)。
CTS里定义了以下内容:
什么是CLS?
CLR中集成了多种语言,一种语言中可以调用另一种语言创建的对象。为了实现这一目的,微软定义了一个公共语言规范(Common Language Specification)。它详细定义了一个最小的功能集。任何编译器如果想生成类型兼容于其他“符合CLS,面向CLR语言”生成的组件,那么必须要支持这个最小功能集。下面用一张图来说明彼此间的关系:
什么是IL?
(截自《CLR.via.C#》)
先从上图看一下.net的编译过程,源代码文件经过编译器编译后生成托管模块(managed module)。托管模块说白了就是一个32位(PE32)或64位(PE32+)的PE文件。
具体的结构如下:
PE32或PE32+文件头 |
CLR头 |
元数据 |
IL代码 |
这里我们着重谈谈IL,IL是与CPU无关的机器语言,比大多数的CPU机器语言都要高级。能访问操作对象类型、创建及初始化对象、调用对象上的虚方法,直接操作数组元素,甚至能抛出和捕捉异常处理,可以说是一种面向对象的机器语言。
什么是JIT?它是如何工作的?
CLR执行托管模块,必须要将IL代码编译成本地CPU指令。这个事情由JIT(just in time)来执行。下面将以一个简单的例子来详细阐述JIT是如何工作的:
static void Main()
{
Console.WriteLine("Hello");
Console.WriteLine("Goodbye");
}
1、CLR在执行Main函数检查引用的所有类型,这里Main用到了Console类,CRL会为此分配一个内部结构。在这个结构中,Console类的所有方法都有对应的入口。
2、Mian首次调用WriteLine函数时,JITCCompiler函数会被调用。JITCCompiler知道是Console类定义了WriteLine函数,并在定义了Console类的程序集中查找WriteLine的IL代码。
3、动态分配一块内存;
4、对找到的IL代码进行验证,然后编译成本地CPU指令,将该指令放到前面动态分配的内存中;
5、修改内部结构中WriteLine函数的入口,使其指向动态分配的内存的地址;
6、JITCCompiler函数跳转到存有本地CPU指令;
7、执行完后,调回Main函数,继续执行后面的代码;
这里需要说明的是,第二次执行WriteLine函数的时候,并没有JIT啥事情了,因为会直接调用内存块中的本地CPU指令。
参考:《分清“语言/规范”以及“平台/实现”,以及跨平台.NET开发》
《CLR.via.C#》
.NET学习笔记 -- 那堆名词到底是啥(CLR、CLI、CTS、CLS、IL、JIT)的更多相关文章
- Android(java)学习笔记82:我们到底该如何处理异常?
我们到底该如何处理异常? 原则: 如果该功能内部可以将问题处理,用try,自己能解决就自己解决问题. 如果处理不了,交由调用者处理,这是用throws,自己不能解决的问题,我们就抛出去交个调用者解决这 ...
- Android(java)学习笔记22:我们到底该如何处理异常?
1. 我们到底该如何处理异常? (1)原则: 如果该功能内部可以将问题处理,用try,自己能解决就自己解决问题. 如果处理不了,交由调用者处理,这是用throws,自己不能解决的问题,我们就抛出去交个 ...
- [C#学习笔记]C#中的decimal类型——《CLR via C#》
System.Decimal是非常特殊的类型.在CLR中,Decimal类型不是基元类型.这就意味着CLR没有知道如何处理Decimal的IL指令. 在文档中查看Decimal类型,可以看到它提供了一 ...
- <老友记>学习笔记
这是六个人的故事,从不服输而又有强烈控制欲的monica,未经世事的千金大小姐rachel,正直又专情的ross,幽默风趣的chandle,古怪迷人的phoebe,花心天真的joey——六个好友之间的 ...
- Java学习笔记4
Java学习笔记4 1. JDK.JRE和JVM分别是什么,区别是什么? 答: ①.JDK 是整个Java的核心,包括了Java运行环境.Java工具和Java基础类库. ②.JRE(Java Run ...
- JVM学习笔记-第七章-虚拟机类加载机制
JVM学习笔记-第七章-虚拟机类加载机制 7.1 概述 Java虚拟机描述类的数据从Class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这个过程被 ...
- KTHREAD 线程调度 SDT TEB SEH shellcode中DLL模块机制动态获取 《寒江独钓》内核学习笔记(5)
目录 . 相关阅读材料 . <加密与解密3> . [经典文章翻译]A_Crash_Course_on_the_Depths_of_Win32_Structured_Exception_Ha ...
- EPROCESS 进程/线程优先级 句柄表 GDT LDT 页表 《寒江独钓》内核学习笔记(2)
在学习笔记(1)中,我们学习了IRP的数据结构的相关知识,接下来我们继续来学习内核中很重要的另一批数据结构: EPROCESS/KPROCESS/PEB.把它们放到一起是因为这三个数据结构及其外延和w ...
- JS 学习笔记--9---变量-作用域-内存相关
JS 中变量和其它语言中变量最大的区别就是,JS 是松散型语言,决定了它只是在某一个特定时间保存某一特定的值的一个名字而已.由于在定义变量的时候不需要显示规定必须保存某种类型的值,故变量的值以及保存的 ...
随机推荐
- Sql日期时间格式转换
sql server2000中使用convert来取得datetime数据类型样式(全) 日期数据格式的处理,两个示例: CONVERT(varchar(16), 时间一, 20) 结果:2007-0 ...
- jekyll安装的斗智斗勇
jekyll---将纯文本转化为静态网站和博客,GitHub Pages 可以运行 Jekyll,你很简单就可以完全免费的在 GitHub 上发布网站. 小白安装jekyll时的若干问题,有错误欢迎指 ...
- webDriver环境搭建与测试
1.安装jdk 2.安装eclipse 3.安装selenium 由于使用的是开发语言是java,因此需要安装java版的selenium包.下载地址:http://pan.baidu.com/s/1 ...
- PostMan插件安装
一直没装上postman,今天运气好,竟装上了 给大家show一下吧,也希望大家跟我一样走弯路甚至于走不过去!:) 1.下载Postman_v4.1.3.rar,这个是我测试验证并打包的: 加QQ群: ...
- 在項目中快速部署SLF4J+LOGBACK
想了解SLF4J,LOGBACK是什么?可以访问:http://www.slf4j.org/ http://logback.qos.ch/ 本文大部分参考了Cody Burleson<Ho ...
- hdu 1394 Minimum Inversion Number(树状数组)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1394 题意:给你一个0 — n-1的排列,对于这个排列你可以将第一个元素放到最后一个,问你可能得到的最 ...
- Linux系统安装VMware tools
VMware tools还是挺有用的,在两个不同系统随意拖拽文件,甚至文字的复制粘贴,功能强大. 废话不多说... 虽然VMware tools的安装帮助文档写的不错但是实际操作中发现,...还是有坑 ...
- ssh端口转发
http://blog.sina.com.cn/s/blog_47094def0101fvge.html
- java-注解
概念 Annontation是Java5开始引入的新特征.中文名称一般叫注解.它提供了一种安全的类似注释的机制,用来将任何的信息或元数据与程序元素(类.方法.成员变量等)进行关联.更通俗的意思是为程序 ...
- Python-变量
1.Python的变量是什么 变量是用来存储计算机程序中的信息,唯一的目的是将数据存储在内存中. 2.Python变量的组成 变量由字母.数字.下划线组成: 变量的第一位不能是数字,可以是字母或下划线 ...