程序是如何编译执行的,背后都发生了什么
2017-08-14 12:04
288 查看
一个程序从源文件test.c到可执行程序test.o,一共经历了以下步骤:
这是一个源程序到可执行程序所经历的过程,但是这每个小阶段,编译器都做了些什么呢?
1.预处理器处理:
1).头文件的包含,预处理指令#include用于处理头文件的包含,头文件有两种形式,< xxx>和“xxx”,#include< xxx>所包含的头文件,是告诉编译器,该头文件所包含的内容从系统中去查找,#include”xxx”,是告诉编译器,该头文件所包含的文件先从用户目录去寻找,如果没有,再去系统中找;
2)#include 预处理标识符的替换;
3).宏的替换,宏在预处理阶段,宏就在源文件中完全展开;
4).注释删除;
这个阶段生成 .i文件
2.编译阶段:
1).语法分析;
2).词法分析;
3).语义分析;
4).符号分析;
也就是在这个阶段检查代码的语法错误,缺少符号等错误;这个阶段生成的是 .s文件;把代码转换成汇编代码;
3.汇编阶段:
1).汇编转换成二进制文件;
2).符号表的合并;
4.链接:
1).合并段表;
合并段表就是编译器需要传递编译后的全部二进制代码的段表,连接器将所有的段表合并;
2).符号表的合并和符号表的重定义;
这是一个源程序到可执行程序所经历的过程,但是这每个小阶段,编译器都做了些什么呢?
1.预处理器处理:
1).头文件的包含,预处理指令#include用于处理头文件的包含,头文件有两种形式,< xxx>和“xxx”,#include< xxx>所包含的头文件,是告诉编译器,该头文件所包含的内容从系统中去查找,#include”xxx”,是告诉编译器,该头文件所包含的文件先从用户目录去寻找,如果没有,再去系统中找;
2)#include 预处理标识符的替换;
3).宏的替换,宏在预处理阶段,宏就在源文件中完全展开;
4).注释删除;
这个阶段生成 .i文件
2.编译阶段:
1).语法分析;
2).词法分析;
3).语义分析;
4).符号分析;
也就是在这个阶段检查代码的语法错误,缺少符号等错误;这个阶段生成的是 .s文件;把代码转换成汇编代码;
3.汇编阶段:
1).汇编转换成二进制文件;
2).符号表的合并;
4.链接:
1).合并段表;
合并段表就是编译器需要传递编译后的全部二进制代码的段表,连接器将所有的段表合并;
2).符号表的合并和符号表的重定义;
相关文章推荐
- C/C++程序编译步骤 如何生成可执行文件
- 如何在cmd界面编译执行java程序
- 如何把java程序编译成.exe文件(就是制作可执行的JAR文件包)
- C/C++程序编译步骤 如何生成可执行文件
- 如何在执行一个命令或程序之前就了解它会做什么
- 使用javac和java命令编译和执行程序,学习隐藏在IDE背后的知识
- 程序执行期间发生了哪些事——预处理,编译,汇编,链接
- C/C++程序编译步骤 如何生成可执行文件
- 在linux中如何编译C程序,使之成为可执行文件?如何调试?
- C/C++程序编译步骤 如何生成可执行文件
- [置顶] 【shell】什么是shell?如何执行shell程序?
- C/C++程序编译步骤 如何生成可执行文件
- 如何在linux下编译并执行C程序
- C/C++程序编译步骤以及如何生成可执行文件
- 如何用程序执行一个项目的编译?
- 如何使编译的ROM能使所有程序获得root权限执行
- 如何将MATLAB程序编译成独立可执行的程序
- 软件_PC机编程软件_KEIL之如何执行编译后的程序
- Android安全与逆向之Dalvik虚拟机架构和如何执行程序以及JIT(即时编译)
- C/C++程序编译步骤 如何生成可执行文件