[C++]HelloWorld背后的故事!
人物介绍
姓名 |
HelloWorld |
|---|---|
性别 |
.cpp |
住址 |
D:\ |
身份证号(SHA1) |
25106D2879A9EA300BB264F8155A71D7C44DA2E8 |
故事简介
一、编写源文件
源代码:
#include <iostream>
using namespace std;
int main()
{
cout << "Hello World!" << endl;
return 0;
}
二、预编译
预编译输入命令g++ -o HelloWorld.i -E HelloWorld.cpp
该命令表示编译环节的第一步,也就是预编译!当然,这一步也可以被称为“编译预处理”!而这个 HelloWorld.i 即是预编译过后的文件!
| 序号 | 主要行为 |
|---|---|
| 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 ,也就是我们所熟知的机器语言对应的文件。
五、链接
链接请输入命令g++ HelloWorld.cpp -o HelloWorld.exe
通过调用链接器ld来链接程序运行需要的一大堆目标文件,以及所依赖的其它库文件,最后生成可执行文件., 链接的主要内容是把各个模块之间相互引用的部分处理好,使得各个模块之间能够正确地衔接。
需要指出:链接分为“静态链接”和“动态链接”。
| 链接类型 | 具体说明 |
|---|---|
| 静态链接 | 指在编译阶段直接把静态库加入到可执行文件中去,这样可执行文件会比较大 |
| 动态链接 | 指链接阶段仅仅只加入一些描述信息,而程序执行时再从系统中把相应动态库加载到内存中去 |
需要补充:
| 库文件类型 | 特点 |
|---|---|
| 静态库文件 | 是一个二进制文件,存放的功能函数实现,在文件编译时要访问文件,编译之后静态库文件可以删除 |
| 动态库文件 | 是一个二进制文件,存放的功能函数实现,在文件执行时要访问文件,编译时不需要动态库文件 |
额外说明:
| 操作系统 | 动态库文件后缀名 |
|---|---|
| linux | .so |
| window | .dll |
相册
预编译后的文件HelloWorld.i

可以看到,代码量惊人的大!足足有两万多行!可想这个HelloWorld也不简单啊!
编译后的文件HelloWorld.s

很明显看出,此时代码精简了很多!
汇编后的文件HelloWorld.o

