[C++]HelloWorld背后的故事!

人物介绍

姓名 HelloWorld
性别 .cpp
住址 D:\
身份证号(SHA1) 25106D2879A9EA300BB264F8155A71D7C44DA2E8

故事简介

  1. 编写源文件
  2. 预编译
  3. 编译
  4. 汇编
  5. 连接

1、编写源文件

  源代码:html

#include <iostream>
using namespace std;

int main()
{
	cout << "Hello World!" << endl;
	return 0;
}

2、预编译

  预编译输入命令g++ -o HelloWorld.i -E HelloWorld.cpplinux

  该命令表示编译环节的第一步,也就是预编译!固然,这一步也能够被称为“编译预处理”!而这个 HelloWorld.i 便是预编译事后的文件!ios

序号 主要行为
1. 展开全部的宏定义,消除“#define”
2. 处理全部的预编译指令,好比#if、#ifdef等
3. 处理#include预编译指令,将包含文件插入到该预编译的位置
4. 删除全部的注释“/**/”、"//"等
5. 添加行号和文件名标识,以便于编译时编译器产生调试用的行号信息以及错误提醒
6. 保留全部的#program编译指令,缘由是编译器要使用它们

值得注意:这一步不会作出任何安全性和合法性的检查!安全

3、编译

  编译请输入命令g++ -o HelloWorld.s -S HelloWorld.i编辑器

  该命令表示编译过程,也就是生成相应的汇编文件 HelloWorld.s 。函数

主要行为 具体描述
词法分析 将源代码文件的字符序列划分为一系列的记号,通常词法分析产生的记号有:标识符、关键字、数字、字符串、特殊符号(加号、等号);在识别记号的同时也将标识符放好符号表、将数字、字符放入到文字表等;有一个lex程序能够实现词法扫描,会按照以前定义好的词法规则将输入的字符串分割成记号,因此编译器不须要独立的词法扫描器
语法分析 语法分析器将对产生的记号进行语法分析,产生语法树----就是以表达式尾节点的树,一步步判断如何执行表达式操做;若是存在括号不匹配或者表达式错误,编译器就会报告语法分析阶段的错误;相同的存在一个yacc程序能够根据用户输入的语法规则生成语法树;
语义分析 由语法阶段完成分析的并无赋予表达式或者其余实际的意义,好比乘法、加法、减法,必须通过语义阶段才能赋予其真正的意义;
代码优化 将代码进行优化处理
符号汇总 汇总全部符号

补充说明:其中语义分析又能够分为“静态语义分析”和“动态语义分析”两种。工具

语义分析 简单说明
静态语义分析 一般在编译器就能够肯定的语义,主要包括“声明”、“类型的匹配”以及“类型的转换”
动态语义分析 只能在运行期才能肯定的语义

4、汇编

  汇编请输入命令g++ -o HelloWorld.o -C HelloWorld.s优化

  该命令表示对 HelloWorld.s 文件进行汇编处理,生成对应的可重定位的二进制文件 HelloWorld.o ,也就是咱们所熟知的机器语言对应的文件。spa

5、连接

  连接请输入命令g++ HelloWorld.cpp -o HelloWorld.exe操作系统

  经过调用连接器ld来连接程序运行须要的一大堆目标文件,以及所依赖的其它库文件,最后生成可执行文件., 连接的主要内容是把各个模块之间相互引用的部分处理好,使得各个模块之间可以正确地衔接。

须要指出:连接分为“静态连接”和“动态连接”。

连接类型 具体说明
静态连接 指在编译阶段直接把静态库加入到可执行文件中去,这样可执行文件会比较大
动态连接 指连接阶段仅仅只加入一些描述信息,而程序执行时再从系统中把相应动态库加载到内存中去

须要补充:

库文件类型 特色
静态库文件 是一个二进制文件,存放的功能函数实现,在文件编译时要访问文件,编译以后静态库文件能够删除
动态库文件 是一个二进制文件,存放的功能函数实现,在文件执行时要访问文件,编译时不须要动态库文件

额外说明:

操做系统 动态库文件后缀名
linux .so
window .dll

相册

预编译后的文件HelloWorld.i

HelloWorld.i

  能够看到,代码量惊人的大!足足有两万多行!可想这个HelloWorld也不简单啊!

编译后的文件HelloWorld.s

HelloWorld.s

汇编后的文件HelloWorld.o

HelloWorld.o

  能够看出,记事本已经显示乱码了!

帮忙的朋友

工具 做用 负责过程
编辑器 编写代码的一些窗口 编写源代码
编译器 检查用户代码的一些语法错误,将其编译成汇编代码 预编译、编译
汇编器 将编译出来的汇编文件编译成必定功能的目标代码 汇编
链接器 将目标代码链接成可执行文件 连接

原创说明

原文做者:Seaver(海之恋SF)
如要转载,请务必注明出处!
原文连接:http://www.javashuo.com/article/p-hwkelqzr-ga.html

相关文章
相关标签/搜索