time 
设为首页】【收藏本站
当前位置: 主页 > 程序设计 > C\C++\VC > C++基础 > 解析C++,Java和C#的编译过程

解析C++,Java和C#的编译过程

时间:2013-07-29 23:37 点击:1753次 字体:[ ]




 

1.1.1 摘要

我们知道计算机不能直接理解高级语言,它只能理解机器语言,所以我们必须要把高级语言翻译成机器语言,这样计算机才能执行高级语言编写的程序,在接下来的博文中,我们将介绍非托管和托管语音的编译过程。

1.1.2正文

非托管环境的编译过程(C/C++)

纯C/C++的程序通常运行在一个非托管环境中,类是由头文件(.h)和实现文件(.cpp)组成,每个类形成了一个单独的编译单元,当我们编译程序时,几个基本组件会把我们的源代码翻译成二进制代码,接下来我们通过以下图片说明非托管环境的编译过程:

解析C++,Java和C#的编译过程_www.fengfly.com

图1 C/C++编译过程

首先是预处理器,如果在项目中有头文件和宏表达式,那么它将负责包含头文件和翻译所有的宏观表达式。

接下来是编译器,它不是直接生成二进制代码,而是生成汇编代码(.s),这基本上是所有现代的非结构化语言的共同基础。

然后,汇编程序把汇编代码翻译成目标代码(.o和.obj文件,机器指令)。

最后链接器,它把所有彼此相关的目标文件和生成的可执行文件或库链接起来。

总而言之,在一般情况下,我们的代码首先翻译成汇编代码,接着翻译成机器指令(二进制代码)。

什么是宏?

在C/C++中,宏是预处理指令,它有多种应用技术:包括预定义、创建关键字和条件编译等等。在一般情况下,这些技术在C++中使用被认为是不好的做法,主要原因是有可能滥用C++提供的语法变化功能,甚至有可能在不知情情况下创建了非标准的语言,宏不遵循一般的源代码编译规则,由于它通过预处理来处理,而不是编译器。

托管环境的编译过程(C#/Java)

在托管环境中,编译的过程略有不同,我们熟知的托管语言有C#和Java,接下来,我们将以C#和Java为例介绍在托管环境中的编译过程。

当我们在喜爱的IDE中编写代码时,第一个检测我们代码的就是IDE(词法分析),然后,编译成目标文件和链接到动态/静态库或可执行文件进行再次检查(语法分析),最后一次检查是运行时检查。托管环境中的一个共同特点是,编译器不是产生二进制代码,而是中间元代码,称为MSIL - Microsoft Intermediate Language在.NET中或字节码(Bytecode)在Java中。

在那之后,在运行时JIT(Just In Time)编译器将MSIL翻译成二进制代码,这意味着我们的代码在真正使用的时候才被解析,这允许在CLR(公共语言运行时)预编译和优化我们的代码,实现程序性能的提高,但增加了程序的启动时间,我们也可以使用Ngen(Native Image Generator)预编译我们的程序,从而缩短程序的启动时间,但没有运行时优化的好处。

 解析C++,Java和C#的编译过程_www.fengfly.com

图2 C#的编译过程



本文地址 : http://www.fengfly.com/plus/view-213250-1.html
标签: java C++ C#
------分隔线----------------------------
最新评论 查看所有评论
发表评论 查看所有评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
验证码: