编译过程简介
2013-07-17 00:11
176 查看
被隐藏的过程
预编译:
处理所有的注释,以空格代替
将所有的#define删除删除 ,并且展开所有的宏定义
处理条件编译指令#if, #ifdef, #elif, #else, #endif
处理#include ,展开被包含的文件
保留编译器需要使用的#pragma指令指令
预处理指令:
编译:
对预处理文件进行一系列词法分析 ,语法分析和语义分析
词法分析主要分析关键字 ,标示符,标示符 ,立即数等是否合法
语法分析主要分析表达式是否遵循语法规则
语义分析在语法分析的基础上进一步分析表达式是否合法
分析结束后进行代码优化生成相应的汇编代码
汇编:
汇编器将汇编代码转变为机器可以执行的指令
每个汇编语句几乎都对应一条机器指令
链接:
链接器主要作用是把各个模块之间相互引用的部分处理好,使得各个模块之间能够正确的衔接。
静态链接
运行两个程序有两个同样的拷贝,浪费内存空间。
动态链接
只要吧a.out里面要调用的其他库lib1.so、lib2.so里面的函数告诉l链接器是存在的,如果要调用stub1里面申明的函数,就知道是外部的lib1.so里面定义的,在运行的时候如果调用到这个函数,就再去动态的链接过去即可。
.so库文件没有跟应用程序绑定在一起,如果程序需要用到库中的函数,程序会到内存中.so库中找到函数的定义,这样好处就是几十运行多个程序,有一部分占用的内存是动态链接库占用的,它是一个公共的的部分,这样可以节省内存。
动态链接虽然节省空间,但是效率相比静态链接会低一点。要用max()的时候,还要有一个寻址操作,到内存找lib.so库是否存在,如果存在,直接调用max(),如果不存在,操作系统还要去把lib.so装载到内存中,装载过程需要时间,在装载过程中,应该程序将被挂起不会执行,只有当lib.so完全装载成功,max()才会调用。
静态链接在编译期完成,动态链接在运行期完成。
到底用动态链接还是静态3链接,要看实际工程本事需要。
预编译:
处理所有的注释,以空格代替
将所有的#define删除删除 ,并且展开所有的宏定义
处理条件编译指令#if, #ifdef, #elif, #else, #endif
处理#include ,展开被包含的文件
保留编译器需要使用的#pragma指令指令
预处理指令:
编译:
对预处理文件进行一系列词法分析 ,语法分析和语义分析
词法分析主要分析关键字 ,标示符,标示符 ,立即数等是否合法
语法分析主要分析表达式是否遵循语法规则
语义分析在语法分析的基础上进一步分析表达式是否合法
分析结束后进行代码优化生成相应的汇编代码
汇编:
汇编器将汇编代码转变为机器可以执行的指令
每个汇编语句几乎都对应一条机器指令
链接:
链接器主要作用是把各个模块之间相互引用的部分处理好,使得各个模块之间能够正确的衔接。
静态链接
运行两个程序有两个同样的拷贝,浪费内存空间。
动态链接
只要吧a.out里面要调用的其他库lib1.so、lib2.so里面的函数告诉l链接器是存在的,如果要调用stub1里面申明的函数,就知道是外部的lib1.so里面定义的,在运行的时候如果调用到这个函数,就再去动态的链接过去即可。
.so库文件没有跟应用程序绑定在一起,如果程序需要用到库中的函数,程序会到内存中.so库中找到函数的定义,这样好处就是几十运行多个程序,有一部分占用的内存是动态链接库占用的,它是一个公共的的部分,这样可以节省内存。
动态链接虽然节省空间,但是效率相比静态链接会低一点。要用max()的时候,还要有一个寻址操作,到内存找lib.so库是否存在,如果存在,直接调用max(),如果不存在,操作系统还要去把lib.so装载到内存中,装载过程需要时间,在装载过程中,应该程序将被挂起不会执行,只有当lib.so完全装载成功,max()才会调用。
静态链接在编译期完成,动态链接在运行期完成。
到底用动态链接还是静态3链接,要看实际工程本事需要。
相关文章推荐
- 编译过程简介
- C语言编译过程简介
- C++程序编译过程简介
- GDAL库简介以及在Windows下编译过程(64位)
- 专题3-1.编译过程简介
- C语言编译过程简介
- .NET框架源码解读之SSCLI编译过程简介
- C语言编译过程简介
- C语言基础(21)-C语言编译过程及GCC参数简介
- C语言笔记——简介与编译过程初探
- SDL以及扩展库的交叉编译过程简介
- SDL以及扩展库的交叉编译过程简介
- 打造自己的专属linux(四):Linux内核编译过程简介
- C语言编译过程简介
- 编译过程简介
- TrueCrypt简介及TrueCrypt 7.1a Source.zip源码在VS2008下的编译过程
- SDL以及扩展库的交叉编译过程简介
- TrueCrypt简介、在VS2008下的编译过程
- 编译过程简介
- MySQL存储过程详解 mysql 存储过程mysql存储过程详解 1. 存储过程简介 我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储过程(Stored