人物介绍

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

故事简介

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

一、编写源文件

  源代码:

#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背后的故事!的更多相关文章

  1. printf背后的故事

    printf背后的故事 说起编程语言,C语言大家再熟悉不过.说起最简单的代码,Helloworld更是众所周知.一条简单的printf语句便可以完成这个简单的功能,可是printf背后到底做了什么事情 ...

  2. 你好,C++(4)2.1.3 我的父亲母亲:编译器和链接器 2.1.4 C++程序执行背后的故事

    2.1.3  我的父亲母亲:编译器和链接器 从表面上看,我是由Visual Studio创建的,而实际上,真正负责编译源代码创建生成可执行程序HelloWorld.exe的却是Visual Studi ...

  3. 背后的故事之 - 快乐的Lambda表达式(一)

    快乐的Lambda表达式(二) 自从Lambda随.NET Framework3.5出现在.NET开发者眼前以来,它已经给我们带来了太多的欣喜.它优雅,对开发者更友好,能提高开发效率,天啊!它还有可能 ...

  4. 背后的故事之 - 快乐的Lambda表达式(二)

    快乐的Lambda表达式 上一篇 背后的故事之 - 快乐的Lambda表达式(一)我们由浅入深的分析了一下Lambda表达式.知道了它和委托以及普通方法的区别,并且通过测试对比他们之间的性能,然后我们 ...

  5. ASP.NET Web API自身对CORS的支持: EnableCorsAttribute特性背后的故事

    从编程的角度来讲,ASP.NET Web API针对CORS的实现仅仅涉及到HttpConfiguration的扩展方法EnableCors和EnableCorsAttribute特性.但是整个COR ...

  6. DbUtility v3 背后的故事

    DbUtility v3 背后的故事 时间 DbUtility v3构思了差不多大半年,真正开发到第一个版本发布到NuGet却只花了50天.中途大量时间在完善 Jumony 3,只有三周来开发DbUt ...

  7. using关键字背后的故事!

    using关键字的作用: 1:可以引入命名空间2:可以释放资源 *****不能使用using语句完全替换掉(try-catch-finally)语句(无法进行异常处理) 在出了using语句的{}后, ...

  8. Mac OS X 背后的故事

    Mac OS X 背后的故事 作者: 王越  来源: <程序员>  发布时间: 2013-01-22 10:55  阅读: 25840 次  推荐: 49   原文链接   [收藏]   ...

  9. 联想手机#P1来了#P1背后的故事系列

    http://bbs.lenovo.com/forum.php?mod=viewthread&fid=928&tid=560992&extra=page%3D1 联想手机#P1 ...

随机推荐

  1. python标准库:csv 模块

    原文地址:http://www.bugingcode.com/blog/python_csv.html csv 模块被用来读取CSV格式(用逗号分割数值)的数据文件,CSV格式的文件经常在微软的Exc ...

  2. python编程基础——集合

    集合是是基本数据类型的一种集合类型. 作用:去重 属性:intersection.union.difference.issubset 实例: list_1=[1,2,3,4,3,5,2,6,1]lis ...

  3. 前端学习之路CSS基础学习二

    CSS属性相关 样式操作: (1)width:为元素设置宽度 (2)height:为元素设置高度 ps:块儿级标签才能设置长宽行内标签设置长宽没有任何影响 p{ width: 30px; height ...

  4. Spring中的事件处理

    文章目录 Spring中的事件处理 Spring 的核心是 ApplicationContext,它负责管理 beans 的完整生命周期.当加载 beans 时,ApplicationContext ...

  5. 2019DDCTF部分Writeup

    -- re Windows Reverse1 通过DIE查壳发现存在upx,在linux上upx -d脱壳即可,拖入IDA,通过关键字符串找到关键函数: main函数中也没有什么,将输入的字符串带到s ...

  6. Louis的「每周语文」

    说明:此专栏为Louis收录的经典语录及书影音标记,每周一更新. 成长的本质是变得复杂.当你的主观世界遇到客观世界,之间的那条沟,你掉进去,叫挫折,爬出来,叫成长. -- 语出罗振宇在奇葩说第四季的结 ...

  7. 痞子衡嵌入式:恩智浦i.MX RT1xxx系列MCU启动那些事(11.2)- FlexSPI NOR连接方式大全(RT1060/1064(SIP))

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是恩智浦i.MX RT1060/1064(SIP)两款MCU的FlexSPI NOR启动的连接方式. 上一篇文章<FlexSPI N ...

  8. 《前端之路》--- 重温 Egg.js

    目录 <前端之路>--- 重温 Egg.js 一.基础功能 > 日志系统包含了 四大层面的 日志对象, 分别是 App Logger.App CoreLogger.Context L ...

  9. moment太重? 那就试试miment--一个超轻量级的js时间库

    介绍 Miment 是一个轻量级的时间库(打包压缩后只有1K),没有太多的方法,Miment的设计理念就是让你以几乎为零的成本快速上手,无需一遍一遍的撸文档 由来 首先 致敬一下Moment,非常好用 ...

  10. Spring Cloud Feign 优雅的服务调用

    Fegin 是由NetFlix开发的声明式.模板化HTTP客户端,可用于SpringCloud 的服务调用.提供了一套更优雅.便捷的HTTP调用API,并且SpringCloud整合了Fegin.Eu ...