第2章 编译和链接
来源:互联网 发布:数据保密性 编辑:程序博客网 时间:2024/06/05 09:03
用C语言写好Hello World程序hello.cpp,怎么才能让程序执行?通常我们都是用IDE工具点击BuiLd,即可傻瓜式执行,那里面的奥秘是什么?
其实,上述过程可以分解为4个步骤,分别是预处理、编译、汇编和链接。
先说预处理。程序里面一般会包含头文件(例#include<stdio.h>)、宏(#define ……),预处理过程主要处理那些源文件中的以“#”开始的预编译指令。主要规则如下:
l 删除所有的“#define”,将所有的宏展开。
l 处理所有的条件预编译指令,比如“#if”、“#ifdef”、“#elif”、“#else”、“#endif”。
l 处理“#include”预编译指令,将被包含的文件插入到该预编译指令的位置。
l 删除所有的注释。
l 添加行号和文件名标识。
l 保留所有的#pragma编译器指令,因为编译器需要使用它们。
再说编译。编译过程可以参考编译原理一书,分为词法分析、语法分析、语义分析、代码生成、目标代码优化。
l 词法分析:源代码被输入到扫描器,扫描器运用一种类似于有限状态机的算法,将源代码的字符序列分割成一系列的记号(关键字、标示符、字面量、特殊符号)。
l 语法分析:语法分析器将对由扫描器产生的记号进行语法分析,从而产生语法树。由语法分析器生成的语法树就是以表达式为节点的树。
l 语义分析在语法分析的基础上,判断表达式是否有意义,比如两指针相乘,语法上合法,但明显是没有意义的;经过语义分析阶段以后,整个语法树的表达式都被标识了类型。
l 中间语言生成:源码级优化器往往将整个语法树转换成中间代码。
l 目标代码生成和优化;代码生成器将中间代码转换成目标机器代码,目标代码优化器对目标代码进行优化。
汇编器是将汇编代码转变成机器可以执行的指令,根据汇编指令和机器指令的对照表一一翻译即可。
最后谈谈链接。链接的主要内容就是把各个模块之间相互引用的部分都处理好,使得各个模块之间能够正确地衔接。链接过程主要包括了地址和空间分配、符号决议和重定位。- 第2章 编译和链接
- 第2章 编译和链接
- 【程序员的自我修养】第2章 编译和链接
- 第2部分 静态链接---(2)编译与链接
- 第二章 编译和链接
- 第二章(编译和链接)
- 2 关于程序的编译和链接
- 编译和链接
- c++编译和链接
- 关于编译和链接
- 编译和链接
- 编译和链接
- 编译和链接
- 编译和链接
- 编译、链接和构建:
- g++ 编译和链接
- 编译链接和加载
- g++ 编译和链接
- ASP.NET MVC Module
- 第1章 温故而知新
- C++_引用_结构体_C和C++相互调用_const
- Redis 使用的一些经验分享
- ASP.NET MVC 路由(四)
- 第2章 编译和链接
- iOS 应用2.0版怎么做
- Android eclipse中程序调试
- POJ-2385(DP)
- (Handling Images, Animation, Sliders, and Steppers)
- 命令行下导出ANDROID手机下的数据库方法
- (alert views,short sounds and vibrations)
- Code Complete—第十二章 Fundamental Data Types 基本数据类型
- 关注android最新动态