# 编译器的阶段

## 词法分析

源程序到记号流的转换

```shell
$ clang -cc1 -dump-tokens xx.c
```

## 语法分析

建语法树

```shell
$ clang -fsyntax-only -Xclang -ast-dump xx.c
```

## 语义分析

检查程序的不一致

## 中间代码生成

生成机器无关的中间代码

```shell
$ clang -cc1 xx.c -emit-llvm -o xx.ll
```

## 机器无关代码优化

生成更快、更短或能耗低的目标代码

```shell
$ clang -S -emit-llvm -O3 xx.c -o xx-new.ll
```

## 目标代码生成

为变量选择寄存器或内存位置

```shell
llc-14 xx.ll -o xx.s
```