CLR简介(一)
什么是通用语言运行时(CLR),简单来讲:
CLR是一个支持多种编程语言及多语言互操作,完整的高级虚拟机。
有点拗口,而且不是很有启发性,但上面的文字是将又大又复杂的CLR的功能归类以便容易理解的第一步。它从一万英尺的高度来帮助我们理解CLR的设计目标。从这个高度明了CLR之后,我们可以深入其各个组件了。
CLR: 一个(极少见的)完整编程平台
每个程序在运行的时候都有惊人数量的运行时依赖。虽然程序很明显都是由一种特定的编程语言写就,但这只是程序员编写程序多种依据中的一种。每个有用的程序都需要某些 运行时函数库 以便其能跟电脑的其它资源(如用户输入设备,磁盘文件,网络通信等)交互。程序也需要转换成计算机硬件可以直接执行的某种格式。这些依赖的数量是如此之多,范围之广,使得编程语言的设计者通常都引用其它标准来规范它们。例如C++编程语言不会规定C++程序的格式,每个C++编译器都会与特定的硬件架构(如x86架构)关联,与特定的操作系统环境(如Windows,Linux或者Mac OS)关联,这些架构和环境会规定可执行文件的文件格式以及加载的方式。因此,程序员不是在编写一个“C++可执行程序”,而是“Windows X86可执行程序”或“Power PC Mac OS可执行程序”。
复用现有的硬件或操作系统标准通常都是好事情,但其使得在现有标准之上抽象出新的规范变得很难。例如,今天的操作系统没有支持垃圾回收的堆。因此也就无法使用现有的标准来支持垃圾回收的接口(如,将字符串传来传去,不需要关注删除它们)。同样,一个典型的可执行文件格式只提供足够运行程序的信息,但不足够编译器将其他可执行文件绑定在一起运行。比如说,C++程序一般都使用包含经常使用功能(如printf)的标准库(在Windows里是msvcrt.dll),但只有这个库是不够的。没有对应的头文件(如,stdio.h),程序员是无法使用这些函数库的。因此,已有的可执行文件格式标准不能同时描述可执行的文件格式,并添加其它一些信息。
CLR通过定义一个 [非常完整的规范]ecma-spec来描述一个程序从编译、到部署时绑定依赖、到运行整个生命周期的所有信息。因此,除去其他细节,CLR定义了
- 一套支持GC,并包含自己的执行程序基本操作的指令集(通用中间语言 - CLI)的虚拟机,这也就意味着CLR不需要依赖指定类型的CPU;
- 一套描述程序里声明的元素(如类型、值、变量等等)的元数据,以便编译器在生成其它可执行文件时有足够的信息来从“外部”调用程序里的功能;
- 一个精确描述字节应该如何在文件里布局的文件格式,这样我们在讨论CLR EXE的时候,不与某个特定的操作系统或电脑硬件绑定;
- 进程的生命周期语义,即一个CLR EXE引用其它CLR EXE的机制,和CLR在运行时找到进程依赖文件的规则;
- 利用CLR内置功能(如垃圾回收、异常和泛型等)的类库,其除了提供如整形、字符串、数组、列表和字典等基本功能意外,还提供了如文件、网络和UI交互等操作系统服务。
多编程语言支持
定义、规范和实现这些细节是一个艰巨的任务,这也就是类似CLR的完整抽象非常少的原因。实际上,大部分抽象都是为单个编程语言设计的。例如,Java运行时,Perl解释器或者早期的Visual Basic运行时提供了类似的完整抽象。但CLR跟这些先行者不同之处在于其支持多种编程语言。可能除了Visual Basic(因为它采用了COM对象模型),仅使用单个编程语言的体验是非常好的,但是要与其它编程语言互操作时体验就有点差了。编程语言之间互操作之所以困难,是因为这些编程语言仅能通过操作系统提供的原语来与“外族”编程语言通信。而操作系统的抽象层次太低阶(如操作系统不提供内存垃圾回收),就不得不采用一些复杂的技术。通过提供 通用语言运行时,CLR允许编程语言之间采用高阶结构(如可GC的数据结构)通信,大量减轻了互操作的麻烦。
由于运行时在 许多 语言之间共享,这就意味着更多的资源可被支持。为一个编程语言实现好的调试器和性能分析工具需要大量的工作,因此只有一些很重要的编程语言才有完整的工具链支持。然而,CLR上实现的编程语言可以共享这些基础架构,实现新的编程语言的工作量也大大缩减了。也许更重要的是,所有在CLR上实现的编程语言都可以访问 所有 在CLR上实现的类库。庞大且不断增长的(严格调试和支持)功能是CLR如此成功的一个重要原因。
简单来讲,CLR是一个将字节存到文件以创建和运行程序的完整规范。虚拟机可以使用不同编程语言写就的类库来运行这些程序。这个虚拟机,还有运行其上的不断增长的类库,就是我们说的通用语言运行时(CLR)。
来自文集:.NET框架源码解析
CLR简介(一)的更多相关文章
- .NET Framework (代码库、通用类型系统CTS、CLR) 简介
编译C#————>程序集(.exe..dll[MSIL]).元信息[数据信息].可选资源[图片.声音]) | | | ...
- CLR 简介
(一)CLR介绍 CLR是一个可以由多编程语言使用的运行时,CLR的核心功能:内存管理,程序集加载,安全性,异常处理,线程同步等等.可以被很多属于微软系列的开发语言使用. 事实上,在运行时,CLR根本 ...
- MFC,ATL,CLR简介
MFC.ATL和CLR是VC2005内置的3大库,涵盖了windows的各种开发方法和开发应用.当然关于 C++ 开发的库不止这3个,不过这3个是微软推荐.从编程所处层次而言,WIN32为最底层,其次 ...
- C# CLR简介
(一)CLR介绍 CLR是一个可以由多编程语言使用的运行时,CLR的核心功能:内存管理,程序集加载,安全性,异常处理,线程同步等等.可以被很多属于微软系列的开发语言使用. 事实上,在运行时,CLR根 ...
- 读经典——《CLR via C#》(Jeffrey Richter著) 笔记_CLR
1.CLR简介 全称:Common Language Runtime(公共语言进行时) 属性:一种托管模块 使用对象:面向CLR的所有语言(C#.Basic.IL...) 核心功能:内存管理.程序集加 ...
- .NET6 平台系列3 .NET CLR 详解
系列目录 [已更新最新开发文章,点击查看详细] CLR 简介 运行时(Runtime Environment,简称Runtime ),是指那些支持在特定的平台上,用于运行特定编程语言编写的软件 ...
- Visual C++2010开发权威指南 中文高清PDF - VC.NET
第一部分 Visual C++ 2010开发与新特性第1章 Visual C++ 2010开发环境简介 11.1 Visual C++ 2010简介 11.2 Visual C++ 2010下 ...
- 数组和CLR-非常特殊的关系
目录 数组和CLR-非常特殊的关系 公共语言运行时(CLR)的基础 内存和类型安全 实现细节 特殊帮助器类 移除边界检查 分配数组 运行时以不同的方式对待数组 进一步阅读 数组源码引用 参考文档 数组 ...
- 公共语言运行库(CLR)开发系列课程(1):Pinvoke 简介 学习笔记
前言 让拖管代码对象和非托管对象协同工作的过程称为互用性(Interoperability),通常简称为 Interop. P/Invoke在托管代码与非托管代码交互式时产生一个事务(Transiti ...
随机推荐
- Android各类权限意思祥解
1. android.permission.ACCESS_CHECKIN_PROPERTIES 允许读写访问”properties”表在 checkin数据库中,可以修改值上传 2. andro ...
- Windows Server 2008 R2 添加且制成“NFS服务器”角色后与Unix客户端匿名访问常见问题
在复杂的主机与网络环境中,我们可能会接触到多种主机与操作系统,配合Windows Server 2008 R2的原生“NFS服务器”功能可以让这样的复杂操作系统更方便应用. 然而面对网络上众多的帮助指 ...
- 软件工程 Coding.net代码托管平台 Git初学者的使用总结 五步完成 程序,文件,文件夹的Git
一.前言 第一次用git相关的命令行,我使用的是Coding.net代码托管平台.Coding.net 自主打造的基于 Git 的代码托管平台,提供高性能的远端仓库,还有保护分支,历史版本分屏对比. ...
- Linux入门
参考资料:http://www.92csz.com/study/linux/ [Linux系统目录结构] 登录系统后,在当前命令窗口下输入 ls / 你会看到 以下是对这些目录的解释: /bin bi ...
- 简析Geoserver中获取图层列表以及各图层描述信息的三种方法
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.背景 实际项目中需要获取到Geoserver中的图层组织以及各图层 ...
- 【面试】输出"蛇形"矩阵
一.题目描述 腾讯实习在线笔试的一道题目. 根据输入的数字(< 1000),输出这样的"蛇形"矩阵,如下.输入n,输出(n * n)阶矩阵,满足由外到内依次增大. 如: 输入 ...
- MongoDB-基础-limit-skip-sort
MongoDB Limit() 方法 如果你需要在MongoDB中读取指定数量的数据记录,可以使用MongoDB的Limit方法,limit()方法接受一个数字参数,该参数指定从MongoDB中读取的 ...
- Sublime Text 使用介绍、全套快捷键及插件推荐
开篇:如果说Notepad++是一款不错Code神器,那么Sublime Text应当称得上是神器滴哥.Sublime Text最大的优点就是跨平台,Mac和Windows均可完美使用:其次是强大的插 ...
- jquery技巧之让任何组件都支持类似DOM的事件管理
本文介绍一个jquery的小技巧,能让任意组件对象都能支持类似DOM的事件管理,也就是说除了派发事件,添加或删除事件监听器,还能支持事件冒泡,阻止事件默认行为等等.在jquery的帮助下,使用这个方法 ...
- 服务器Config文件不能查看的问题
由于某种需求,需要从IIS发布的服务中下载扩展名为config的文件,但是发布文件后,在浏览器无法查看文件.根据反馈的的错误提示,大致说config属于配置文件,处于安全考虑,不能随便浏览. 如果 ...