CJava和C#的编译过程解析

上传人:tia****nde 文档编号:36842575 上传时间:2018-04-03 格式:DOCX 页数:4 大小:168.93KB
返回 下载 相关 举报
CJava和C#的编译过程解析_第1页
第1页 / 共4页
CJava和C#的编译过程解析_第2页
第2页 / 共4页
CJava和C#的编译过程解析_第3页
第3页 / 共4页
CJava和C#的编译过程解析_第4页
第4页 / 共4页
亲,该文档总共4页,全部预览完了,如果喜欢就下载吧!
资源描述

《CJava和C#的编译过程解析》由会员分享,可在线阅读,更多相关《CJava和C#的编译过程解析(4页珍藏版)》请在金锄头文库上搜索。

1、C+, Java 和和 C#的的编编译译过过程程解解析析1.1.1 摘摘要要我们知道计算机不能直接理解高级语言,它只能理解机器语言,所以我们必须要把 高级语言翻译成机器语言,这样计算机才能执行高级语言编写的程序,在接下来的 博文中,我们将介绍非托管和托管语音的编译过程。1.1.2 正正文文非托管环境的编译过程(非托管环境的编译过程(C/C+)纯 C/C+的程序通常运行在一个非托管环境中,类是由头文件(.h)和实现文件 (.cpp)组成,每个类形成了一个单独的编译单元,当我们编译程序时,几个基本 组件会把我们的源代码翻译成二进制代码,接下来我们通过以下图片说明非托管环 境的编译过程:图 1 C/

2、C+编译过程首先是预处理器,如果在项目中有头文件和宏表达式,那么它将负责包含头文件和 翻译所有的宏观表达式。接下来是编译器,它不是直接生成二进制代码,而是生成汇编代码(.s),这基本 上是所有现代的非结构化语言的共同基础。然后,汇编程序把汇编代码翻译成目标代码(.o 和.obj 文件,机器指令)。最后链接器,它把所有彼此相关的目标文件和生成的可执行文件或库链接起来。总而言之,在一般情况下,我们的代码首先翻译成汇编代码,接着翻译成机器指令 (二进制代码)。什么是宏?什么是宏?在 C/C+中,宏是预处理指令,它有多种应用技术:包括预定义、创建关键字和 条件编译等等。在一般情况下,这些技术在 C+中

3、使用被认为是不好的做法,主 要原因是有可能滥用 C+提供的语法变化功能,甚至有可能在不知情情况下创建 了非标准的语言,宏不遵循一般的源代码编译规则,由于它通过预处理来处理,而 不是编译器。托管环境的编译过程(托管环境的编译过程(C#/Java)在托管环境中,编译的过程略有不同,我们熟知的托管语言有 C#和 Java,接下来, 我们将以 C#和 Java 为例介绍在托管环境中的编译过程。当我们在喜爱的 IDE 中编写代码时,第一个检测我们代码的就是 IDE(词法分析), 然后,编译成目标文件和链接到动态/静态库或可执行文件进行再次检查(语法分 析),最后一次检查是运行时检查。托管环境的共同特点是

4、:编译器不直接编译成编译器不直接编译成 机器码,而是中间代码机器码,而是中间代码,在.NET 中称为 MSIL - Microsoft Intermediate Language,Java 是字节码(Bytecode) 在那之后,在运行时 JIT(Just In Time)编译器将 MSIL 翻译成机器码,这意味着 我们的代码在真正使用的时候才被解析,这允许在 CLR(公共语言运行时)预编译 和优化我们的代码,实现程序性能的提高,但增加了程序的启动时间,我们也可以 使用 Ngen(Native Image Generator)预编译我们的程序,从而缩短程序的启动 时间,但没有运行时优化的优点。

5、(JeffWong的补充 Java 是先通过编译器编译成 Bytecode,然后在运行时通过解释器将 Bytecode 解释成机器码;C#是先通过编译 器将 C#代码编译成 IL,然后通过 CLR 将 IL 编译成机器代码。所以严格来说 Java 是一种先编译后解释的语言,而 C#是一门纯编译语言,且需要编译两次。)图 2 C#的编译过程.Net Framework 就是在 Win32 core 上添加了一个抽象层,它提供的一个好处就是 支持多语言、JIT 优化、自动内存管理和改进安全性;另外一个完整解决方案是 WinRT,但这涉及到另外一个主题了,这里不作详细介绍。图 3 Windows A

6、PIJIT 编译的优点和缺点编译的优点和缺点JIT 编译带来了许多好处,最大的一个在我看来是性能的优势,它允许 CLR(通用 语言运行时扮演 Assembler 组件)只执行需要的代码,例如:假设我们有一个非常 大的 WPF 应用程序,它不是立即加载整个程序,而是 CLR 开始执行时,我们代码 的不同部分将通过一个高效的方法翻译成本地指令,因为它能够检查系统 JIT 和生 成优化的代码,而不是按照一个预定义的模式。不幸的是,有一个缺点就是启动的 过程比较慢,这意味着它不适用于加载时间长的包。JIT 的替代方案使用 NGen如果 Visual Studio 由 JIT 创建,那么它的启动我们将需

7、要等待几分钟,相反,如果 它是使用 Ngen(Native Image Generator)编译,它将创建纯二进制可执行文件, 如果只考虑速度的问题,那是绝对是正确的选择。1.1.3 总总结结在非托管环境中,我们需要知道编译的过程分成编译和连接两个阶段,编译阶段将 源程序(*.c,*.cpp 或*.h)转换成为目标代码(*.o 或*.obj 文件),至于具体过程 就是上面说的 C/C+编译过程的前三个阶段;链接阶段是把前面转成成的目标代 码(obj 文件)与我们程序里面调用的库函数对应的代码链接起来形成对应的可执 行文件(exe 文件)。托管环境中,编译过程可以分为:词法分析、语法分析、中间代

8、码生成、代码优化 和目标代码生成等等过程;无论是.NET 还是 Java,它们都会生成中间代码(MSIL 或 Bytecode),然后把优化后的中间代码翻译成目标代码,最后在程序运行时,JIT 将 IL 翻译成机器码。无论是托管或非托管语言,它们的编译编译过程是把高级语言翻译成计算机能理解 的机器码,由于编译过程涉及的知识面很广(编译的原理和硬件知识),而且本人 的能力有限,也只能简单的描述一下这些过程,如果大家希望深入了解编译的原理, 我推荐大家看一下编译原理。参考参考1 http:/ 关于作者关于作者: : 作者: JK_Rush 从事.NET 开发和热衷于开源高性能系统设计,通过博文交流和 分享经验,欢迎转载,请保留原文地址,谢谢。 出处: http:/ 本文基于: 署名-非商业性使用 3.0 许可协议发布,欢迎转载,演绎,但是必须 保留本文的署名 JK_Rush (包含链接),且不得用于商业目的。如您有任何疑问 或者授权方面的协商,请与我联系 。

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 中学教育 > 试题/考题

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号