第1章CLR的执行模型1.1

1.1将源代码编译成托管代码模块

如上图,用支持CLR的任何一种语言来创建源代码文件。再用一个对应的编译器来检查语法和分析源代码。经编译器编译后生成托管模块(managed module),它是一个可移植执行体文件,它可能是32位(PE32)文件,也可能是64位(PE32+)文件。托管模块包括中间语言元数据,需要CLR才能执行。

公共语言运行时(Common Language Runtime, CLR)是一个供多种编程语言使用的运行时。可用任何编程语言来开发代码,只要编译器是面向CLR的就行。

CLR也可以看作是一个在执行时管理代码的代理,管理代码是CLR的基本原则。能够被管理的代码称为托管(managed)代码,反之称为非托管代码。

CLR的核心功能中的内存管理、程序集加载、安全性、异常处理和线程同步等可被面向CLR的所有语言使用。

托管模块是一个需要CLR环境才能执行的标准windows PE文件,包含IL和元数据以及PE表头和CLR表头。:

  • PE32/PE32+ 头:标准的 Windows PE文件头。包含文件类型(如GUI、CUI等),以及文件创建时间等信息。如果文件头使用PE32格式,则此文件只能在Windows 的32位或64位版本上运行;如果文件头使用PE32+格式,则此文件只能在Windows 的64位版本上运行。
  • CLR表头:包含标识托管模块的一些信息。如CLR版本号,托管模块入口点方法(main方法)以及MethodDef元数据等等。
  • IL代码:也是中间语言。编译器编译源代码时生成的中间代码,在执行环境中,这些IL代码将被CLR的JIT编辑器翻译成CPU能识别的指令,供CPU执行。
  • 元数据实际上是一个数据表集合,用来描述托管模块中所定义和引用的内容。VS能够智能感知就得益于元数据的描述。

PE (Portable Execute) 文件是微软Windows操作系统上的程序文件,EXE、DLL、OCX、SYS、COM都是PE文件。

本地代码编译器(native code compiler)生成的是面向特定CPU架构(比如x86,x64)的代码。相反,每个面向CLR的编译器生成的都是IL代码。

中间语言IL(Intermediate Language)代码:编译器编译源代码后生成的代码(.exe或.dll文件),但此时编译出来的程序代码并不是CPU能直接执行的机器代码。在运行时,CLR的JIT编辑器将IL代码编译成本地CPU指令。

CPU:中央处理器(Central Processing Unit),是一台计算机运算核心和控制核心。它的功能主要是解释计算机指令以及处理计算机软件中的数据。

DLL (Dynamic Link Library) 文件为动态链接库文件,是一种作为共享函数库的可执行文件。在Windows中,许多应用程序并不是一个完整的可执行文件,它们被分割成一些相对独立的动态链接库,即DLL文件,放置于系统中。当我们执行某一个程序时,相应的DLL文件就会被调用。多个应用程序也可以同时访问内存中单个 DLL 副本的内容。DLL 有助于共享数据和资源。

动态链接与静态链接的不同之处在于:动态链接允许可执行模块(.dll 文件或 .exe 文件)仅包含在运行时定位 DLL 函数的可执行代码所需的信息。在静态链接中,链接器从静态链接库获取所有被引用的函数,并将库同代码一起放到可执行文件中。

使用中间语言的优点(跨平台,跨语言):

  • 可以实现平台无关性,即与特定CPU无关。
  • 只需把.NET框架中的某种语言编译成IL代码,就实现.NET框架中语言之间的交互操作。

元数据(Metadata)是描述数据(类型信息) 的数据,通常被解释为data about data,是由一组数据表构成的一个二进制数据块。元数据被CLR编译器编译后保存在Windows可移植执行体(PE)文件中,即和它描述的IL嵌入在EXE/DLL文件中,使IL和元数据永远同步。

元数据主要的类型表:

  • 定义表 描述当前程序集中定义的类型和成员信息。
  • 引用表 描述任何一个被内部类型引用的外部的类型和成员信息。
  • 清单表包含了组成程序集所需要的所有信息,同时包含了对其他程序集的引用信息。

元数据的用途:

  • 编译时,元数据消除了对本地C/C++头和库文件的需求,因为在负责实现类型/成员的IL代码文件中,已包含和 引用的类型/成员有关的全部信息。编译器可以直接从托管模块读取元数据。
  • CLR的代码验证过程中使用元数据确保代码只执行“类型安全”的操作。
  • VS使用元数据帮助您写代码。它的“智能感知”(IntelliSense)技术可以解析元数据,指出一个类型提供了哪些方法、属性、事件和字段。
  • 元数据允许将一个对象的字段序列化到一个内存中,将其发送给另一台机器。然后反序列化,在远程机器上重建对象的状态。(内存:与CPU进行沟通的桥梁,计算机中所有程序的运行都是在内存中进行的,因此内存的性能对计算机的影响非常大)。
  • 元数据允许垃圾回收器跟踪对象的生存期,垃圾回收器能判断任何对象的类型,并从元数据知道那个对象中哪些字段引用了其他对象。
时间: 2024-10-03 01:19:14

第1章CLR的执行模型1.1的相关文章

第一章 CLR的执行模型