可以看出,记事本已经显示乱码了!
帮忙的朋友
| 工具 | 作用 | 负责过程 |
|---|---|---|
| 编辑器 | 编写代码的一些窗口 | 编写源代码 |
| 编译器 | 检查用户代码的一些语法错误,将其编译成汇编代码 | 预编译、编译 |
| 汇编器 | 将编译出来的汇编文件编译成一定功能的目标代码 | 汇编 |
| 连接器 | 将目标代码连接成可执行文件 | 链接 |
原创说明
原文作者:Seaver(海之恋SF)
如要转载,请务必注明出处!
原文链接:https://www.cnblogs.com/seafever/p/12577337.html
[C++]HelloWorld背后的故事!的更多相关文章
- printf背后的故事
printf背后的故事 说起编程语言,C语言大家再熟悉不过.说起最简单的代码,Helloworld更是众所周知.一条简单的printf语句便可以完成这个简单的功能,可是printf背后到底做了什么事情 ...
- 你好,C++(4)2.1.3 我的父亲母亲:编译器和链接器 2.1.4 C++程序执行背后的故事
2.1.3 我的父亲母亲:编译器和链接器 从表面上看,我是由Visual Studio创建的,而实际上,真正负责编译源代码创建生成可执行程序HelloWorld.exe的却是Visual Studi ...
- 背后的故事之 - 快乐的Lambda表达式(一)
快乐的Lambda表达式(二) 自从Lambda随.NET Framework3.5出现在.NET开发者眼前以来,它已经给我们带来了太多的欣喜.它优雅,对开发者更友好,能提高开发效率,天啊!它还有可能 ...
- 背后的故事之 - 快乐的Lambda表达式(二)
快乐的Lambda表达式 上一篇 背后的故事之 - 快乐的Lambda表达式(一)我们由浅入深的分析了一下Lambda表达式.知道了它和委托以及普通方法的区别,并且通过测试对比他们之间的性能,然后我们 ...
- ASP.NET Web API自身对CORS的支持: EnableCorsAttribute特性背后的故事
从编程的角度来讲,ASP.NET Web API针对CORS的实现仅仅涉及到HttpConfiguration的扩展方法EnableCors和EnableCorsAttribute特性.但是整个COR ...
- DbUtility v3 背后的故事
DbUtility v3 背后的故事 时间 DbUtility v3构思了差不多大半年,真正开发到第一个版本发布到NuGet却只花了50天.中途大量时间在完善 Jumony 3,只有三周来开发DbUt ...
- using关键字背后的故事!
using关键字的作用: 1:可以引入命名空间2:可以释放资源 *****不能使用using语句完全替换掉(try-catch-finally)语句(无法进行异常处理) 在出了using语句的{}后, ...
- Mac OS X 背后的故事
Mac OS X 背后的故事 作者: 王越 来源: <程序员> 发布时间: 2013-01-22 10:55 阅读: 25840 次 推荐: 49 原文链接 [收藏] ...
- 联想手机#P1来了#P1背后的故事系列
http://bbs.lenovo.com/forum.php?mod=viewthread&fid=928&tid=560992&extra=page%3D1 联想手机#P1 ...
随机推荐
- EL表达式详细教程
EL 全名为Expression Language EL 语法很简单,它最大的特点就是使用上很方便.接下来介绍EL主要的语法结构: ${sessionScope.user.sex} 所有EL都是以${ ...
- LeetCode43(字符串相乘)
题目: 给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式. 示例 1: 输入: num1 = "2", ...
- java中的URLEncoder和URLDecoder类;中文在地址栏中的处理
[IT168 技术文档] /* 网页中的表单使用POST方法提交时,数据内容的类型是 application/x-www-form-urlencoded,这种类型会: 1.字符"a" ...
- linux find命令格式及find命令详解
本文详细介绍了linux find命令格式及find命令案例,希望对您的学习有所帮助.1.find命令的一般形式为:find pathname -options [-print -exec -ok . ...
- Springboot整合Dubbo和Zookeeper
Dubbo是一款由阿里巴巴开发的远程服务调用框架(RPC),其可以透明化的调用远程服务,就像调用本地服务一样简单.截至目前,Dubbo发布了基于Spring Boot构建的版本,版本号为0.2.0,这 ...
- 码海拾遗:简述C++(一)
C++是Bjarne Stroustrup博士于1982年,在C语言的基础上引入并扩充了面向对象的概念后发明的一种新的程序语言.就与C语言的渊源而言,C++可以说是C语言的超集,它兼容C的一切(可能是 ...
- Pwnable.tw start
Let's start the CTF:和stdin输入的字符串在同一个栈上,再准确点说是他们在栈上同一个地址上,gdb调试看得更清楚: 调试了就很容易看出来在堆栈上是同一块地址.发生栈溢出是因为:r ...
- 达拉草201771010105《面向对象程序设计(java)》第十三周学习总结
达拉草201771010105<面向对象程序设计(java)>第十三周学习总结 第一部分:理论知识 事件处理基础: 事件源:能够产生事件的对象都可 以成为事件源,如文本框.按钮等.一个事件 ...
- .NET Core C#目录
.NET Core技术开发指南 简介 本系列教程是一份关于微软.NET Core技术栈的全面的教程,其中涉及了C#.Typescript.Angular.Redis等一系列的教程.其中教程中通常会含有 ...
- 【MySQL】:事务四大特性与隔离级别
目录 一.事务的概念 二.事务的四大特性 1.原子性 2.一致性 3.隔离性 4.持续性 三.事务语句 1.开启事务:start transaction 2.事务回滚:rollback 指定回滚点 3 ...