# 编译原理基础

4 min read
Table of Contents

复习材料,不建议阅读

编译

几种程序

  • 翻译程序:把一种语言程序转换成另一种功能等价的语言程序。(源语言->目标语言)
  • 编译程序:一种翻译程序,把高级语言翻译为低级语言。
  • 解释程序:一种翻译程序,立即执行源程序,通常是逐句翻译。

高级语言处理过程

主要涉及预处理程序、编译程序、汇编程序、装配连接程序。

需预处理源程序->源程序->目标语言->机器码->绝对机器码

编译做什么

  • 词法分析
  • 语法分析
  • 语义分析
  • 中间代码生成
  • 代码优化
  • 目标代码生成

词法分析

对源程序字符串扫描分解,识别出单词符号。(拆分字符串)

例如

main()
{}

词法分析后的输出:

保留字 main
左括号 (
右括号)
左花括号{
右花括号 }

语法分析

根据语言的语法规则对符号序列进行语法分析,识别出语法短语,判断语法是否正确。(识别短语,判断正确)

输入输出都是单词序列。

语义分析

对语法分析的结果分析语义错误,收集类型信息。(语义,类型)

中间代码生成

把源程序变成结构简单、含义明确、易生成目标代码的形式。

代码优化

对中间代码或目标代码进行变换改造等优化处理,提高效率。

目标代码生成

将语义分析结果或中间代码变成目标代码。(一般是汇编等)

也就是说可以跳过中间代码直接生成汇编。

编译阶段

前后端组合法

  • 前端:与源语言有关,目标机无关部分。(1-4阶段)

  • 后端:与目标机有关部分。(6阶段)

5阶段前后都可。

也就是语言对应前端,机器架构等对应后端。

遍组合方式

分多趟/遍,每次完成一个或几个阶段工作。通过源语言与目标机器的特征分遍。

例子

Zig 编译至 arm64 机器码

前端

  1. zig 切分为 token 构造抽象语法树(AST)
  2. 语义分析与 comptime 计算
  3. AST 线性化为 AIR 中间表示

后端

  1. 转为 LLVM IR 并优化
  2. 生成 AARCH64 机器码
  3. 连接标准库等生成最终产物
My avatar

Thanks for reading my blog post! Feel free to check out my other posts or contact me via the social links in the footer.


More Posts

Comments