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

一、公共语言运行时(CLR):

  1.CLR是一个可有多种编程语言使用的 “ 运行时 ”,CLR的核心功能可由面向CLR的所有语言使用。

    例如 “ 运行时  ”使用异常来报告错误、创建异常等,因此面向它的任何语言都能通过异常来报告错误和创建异常等

  2.CLR是不属于哪一种语言的,可由任何语言开发,只要编译器是面向CLR的,可以把编译器视为语法检查器和“ 正确代码 ”分析器,检查你的代码是否有意义

    例如:对于数学或金融我们可以使用APL语法来表达自己的意图

  3.CLR核心功能:内存管理、程序集加载、安全性、异常处理和线程同步

  4.面向CLR的语言编译器如下:

    Microsoft创建:

      C++/CLI、C#、Visual Basic、F#、Iron Python、 Iron Ruby  以及一个中间语言汇编器(IL)

    公司和大学等机构创建:

      Ada、APL、Caml、COBOL、Eiffel、Forth、Fortran、Haskell、Lexicon、LISP、LOGO、Lua、Mercury、ML、Mondrian、Oberon、Pascal、Perl、PHP、Prolog、RPG、Scheme、Smaltak、Tcl/Tk

  5.面向CLR的语言的代码执行过程:

      源代码(自己的开发代码)------->   面向CLR的编译器生成托管模块(IL和元数据)-----------> “运行时 CLR编译IL代码生成cpu指令

      注意:无论使用哪一个面向CLR的语言编译器,结果都是托管代码(IL(有时称为托管代码)和元数据),混合开发不是梦想

二、托管模块:

  1.托管模块是标准的32位 Microsoft Windows 可移植执行体(PE32)文件或则是标准的64位 Windows 可移植执行体(PE32+)

  2.托管程序集总是利用 Windows 的数据执行保护(Data Execution Prevention,DEP)和地址空间的随机化(Address Space Layout Randomization,ASLR),这两个功能旨在增强整个系统的安全性

  3.托管模块的各个部分如下:

    1)PE32或PE32+  

      标准Windows PE 文件头 类似于 “ 公共对象文件格式 ” 头(如果头是PE32,那么可以在Windows的32位或64位运行,PE32+,只能在Windows 32位运行)。这个头还标示了文件类型,包括GUI或者DLL,并包含一个时间标记来指出生成时间。对于只包含IL代码的模块,PE32+ 头的大多数数据会被忽略。如果是包含本机CPU代码由模块,这个头包含与本机CPU代码有关的信息

    2)CLR头

      包含使这个模块成为托管模块的信息(可有CLR和一些实用程序进行解释)。头中包含要求的CLR版本,一些标志(flag),托管模块的入口方法(Main方法)的MethodDef元数据、资源、强名词,一些标志及其他不太重要的数据项的位置/大小

    3)元数据

      每个托管模块都包含元数据表。主要有2种表:描述源代码中定义的类型和成员 和 源代码引用的类型和成员

    4)IL(中间语句)代码

      编译器编译时生成的代码。运行时,CLR将IL编译成本机CPU指令

三、IL(中间语言)代码:

  本机代码编译器生成的是面向特定的CPU架构(比如x86 x64 或 ARM)的代码,相反,每个面向CLR的编译器生成的都是IL(中间语句)代码,IL有时称为托管代码,因为CLR管理它的执行

四、元数据:

  除了生成IL(中间语言),面向CLR的编译器还会生成元数据,元数据简单一点说就是一个数据表集合,元数据是一些老技术的超集(例如:COM的 “类型库” 和接口定义语言文件等),另外,和类型库及IDL(IDL是Interface description language的缩写,指接口描述语言)不同的,元数据总是与包含IL代码的文件关联。事实上,元数据总是嵌入和代码相同的EXE/DLL文件中,这使两者密不可分。由于编译器同时生成元数据和代码,把它们绑在一起,并嵌入最终生成的托管模块,所以元数据和它描述的IL代码永不会失去同步

  1)元数据包含:

    1.一些数据表描述了模块中定义了什么类型和成员

    2.另一些描述了模块引用了什么类型和成员

  2)元数据的部分用途:

    1.元数据避免了编译时对原生c/c++头和库文件的需求,因为在实现类型/成员的IL代码文件中,已包含有关引用类型/成员的全部信息。编译器直接从托管模块中读取元数据

    2.vs编译器的 “ 智能感应 ” 技术会解析元数据,告诉你一个类型提供了哪些方法、属性、事件和字段。对于方法,还能告诉你需要什么参数

    3.CLR的代码验证过程适用元数据确保代码只执行 “ 类型安全 ” 的操作

    4.元数据允许将对象序列化到内存块,将其发送给另一台机器,然后反序列化在远程机器上重建对象状态

    5.元数据允许垃圾回收器跟踪对象生存期。垃圾回收器能判断任何队形的类型,并从元数据知道那个对象中的哪些字段引用了其他对象

课外补充:

  1.C/C++头和库文件的区别

    头文件中有函数的申明,库文件实现函数的定义。比如,printf函数。使用时应包括stdio.h,打开stdio.h你只能看到,printf这个函数的申明,却看不到printf具体是怎么实现的,而函数的实现在相应的C库中。而库文件一般是以二进制形式而不是C源文件形式提供给用户使用的。程序中包括了stdio.h这个头文件。链接器就能根据头件中的信息找到printf这个函数的实现并链接进这个程序代码段里。 

    总结起来就是,库文件(二进制)通过头文件(包含实现的地址)向外导出接口。用户通过头文件(地址)找到库文件中函数实现的代码从而把这段代码链接到用户程序中去

  2.什么是APL语法?

    APL语言(APL,A Programming Language的缩写)是一种表达能力很强的会话语言。应用范围包括数学统计、事务经营、信息检索、报表生成、财务预算等。它也可用于模拟计划管理、图形处理、正文编辑、计算机辅助教学等方面。APL的特点是,语法规则简单,运算符丰富,表达式简练,并包含多种构造和处理数据的运算符。它在数据加工和矩阵计算上特别有效,不过程序员具有较高的数学素养。

   3.COM组件

     COM component(COM组件)是微软公司为了计算机工业的软件生产更加符合人类的行为方式开发的一种新的软件开发技术。在COM构架下,人们可以开发出各种各样的功能专一的组件,然后将它们按照需要组合起来,构成复杂的应用系统。由此带来的好处是多方面的:可以将系统中的组件用新的替换掉,以便随时进行系统的升级和定制;可以在多个应用系统中重复利用同一个组件;可以方便的将应用系统扩展到网络环境下;COM与语言,平台无关的特性使所有的程序员均可充分发挥自己的才智与专长编写组件模块。

  

原文地址:https://www.cnblogs.com/zjdbk/p/10526898.html