C++脚本的执行过程, since 2020-11-08

2020-11-08  本文已影响0人  Mc杰夫

(2020.11.08 Sun)
基本执行过程:源码编辑、预处理、编译、优化、汇编、链接、加载

源代码编辑

预处理preprocessing

读源程序,处理其中的伪指令(用#加载的)和特殊符号。
伪指令的四个方面:

可用下面指令做预处理

$gcc -E file.c -o file.i # -E代表只进行预处理
$cpp file.c > file.i #另一种预处理指令,cat file.i即可查看处理后的代码

预处理完成的是替换工作,生成一个没有宏定义、条件编译指令、特殊符号的输出文件。文件含义相同,但是内容不同。

编译compilation

编译器compiler对程序进行编译,检察错误,生成目标文件,该目标文件中含有汇编代码。编译过程是把预处理完成的文件进行一些列的词法分析,语法分析,语义分析和优化,并生成汇编代码。

$gcc -S file.i -o file.s
$/usr/lib/gcc/i486-linux-gnu/4.4/cc1 file.c #另一种编译方法

编译过程是以c/c++文件为单位进行的,没有该文件就没法编译。预编译得到的输出文件中,有常量的定义,和编程语言的关键字。编译程序通过语法分析和词法Fenix,在确认所有的指令都符合语法规则之后,将其翻译成等价的中间代码表示或汇编代码。

优化

优化的一部分是对中间代码的优化,不依赖于具体的计算机。主要工作是删除公共表达式、循环油画、复写传播,以及无用赋值的删除等。
另一部分针对目标代码的生成而进行,与电脑的硬件结构密切相关,主要关注如何充分利用机器的各个硬件寄存器存放的有关变量的值,以减少对于内存的访问次数。此外还会关注如何根据电脑硬件执行指令的特点(如流水线、RISC、CISC、VLIW等)而对指令进行一些调整使目标代码更短,执行效率更高。

汇编assembly

汇编过程是指把汇编语言代码翻译成目标机器指令的过程。对于C源程序,都要经过这个步骤得到相应的目标文件,目标文件存放的就是与源程序等效的目标的机器语言代码

$gcc -c file.c -o file.o
$as file.s -o file.co #另一种

通常一个目标文件至少有两个段,代码段和数据段。代码段中包含的主要是程序的指令,一般是可读和可执行的,但一般不可写。数据段主要存放程序中要用到的各种全局变量或静态数据,一般都是可读,可写,可执行。

链接linking

在这一步链接器linker将超过1个的目标文件或库文件连接并生成可执行文件。

$ld -static xxx.o xxx. -start- group xxx xxx xxx #待查

主要工作是将目标文件彼此相连接,并将一个文件中引用的符号同该符号在另一个文件中的定义连接起来,使得所有目标文件成为一个能够被操作系统装入执行的统一整体。
链接处理分为两种

加载loader

将可执行文件加载到内存中并运行。默认可执行文件的名字a.out。

脚本执行过程中的文件名

C源代码的文件名为xx.c,预处理器读xx.c并生成xx.i或xx.ii(C++),该文件中包含预处理代码。编译器读xx.i将其转化为汇编代码并生成xx.s,最终生成目标文件xx.o。链接器读xx.o文件,并连接其他的目标文件和库文件生成可执行文件xx.out/xx.exe。将可执行加载到内存中即可运行。

另外,一个叫做xx.bak的文件如果被生成,则它是程序文件的backup备份文件。

上一篇下一篇

猜你喜欢

热点阅读