



全文预览已结束
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C+, Java 和 C#的 编 译 过 程 解 析 1.1.1 摘 要 我们知道计算机不能直接理解高级语言,它只能理解机器语言,所以我们必须要把 高级语言翻译成机器语言,这样计算机才能执行高级语言编写的程序,在接下来的 博文中,我们将介绍非托管和托管语音的编译过程。 1.1.2 正 文 非托管环境的编译过程(C/C+) 纯 C/C+的程序通常运行在一个非托管环境中,类是由头文件(.h)和实现文件 (.cpp)组成,每个类形成了一个单独的编译单元,当我们编译程序时,几个基本 组件会把我们的源代码翻译成二进制代码,接下来我们通过以下图片说明非托管环 境的编译过程: 图 1 C/C+编译过程 首先是预处理器,如果在项目中有头文件和宏表达式,那么它将负责包含头文件和 翻译所有的宏观表达式。 接下来是编译器,它不是直接生成二进制代码,而是生成汇编代码(.s),这基本 上是所有现代的非结构化语言的共同基础。 然后,汇编程序把汇编代码翻译成目标代码(.o 和.obj 文件,机器指令)。 最后链接器,它把所有彼此相关的目标文件和生成的可执行文件或库链接起来。 总而言之,在一般情况下,我们的代码首先翻译成汇编代码,接着翻译成机器指令 (二进制代码)。 什么是宏? 在 C/C+中,宏是预处理指令,它有多种应用技术:包括预定义、创建关键字和 条件编译等等。在一般情况下,这些技术在 C+中使用被认为是不好的做法,主 要原因是有可能滥用 C+提供的语法变化功能,甚至有可能在不知情情况下创建 了非标准的语言,宏不遵循一般的源代码编译规则,由于它通过预处理来处理,而 不是编译器。 托管环境的编译过程(C#/Java) 在托管环境中,编译的过程略有不同,我们熟知的托管语言有 C#和 Java,接下来, 我们将以 C#和 Java 为例介绍在托管环境中的编译过程。 当我们在喜爱的 IDE 中编写代码时,第一个检测我们代码的就是 IDE(词法分析), 然后,编译成目标文件和链接到动态/静态库或可执行文件进行再次检查(语法分 析),最后一次检查是运行时检查。托管环境的共同特点是:编译器不直接编译成 机器码,而是中间代码,在.NET 中称为 MSIL - Microsoft Intermediate Language,Java 是字节码(Bytecode) 在那之后,在运行时 JIT( Just In Time)编译器将 MSIL 翻译成机器码,这意味着 我们的代码在真正使用的时候才被解析,这允许在 CLR(公共语言运行时)预编译 和优化我们的代码,实现程序性能的提高,但增加了程序的启动时间,我们也可以 使用 Ngen(Native Image Generator)预编译我们的程序,从而缩短程序的启动 时间,但没有运行时优化的优点。(JeffWong 的补充 Java 是先通过编译器编译成 Bytecode,然后在运行时通过解释器将 Bytecode 解释成机器码; C#是先通过编译 器将 C#代码编译成 IL,然后通过 CLR 将 IL 编译成机器代码。所以严格来说 Java 是一种先编译后解释的语言,而 C#是一门纯编译语言,且需要编译两次 。) 图 2 C#的编译过程 .Net Framework 就是在 Win32 core 上添加了一个抽象层,它提供的一个好处就是 支持多语言、JIT 优化、自动内存管理和改进安全性;另外一个完整解决方案是 WinRT,但这涉及到另外一个主题了,这里不作详细介绍。 图 3 Windows API JIT 编译的优点和缺点 JIT 编译带来了许多好处,最大的一个在我看来是性能的优势,它允许 CLR(通用 语言运行时扮演 Assembler 组件)只执行需要的代码,例如:假设我们有一个非常 大的 WPF 应用程序,它不是立即加载整个程序,而是 CLR 开始执行时,我们代码 的不同部分将通过一个高效的方法翻译成本地指令,因为它能够检查系统 JIT 和生 成优化的代码,而不是按照一个预定义的模式。不幸的是,有一个缺点就是启动的 过程比较慢,这意味着它不适用于加载时间长的包。 JIT 的替代方案使用 NGen 如果 Visual Studio 由 JIT 创建,那么它的启动我们将需要等待几分钟,相反,如果 它是使用 Ngen(Native Image Generator)编译,它将创建纯二进制可执行文件, 如果只考虑速度的问题,那是绝对是正确的选择。 1.1.3 总 结 在非托管环境中,我们需要知道编译的过程分成编译和连接两个阶段,编译阶段将 源程序(*.c,*.cpp 或*.h)转换成为目标代码(*.o 或*.obj 文件),至于具体过程 就是上面说的 C/C+编译过程的前三个阶段;链接阶段是把前面转成成的目标代 码(obj 文件)与我们程序里面调用的库函数对应的代码链接起来形成对应的可执 行文件(exe 文件)。 托管环境中,编译过程可以分为:词法分析、语法分析、中间代码生成、代码优化 和目标代码生成等等过程;无论是.NET 还是 Java,它们都会生成中间代码( MSIL 或 Bytecode) ,然后把优化后的中间代码翻译成目标代码,最后在程序运行时,JIT 将 IL 翻译成机器码。 无论是托管或非托管语言,它们的编译编译过程是把高级语言翻译成计算机能理解 的机器码,由于编译过程涉及的知识面很广(编译的原理和硬件知识),而且本人 的能力有限,也只能简单的描述一下这些过程,如果大家希望深入了解编译的原理, 我推荐大家看一下编译原理。 参考 1 /compilation-process-and-jit-compiler/ 更新:07/31/2013 关于作者: 作者: JK_Rush 从事.NET 开发和热衷于开源高性能系统设计,通过博文交流和 分享经验,欢迎转载,请保留原文地址,谢谢。
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 汉堡店安全知识培训课件
- 永济市交通安全知识培训课件
- 水轮机蝶阀课件
- 建筑工程合同管理方案
- 施工人员劳动保护与安全防护方案
- 人教版PEP四年级上册 Unit 2 My schoolbag 单元测试提升B卷(含答案)
- 图形图像处理数码照片处理之摄影基础84课件
- 陶瓷造型工艺36课件
- 消防系统应急反应方案
- 水电维修基础知识培训课件
- 插板机安全操作规程
- 铭复乐IV期临床方案介绍
- ks-9000气体报警控制器使用说明书
- 《SPC统计过程控制》课件
- GB/T 14153-1993硬质塑料落锤冲击试验方法通则
- (完整版)人教版八年级下册《道德与法治》期末测试卷及答案【新版】
- 并购贷款业务培训
- 北京大学人民医院-医疗知情同意书汇编
- 建设集团有限公司安全生产管理制度汇编
- 牙体牙髓病最全课件
- 交通信号控制系统检验批质量验收记录表
评论
0/150
提交评论