汇编、C/C++编译过程


前言

最近安装汇编环境的时候了解到代码的执行与编译过程,对自己曾经学习过语言的编译过程无法准确的回答,借此进行一些简单的梳理。


一、汇编的编译过程

汇编作为我们能够接触到最底层的语言、低级语言,汇编语言的编译方法多是基于对于寄存器的控制,可以直接翻译成机器代码,它同样是其他高级语言的基础,高级语言如 Python、C++ 和 Java 与汇编语言的关系是一对多。比如,C++ 的一条语句就会扩展为多条汇编指令。
故汇编的编译过程较为简单。
汇编、C/C++编译过程_第1张图片
(1)使用任意一种文本编辑器输入事先已手工编写好的汇编语言源程序,并将其存储为扩展名为.ASM的文件;
(2)使用汇编程序(ASM、MASM或TASM)对.ASM文件进行汇编,即对.ASM文件进行语法检查,在没有语法错误的情况下将其汇编成.OBJ文件。
(3)通过连接程序(LINK)将.OBJ文件连接装配成可在计算机上直接运行的可执行文件.EXE。

二、C/C++编译过程

1、概述

C/C++语言的编译分为四个阶段:预处理、编译、汇编和链接。
汇编、C/C++编译过程_第2张图片
接下来我们看一看具体的编译过程。

2.预处理

其实预处理的说法不是很严格,在C++标准中把translation分为9个阶段.其中前4个阶段是我们所说的“预处理”,下面列出这4个阶段(说的不详细,详见参考文献):

1、字符映射(Trigraph replacement):将系统相关的字符映射到C++标准定义的相应字符,但语义不变,如对不同操作系统上的不同的换行符统一换成规定字符(设为newline);
2、续行符处理(Line splicing):对于“\”紧跟newline的,删去“\”和newline(我们在#define等中用的续行在Preprocessor之前就处理了),该过程只进行1遍(如果是“\”后有两个换行只会删去一个“\”);
3、字串分割(Tokenization):源代码作为一个串被分为如下串(Token)的连接:注释、whitespace、preprocessing tokens(标示符等这时都是preprocessing tokens,因为此时不知道谁是标示符,经过下一步之后,真正的预处理符会被处理);
5、执行Preprocessor:对#include指令做递归进行该1-4步,此步骤时候源代码中不再含有任何预处理语句(#开头的哪些)。:

3、编译

编译阶段做的事情就是编译器(cc1)将C程序main.i翻译成汇编语言程序main.s。
检查C程序的语法错误
将文件翻译成中间代码,即汇编语言
可选地优化翻译后的中间代码,获得更好的性能

4、汇编

C/C++所进行的汇编指令与汇编语言的汇编没有什么区别,因为C/C++经过编译后在此阶段的形式即为汇编代码。

5、链接

C/C++链接对于我来说比较熟悉,在大一的上半学期C语言的学习中,一位老师为我们引入了动态链接库与静态链接库的概念。
动态链接库:允许可执行模块(.dll文件或.exe文件)仅包含在运行时定位DLL中函数的可执行代码所需的信息。
静态链接库:链接器从静态链接库LIB获取所有被引用函数,并将库同代码一起放到可执行文件中。

你可能感兴趣的:(c++)