这个问题就是编译、运行的问题,在很多面试中都会遇到。(今日头条的研发岗面试题就问到cpp文件是怎样运行起来的?)
在此,详细说明C语言的编译运行过程,CPP参考一下也就很容易明白了。
C语言是怎么运行的?
首先放一张图,说明C语言的运行过程。
C语言要想运行就要经过翻译环境,将 .c/.h 文件翻译成机器可以识别的机器码;
这个翻译过程可以分为编译和链接两个阶段;
编译:分为预编译、编译、汇编
预编译
是文件操作。在这个阶段会进行#include头文件包含,注释删除,#define标识符替换,宏定义替换。
经过这个阶段,test.c 文件经过预编译成为 test.i文件。
执行 gcc -E test.c 后,当前目录出现 test.i 文件,代码变为:
编译
是将源代码翻译成汇编代码,test.i → test.s。
这个过程包含:词法分析,语法分析,语义分析,源代码优化,代码生成和目标代码优化。
执行 gcc -S test.c 后,当前目录出现 test.i 文件,代码变为:
查看 test.s 内容:
汇编过程是将汇编代码翻译成机器可以识别的二进制指令并形成符号表。 test.s → test.o (目标文件)。
执行 gcc -C test.c 后,出现了test.o文件,打开看到一堆机器码。
到这里,编译环节就完了。接下来就是链接。
- 链接阶段是符号表的合并和重定义。
链接
生成a.out可执行文件。
cpp是怎样运行的?
cpp文件的运行大致和C语言相同,具体过程参考下图理解。
cpp文件的翻译过程前期编译和C文件一样,区别在于链接过程不同,在编译器把所有的.cpp文件都转变成.obj文件后,链接器把所有的静态链接库(.lib)文件和所有的.obj文件链接起来形成.exe文件,最后运行.exe文件并在过程中会加载动态链接库(.dll)。
- 对于obj文件和EXE文件都是二进制表示的,电脑都能识别,为什么还要进行链接转换呢?
obj是源码编译文件,而exe是编译后的解释生成的文件。
虽然都是二进制文件,但是计算机底层的一些原理导致无法执行obj,
所以需要转化为exe