概念篇 CLR(Common Language Runtime)[公共语言运行时] 可由多种编程语言使用的运行环境,提供内存管理.程序集加载.安全性.异常处理和线程同步等支持. CTS(Common Type System)[通用类型系统] 规范化的类型定义和管理,比如:字段.方法等, 又比如继承等特性. CLS(Common Language Specification)[公共语言规范] 针对CLR/CTS定义的最基本的组建. Manuged Module[托管模块] 标准的32位Mircor

01.由浅入深学习.NET CLR 基础系列之CLR 的执行模型

.Net 从代码生成到执行,这中间的一些列过程是一个有别于其他的新技术新概念,那么这是一个什么样的过程呢,有什么样的机制呢,清楚了这些基本的东西我们做.Net的东西方可心中有数.那么,CLR的执行模型是一个什么样的过程呢? 将源代码编译成托管模块 --> 将托管模块合并成程序集 --> 加载公共语言运行时 --> 执行程序集的代码 目录 将源代码编译成托管模块 将托管模块合并成程序集 加载公共语言运行时 执行程序集的代码 本地代码生成器:NGen.exe Framwork类库入门 通用类

第一章、 CLR的执行模型

1. 概述 本章主要是介绍从源代码到可执行程序的过程中,CLR所做的工作. 2. 名词解释 ① 公共语言运行时(Common Language Runtime, CLR),是一个可由多种语言使用的 运行时,核心功能(内存管理.程序集加载.安全性.异常处理和线程同步)可由面向CLR的所有语言使用. ② PE32:32位 Microsoft Windows 可移植执行体.    PE32+:64位 Microsoft Windows 可移植执行体. ③ 元数据 是一组数据表,这些数据表描述了 模块中

【C#进阶系列】01 CLR的执行模型——一个Hello World的故事

好吧,废话少说,先上一章Hello World图: 我们有了一个Hello world程序,如此之简单,再加上我今天没有用汉字编程o(>﹏<)o,所以一切很简单明了. 故事开始: 编译: 一个程序写完肯定要编译,以前什么C啊什么的都是编译成本机的CPU指令,但是我们的C#不是. C#,VB.NET都会把它们编译成托管模块,托管模块在一个标准的可移植的PE文件中.(那些懵懂的少年肯定慌了,这是什么鬼,又是托管模块又是PE文件的.莫慌,所有你听不懂的高大上的术语其实都很简单,你现在不需要懂,听我慢

CLR的执行模型(4):执行程序集的代码

一直觉得,一本书的第一章是一定要读通的,这样子才知道这本书适不适合自己.所以,对于第一章的内容,我就啰嗦一些了. 托管程序集同时包含元数据和IL.IL是和CPU无关的机器语言,并且比大多数CPU语言都高级.IL能访问和操作对象类型,并且提供了创建和初始化对象的指令.调用对象上的虚方法以及直接操作数组元素.甚至实现了抛出和捕捉异常的指令,所以可将IL看成一种机器语言. 为了执行方法,首先必须吧方法的IL转换成本机CPU指令.这是CLR的JIT的职责. 下图展示了一个方法首次调用时候发生的事情: 在

01.CLR的执行模型

在非托管的C/C++中,可以进行一些底层的操作 "公共语言运行时"(CLR)是一个可由多种编程语言使用的"运行时" CLR的核心功能包含: 内存管理 程序集加载 安全性 异常处理 线程同步 可由支持CLR的编程语言编写源代码,再由对应的编译器检查语法和分析源代码,最后都会生成托管模块,托管模块需要CLR才能执行 托管模块的组成: PE32或PE32+头:包含与本地CPU代码相关信息 CLR头:托管模块的头信息,包含CLR版本,一些标志等 元数据:元数据表,包含源代码

01 CLR 的执行模型

1.先将不同语言的代码生成托管模块. 如图,每个语言有自己对应的编译器. 和普通编译器不同,这个编译器是生成IL代码,不是直接的机器码. 编译也就是我们平时生成的过程. f5 c# 调用 C:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe (我是这个版本,不同版本路径不同) 来编译. 也就是说.其实如果你不VS做开发, 可以只安装 .net Framework,写好代码之后通过它来编译 无视那个警告. 这就编译好了. 他可以是一个 DL

clr的执行模型(中)

1.1   执行程序集的代码 托管程序集包含IL和元素据.某种程度上IL可以当作面向对象的机器语言. 为了执行方法,需要把IL转换成本机CPU指令,由clr的JIT(just-in-time,即时)编译器完成.需要注意的是:Jit将cpu指令存在内存,程序终止时,需要重新编译cpu指令.性能方面,对大多数程序JIT造成的性能损失不显著. 1.1.1    IL与验证 IL是基于栈的,指令需要压入与弹出. IL编译成cpu指令时,CLR会执行 验证(verification)的过程,检查高级IL代

clr的执行模型(下)

1.1   通用类型系统 Common type system用于描述类型的定义和行为,具体可以看ECMA,最好了解一下es5 es6. 一个类可以包含0个或多个成员,字段.方法.属性.事件. Private 类内部访问 Assembly 同一程序级访问 Family or assembly 由程序集中的派生类访问 Public 任何人都可以访问 1.2   公共语言规范 不同语言创建的对象可通过com相互通信,clr使用标准类型集.元素据.公共执行环境集成了所有语言.Common langua