姓名 |
HelloWorld |
---|---|
性别 |
.cpp |
住址 |
D:\ |
身份证号(SHA1) |
25106D2879A9EA300BB264F8155A71D7C44DA2E8 |
源代码:html
#include <iostream> using namespace std; int main() { cout << "Hello World!" << endl; return 0; }
预编译输入命令g++ -o HelloWorld.i -E HelloWorld.cpp
linux
该命令表示编译环节的第一步,也就是预编译!固然,这一步也能够被称为“编译预处理”!而这个 HelloWorld.i 便是预编译事后的文件!ios
序号 | 主要行为 |
---|---|
1. | 展开全部的宏定义,消除“#define” |
2. | 处理全部的预编译指令,好比#if、#ifdef等 |
3. | 处理#include预编译指令,将包含文件插入到该预编译的位置 |
4. | 删除全部的注释“/**/”、"//"等 |
5. | 添加行号和文件名标识,以便于编译时编译器产生调试用的行号信息以及错误提醒 |
6. | 保留全部的#program编译指令,缘由是编译器要使用它们 |
值得注意:这一步不会作出任何安全性和合法性的检查!安全
编译请输入命令g++ -o HelloWorld.s -S HelloWorld.i
编辑器
该命令表示编译过程,也就是生成相应的汇编文件 HelloWorld.s 。函数
主要行为 | 具体描述 |
---|---|
词法分析 |
将源代码文件的字符序列划分为一系列的记号,通常词法分析产生的记号有:标识符、关键字、数字、字符串、特殊符号(加号、等号);在识别记号的同时也将标识符放好符号表、将数字、字符放入到文字表等;有一个lex程序能够实现词法扫描,会按照以前定义好的词法规则将输入的字符串分割成记号,因此编译器不须要独立的词法扫描器 |
语法分析 |
语法分析器将对产生的记号进行语法分析,产生语法树----就是以表达式尾节点的树,一步步判断如何执行表达式操做;若是存在括号不匹配或者表达式错误,编译器就会报告语法分析阶段的错误;相同的存在一个yacc程序能够根据用户输入的语法规则生成语法树; |
语义分析 |
由语法阶段完成分析的并无赋予表达式或者其余实际的意义,好比乘法、加法、减法,必须通过语义阶段才能赋予其真正的意义; |
代码优化 |
将代码进行优化处理 |
符号汇总 |
汇总全部符号 |
补充说明:其中语义分析又能够分为“静态语义分析”和“动态语义分析”两种。工具
语义分析 | 简单说明 |
---|---|
静态语义分析 | 一般在编译器就能够肯定的语义,主要包括“声明”、“类型的匹配”以及“类型的转换” |
动态语义分析 | 只能在运行期才能肯定的语义 |
汇编请输入命令g++ -o HelloWorld.o -C HelloWorld.s
优化
该命令表示对 HelloWorld.s 文件进行汇编处理,生成对应的可重定位的二进制文件 HelloWorld.o ,也就是咱们所熟知的机器语言对应的文件。spa
连接请输入命令g++ HelloWorld.cpp -o HelloWorld.exe
操作系统
经过调用连接器ld来连接程序运行须要的一大堆目标文件,以及所依赖的其它库文件,最后生成可执行文件., 连接的主要内容是把各个模块之间相互引用的部分处理好,使得各个模块之间可以正确地衔接。
须要指出:连接分为“静态连接”和“动态连接”。
连接类型 | 具体说明 |
---|---|
静态连接 | 指在编译阶段直接把静态库加入到可执行文件中去,这样可执行文件会比较大 |
动态连接 | 指连接阶段仅仅只加入一些描述信息,而程序执行时再从系统中把相应动态库加载到内存中去 |
须要补充:
库文件类型 | 特色 |
---|---|
静态库文件 | 是一个二进制文件,存放的功能函数实现,在文件编译时要访问文件,编译以后静态库文件能够删除 |
动态库文件 | 是一个二进制文件,存放的功能函数实现,在文件执行时要访问文件,编译时不须要动态库文件 |
额外说明:
操做系统 | 动态库文件后缀名 |
---|---|
linux | .so |
window | .dll |
HelloWorld.i
能够看到,代码量惊人的大!足足有两万多行!可想这个HelloWorld也不简单啊!
HelloWorld.s
HelloWorld.o
能够看出,记事本已经显示乱码了!
工具 | 做用 | 负责过程 |
---|---|---|
编辑器 | 编写代码的一些窗口 | 编写源代码 |
编译器 | 检查用户代码的一些语法错误,将其编译成汇编代码 | 预编译、编译 |
汇编器 | 将编译出来的汇编文件编译成必定功能的目标代码 | 汇编 |
链接器 | 将目标代码链接成可执行文件 | 连接 |
原文做者:Seaver(海之恋SF)
如要转载,请务必注明出处!
原文连接:http://www.javashuo.com/article/p-hwkelqzr-ga.html