《CLR Via C#》 学习心得一 CLR基础知识

《CLR Via C#》 学习心得系列,主要是为了最近在看《CLR Via C#》这本书时写的笔记和心得,为了以后回头看时能方便自己查阅并且顺道巩固下基础知识,所谓勿在浮沙筑高楼,就是这个道理,万变不离其宗,基础很重要,好了,闲话不聊了,开始我的心得记录吧。

1,CLR定义

  公共语言运行时(Common Language Runtime),是一个可由多种编程语言使用的运行时。它的核心功能包括(内存管理、程序集加载、安全性、异常处理和线程同步等),是由面向CLR的所有语言使用。在运行时候,它根本不管开发人员用哪一种语言来写源代码,可由任何编程语言来开发代码,只要编译器是面向CLR就可以了,然后CLR是通过.NET Framework来执行的,这意味着必须在目标机器上安装好.NET Framework,一台机器上可能同时安装好几个版本的.NET Framework,可以通过相关的命令了解到一台机器上已经安装了哪些版本。

2,编译器的作用

  CLR中的编译器可以分为语法检查器和“正确代码”的分析器。它们检查源代码,确定你写的代码是有意义的,然后输出对你意图进行描述的代码。无论选用哪一个编译器,最终都是一个托管模块。托管模块有以下几个部分组成:1,PE32或PE32+头。标准的windows   PE文件头,类似于“公共对象文件格式”头;2,CLR头。包含是这个模块成为一个托管模块的信息;3,元数据。每个托管模块都包含元数据表,主要有两种类型的表:一种类型的表描述源代码中定义的类型和成员;另一种类型的表描述源代码引用的类型和成员;4,IL代码。编译器编译源代码时生成的代码,在运行时,CLR将IL编译成本地CPU指令。

来张图显得更形象些:

image

3,元数据的用途

  简单地说,元数据(metadata)是一组数据表。其中一些数据表描述了模块中定义的内容,比如类型及其成员。还有一些元数据描述了托管模块引用的内容,比如导入的类型和内容。用途如下:

1,编译时,编译器可直接从托管模块中读取元数据。

2,Microsoft Visual Studio使用元数据帮助写代码,比如智能感知技术。

3,使用元数据,可以确保代码执行“类型安全”的操作。

4,元数据允许一个对象的字段序列化到一个内存中,将其发送到另一台机器,然后反序列化,在远程机器上重建对象的状态。

5,元数据允许垃圾回收器跟踪对象的生命周期。

4,程序集的概念

  首先,程序集是一个或多个模块/资源文件的逻辑性分组。其次,程序集是重用、安全性以及版本控制的最小单元。实际上是有一个“清单”的这种概念。

5,JIT的概念

  为了执行一个方法,首先必须把它的IL转换本地CPU的指令。这就是CLR的JIT(Just-In-Time或者即时)编译器的职责。里面有个JITCompiler函数负责将一个方法的IL代码编译成本地CPU指令,本地CPU指令被保存到一个动态分配的内存块中,然后,JITCompiler返回CLR为类型创建的内部数据结构,找到被调用的方法对应大那一条记录,修改最初对JITCompiler的引用,让它指向内存块的地址,最后,JITCompiler函数跳转到内存块中的代码。JIT编译器将本地CPU指令存储到动态内存中,一旦应用程序终止,编译好的代码也会被丢弃。但一个方法只有在首次调用时才会造成一些性能损失,以后对该方法的所有调用都以本地代码的形式全速运行,无需重新验证IL并把它编译成本地代码。

6,IL和验证

  IL是基于栈的,这意味着它的所有指令都要将操作数压入一个执行栈,并从栈弹出结果。IL指令还是“无类型”的,它的最大优势在于应用程序的健壮性和安全性,将IL编译成本地的CPU指令时,CLR会执行一个名为验证的过程。

7,Framework类库

  FCL(Framework Class Library)是一组DLL组成的程序集的统称。

  应用程序部分:

  1,Web服务(Web Service) 比如wcf技术。

  2,Web窗体应用程序(Web Form) 比如网站技术,asp.net技术。

  3,windows 应用程序。比如wpf技术

  4,富Internet应用程序(Rich Internet Application,RIA)

  5,windows 控制台应用程序。

  6,windows服务。

  7,数据库存储过程。

  8,组件库。

8,通用类型系统(CTS)

  CTS(Common Type System),因为CLR是围绕类型展开的,类型为应用程序和其他类型公开了功能,通过类型,用一种编程语言写的代码能与用另一种语言写的代码沟通,那么需要一个正式的规范,即“通用类型系统”,它描述了类型的定义和行为。

  主要包括了以下内容:

  1,字段(Field) 一个数据变量,是对象状态的一部分。

  2,方法(Method) 一个函数,能针对对象执行的一个操作,通常会改变对象的状态。方法有一个名称、一个签名以及一个或多个修饰符。

  3,属性(Property) 属性允许实现者在访问者之前对输入参数和对象状态进行校验。

  4,事件(Method) 事件在对象以及其他相关对象之间实现了一个通信机制。

  还有一些访问修饰符比如public、protected、private、internal。这些所有的类型最终必须从预定义的System.Object类型继承。

9,公共语言规范(CLS)

  CLS(Common Language Specification),它详细定义了一个最小功能集。因为CLR使用了标准的类型集、元数据、以及公共执行环境。任何编译器生成的类型如果想要兼容于其他“符合CLS,面向CLR的语言”所生成的组件,就必须支持这个最小功能集合。如图:

原文地址:https://www.cnblogs.com/cr330326/p/2715749.html