---
title: 编译器原理
description: "传统的三段编译器设计中，前端负责解析源码，检查源码错误以及建立抽象语法树来生成编译中间表示（IR）；优化器负责将中间表示进行逻辑重组以及优化；后端负责按照代码运行环境生成机器码并进行链接优化，libc参与静态库链接以及运行时的so库调用。"
url: https://www.hikunpeng.com/document/detail/zh/perftuning/progtuneg/kunpengprogramming_05_0031.html
sourcePath: /source/zh/perftuning/progtuneg/kunpengprogramming_05_0031.html
indexId: 6b01654f61ddd85d9fc565d8affc804542506cb58cb0935bd16a27242fa51bb263
---
# 编译器原理

传统的三段编译器设计中，前端负责解析源码，检查源码错误以及建立抽象语法树来生成编译中间表示（IR）；优化器负责将中间表示进行逻辑重组以及优化；后端负责按照代码运行环境生成机器码并进行链接优化，libc参与静态库链接以及运行时的so库调用。

图1 三段式编译器架构

GCC是一个单一的可执行程序编译器，前端、IR和后端没有明确的分界，耦合严重，难以独立发展，在整个编译过程中，中间诸多信息都无法被其他程序重用。LLVM在继承了传统三段式设计的情况下，将优化器的输入输出接口、数据进行归一，即不同语言的前端解析后生成相同语法规则的中间表示，经过优化后输出通用的代码给不同的后端进行目标代码生成。由于代码目标运行平台有限，后端相对固定，前端的输入格式固定，所以对于一门新语言的编译器开发，LLVM具有方便快捷的集成能力，同样还有多种前端作为开发的样例和对比，进而推动了LLVM框架的繁荣发展。LLVM相对GCC编译器编译速度较快，且目标程序性能表现较好，在编译错误上也有着更加友好的提示。
