跳转至

06 C++编译器是如何工作的

1. Abstract syntax tree

编译器的工作是把代码转化为constant data(常数资料)和instructions(指令),构建抽象语法树后开始生产代码

cpp 中没有文件的概念,文件只是给编译器提供源码的一个方式

.cpp 告诉编译器用 c++编译->编译器当成一个translation unit->得到一个.obj

常见的preprocessor语句==pragma statement==

include
define
if
ifdef

常见的 Preprocessor statement

2. 1 #include

#include就是把想要的文件中的内容复制进来.比如创建了一个 EndBrace.h,2 其中的内容是:

}

则我的 Multiple 函数这么写仍可以正常编译

int Multiply(int a, int b)
{
    int result = a * b;
    return result;
    #include "EndBrace.h"

检查 Preprocess 的文件,可通过如下操作生成.i 文件

Math.i 文件内容如下

2.2 #define

#define INTEGER int

搜索 INTEGER 这个词,然后替换成后面的东西

2.3 #if

可以让我们依据特定条件==包含==或==剔除==代码

//剔除
#if 0
int Multiply(int a, int b)
{
    int result = a * b;
    return result;
}
#endif

可将.obj 转化为可读版本的.asm 文件,阅读二进制用了 vscode 插件Hex Editor

3. 编译器优化

3.1 简单案例

int result = a * b
return result

====>

return a * b

3.2 constant folding

return 5 * 2

====>

return 10

3.3 函数签名和 call

call 即调用函数,通过图中的符号修饰对函数做唯一签名认真,让linker按函数签名寻找函数

修改编译器,可以自动优化汇编指令