本文脉络图如下:

1、CLR(Common Language Runtime)公共语言运行时简介

(1)、公共语言运行时是一种可由多种编程语言一起使用的"运行时".

(2)、CLR的核心功能可由面向CLR的所有语言使用,例如:"运行时"使用异常来报告错误,因此面向CLR的所有语言都使用异常来报告错误.另外,CLR允许创建线程,所以所有面向CLR的编程语言都允许创建线程.

(3)、运行时,CLR并不关心程序使用的是哪种语言,只要该语言是面向CLR的就行.

2、面向CLR的语言编译器

3、面向CLR的语言编译器编译源代码的过程,以C#为例

我们可以使用任何面向CLR的语言创建源文件,然后用对应的编译器去检查语法和源代码,无论选择哪个编译器,通过编译器编译后生成的都是托管模块((IL)中间语言和元数据的组合).

本地代码编译器(native code compilers)生成的是面向特定CPU架构(比如X86、X64、ARM)的代码。相反,面向CLR的每个编译器生成的都是IL(中间语言)代码(IL代码有时被称为托管代码,因为CLR管理它们的执行),除了生成IL(中间语言),面向CLR的每个托管模块中生成完整的元数据.

(1)、托管模块

托管模块简介

标准的32位Microsoft Windows可移植执行体(PE32)文件

标准的64位Microsoft Windows可移植执行体(PE32+)文件

它们都需要CLR才能执行.

注:托管模块总是利用Windows的数据执行保护(Data Execution Prevention,DEP)和地址空间布局随机化(Adress Space Layout Ramdomization),这两个功能旨在增强整个系统的安全性.

托管模块构成

PE32或PE32+头:标准Windows PE文件头,类似于"公共文件对象格式"(Common Object Format,COFF)头。

注:如果文件头使用PE32格式,文件能在Windows的32位版本和64位版本上运行,如果文件头是PE32+格式,那么该文件只能在Windows64位版本上运行.

文件头还标识了文件类型,包括GUI、CUI或者DLL,并包含一个时间标记来指出文件的生成时间.对于只包含IL代码的模块,PE32+头的大多数信息会被忽视.如果是包含本机CPU代码的模块,这个头包含与CPU代码有关的信息.

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

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

IL(中间语言)代码:编译器编译源代码时生成的代码.在运行时,CLR将IL编译成本机CPU指令.

(2)、元数据详解

元数据简介:

元数据大致构成:包括com的"类型库"和"接口定义语言"(Interface Definition Language,IDL)文件,但CLR数据远比它们全面.

注:元数据总是嵌入和代码相同的EXE/DLL文件中,这使两者密不可分,由于编译器和源代码同时生成元数据和代码,把它们绑定到一起,并嵌入到最终生成的托管模块,所以元数据和IL代码永远不会失去同步.

元数据的用途:

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

2、visual stdio的智能提示通过解析元数据的方式,来告诉我们一个类型有哪些属性、方法、字段、事件,来提高我们的开发效率.

3、CLR的代码验证过程中确保代码只执行类型安全的操作.

4、元数据允许将对象的字段序列化到内存中,在发送到另外一台机器,进行反序列化,重塑对象的状态.

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

Microsoft的C#、Visual Basic,F#和IL汇编器总是生成包含托管代码(IL)和托管数据(可进行垃圾回收的数据类型)的模块。为了执行包含托管代码以及/或者托管数据的模块,最终用户必须在自己的电脑上安装CLR(目前作为.Net Framework的一部分提供)

C++编译器默认生成包含非托管(native)代码的EXE/DLL模块,并在运行时操纵非托管数据(native 内存),这些模块不需要CLR即可执行,通过命令行开关,C++编译器就更能生成包含托管代码的模块,当然用户必须安装CLR才能执行这种代码,在前面提到的所有的Microsoft编译器中,Misrosoft C++编译器是独一无二的,只有它才允许开发人员同时写托管代码和非托管代码,并生成到同一个模块中,它也是惟一一个允许开发人员在源代码中定义托管非托管数据类型的Microsoft编译器.它的灵活性是其他编译器无法比拟的,因为它允许开发人员在托管代码中使用原生C/C++代码,时机成熟之后在使用托管类型.

C 设计语言编译生成的是中间语言IL,一、源代码-面向CLR的编译器-托管模块-(元数据IL代码)...相关推荐

  1. 是计算机程序设计语言的是,计算机设计语言

    计算机设计语言是编写计算机程序所用的语言,可分为机器语言.汇编语言和高级语言.[1] 中文名 计算机设计语言 外文名 Computer language design 定    义 编写计算机程序的语 ...

  2. 计算机设计语言常用的英语,计算机设计语言

    计算机设计语言是编写计算机程序所用的语言,可分为机器语言.汇编语言和高级语言.[1] 中文名 计算机设计语言 外文名 Computer language design 定    义 编写计算机程序的语 ...

  3. 编译器-FORTRAN(公式翻译)语言,第一个全球正式推广的高级语言,Pascal(帕斯卡)可称为第一个结构化程序设计语言Pascal基于ALGOL编程语言BASIC初学者通用符号指令代码17语句微软

    编译器-FORTRAN(公式翻译)语言,第一个全球正式推广的高级语言,Pascal(帕斯卡)它可称为第一个结构化程序设计语言,Pascal基于ALGOL编程语言,ALGOL是算法语言(ALGOrith ...

  4. 谷歌发布全新设计语言:跟苹果Swift天壤之别

    今日凌晨,谷歌(微博)在I/O大会上发布了全新设计语言Material Design.在20多天前的WWDC上,苹果也发布了全新编程语言Swift.两家科技巨头公司,在一年一度的开发者大会上,都发布了 ...

  5. mfc程序转化为qt_以“企鹅电竞小程序”改版为例,讲解如何将用户核心路径转化为设计语言...

    前言 用户路径是指用户达到目标时一系列的操作.我们可以将用户在产品中由开始到结束的整个过程划分成很多节点,用户从一个节点到另一个节点的过程可以被视为是一条路径.用户路径主要分为两种:一种是用户找寻信息 ...

  6. 【Windows Phone】Metro设计语言

    1. 定义:Metro设计语言是基于交通运输业中所采用的经反复改进的标志.信号.字体和布局. 2. 设计准则 简洁.轻巧.开放.迅捷 软硬件结合 内容而非边框 热情与活力 3. 用户体验 - 红线准则 ...

  7. 华为云设计语言_《好设计,有方法:我们在搜狐做产品体验设计》 —2.2 设计语言带来的好处...

    2.2 设计语言带来的好处 为什么要提出设计语言的概念呢? 设计语言是设计的基础,是为设计的想象力打好一个地基.设计语言的建立,能在设计层面创建一个全面的视角,帮助整个设计团队遵循相同的方法和模式,确 ...

  8. 谷歌新语言重写android,谷歌将推新设计语言 安卓APP用户界面将换新颜

    腾讯科技讯 6月15日消息,随着安卓系统成为移动操作系统的王者,微博)也正在投入精力,解决自家和第三方安卓应用用户界面.风格在各种终端不一致的问题.据美国科技媒体报道,谷歌将推出一个新的设计语言,统一 ...

  9. 用vhdl语言设计一个小游戏_用最直白的设计语言营造梦想的办公空间

    两间室内设计新工作室位于钱塘江西侧,毗邻西湖山脉.建筑原本是一幢地处村落中心的4层民居房,建筑外围有一个绿化大庭院,可休闲可聚会活动,具备良好的天然条件.由于此次设计项目是我们自己的办公空间,所以希望 ...

最新文章

  1. 串口服务器支持多台上位机,RS485多机通信一台上位机两台下位机问题,
  2. 原阿里中供梁法锋:O2O产品的地推管理 | SHARE 2015产品经理O2O论坛实录
  3. boost::isomorphism用法的测试程序
  4. wcf rest系列文章
  5. [deviceone开发]-do_Album的简单示例
  6. php数组转化js数组格式化,php数组转换成js数组
  7. java 防止证书导出_如何把安全证书导入到java中的cacerts证书库
  8. java多对多关系实例_【Java一对多关系实例公布,你的Java真的可以玩的这么好吗】- 环球网校...
  9. 设计即开发,如何打通软件研发的“任督二脉”?
  10. L1-053 电子汪-PAT团体程序设计天梯赛GPLT
  11. Unity项目中的资源管理
  12. git简单使用(下篇)
  13. 跟我一起学C++课程笔记(第一天)
  14. 181220每日一句
  15. python超清壁纸_python爬虫 爬取超清壁纸代码实例
  16. SEO网站内容优化的6点干货分享分享-飞鱼SEO
  17. 【转】常用邮箱的 IMAP/POP3/SMTP 设置
  18. Learning to Predict Context-adaptiveConvolution for Semantic Segmentation阅读笔记
  19. 推荐系统-排序算法:GBDT+LR
  20. Go:Cos求余弦(附完整源码)

热门文章

  1. html中如何华直角坐标系,空间直角坐标系的画法..ppt
  2. c语言printf输出中文报错,printf输出中文后还带有数字是怎么回事?
  3. Spring Boot+Mysql实现的电影在线资讯系统
  4. 基于JAVA+SpringMVC+Mybatis+MYSQL的大学生毕业设计管理系统
  5. 基于JAVA+SpringMVC+MYSQL的自动排课系统
  6. H5页面移动端IOS键盘收起焦点错位
  7. 利用Sigar获取系统信息
  8. HTTP权威指南-学习笔记(三)HTTP方法,状态码
  9. Codeforces Round #243 (Div. 2) A~C
  10. 在.NET环境中实现每日构建(Daily Build)--ccnet,MSBuild篇