编译器入门 - 概述和词法分析器
编译器组件
莱克瑟
由 Mux 赞助的 DEV 全球展示挑战赛:展示你的项目!
这些编译器相关的文章都将从宏观层面进行介绍,内容基于2016年Xojo开发者大会上的LLVM和编译器专题讲座。这些文章不会教你如何编写编译器。它们的目的是让你对编译器的组成部分以及它们如何协同工作以创建原生应用程序有一个基本的了解。
编译器组件
编译器是一个复杂的系统,由许多组件构成。通常,编译器分为两大部分:前端和后端。而这两部分本身又各自包含多个组件。
在本系列文章中,我们将按以下方式介绍编译器的各个组成部分:
前端
前端负责接收源代码并将其转换为后端可以生成的二进制代码格式,该二进制代码可以在目标 CPU 架构上运行。前端包含以下组件:
- 莱克瑟
- 解析器
- 语义分析器
- 中间表示 (IR) 生成器
后端
后端接收中间表示(IR),并可选择对其进行优化,然后生成可在目标 CPU 架构上运行的二进制(机器代码)文件。后端包含以下组件:
- 优化器
- 代码生成
- 连接器
这些步骤中的每一个都是为了处理一些事情,以便下一步能够处理。
链接器从技术上讲并不属于编译器的一部分,但通常被认为是编译过程的一部分。
莱克瑟
词法分析器将源代码转换成一系列词法单元(token)。这个词实际上是“词法分析”(lexical analysis)的缩写。一个词法单元本质上是对代码中每个元素的简单表示。
例如,下面这行源代码可以进行简单的计算:
sum = 3.14 + 2 * 4
- 它找到的第一个标记是“sum”。
- 类型:标识符
- 值:总和
- 起始值:0
- 长度:3
- Token: =
- 类型:等于或赋值
- 值:不适用
- 起始时间:4
- 长度:1
- 代币:3.14
- 类型:双精度
- 数值:3.14
- 起始时间:6
- 长度:4
- 令牌:+
- 类型:加号
- 值:不适用
- 开始:11
- 长度:1
- 令牌:2
- 类型:整数
- 值:2
- 起始时间:15
- 长度:1
- 令牌:*
- 类型:乘
- 值:不适用
- 起始时间:15
- 长度:1
- 令牌:4
- 类型:整数
- 数值:4
- 起始时间:17
- 长度:1
如您所见,空格和注释都被忽略了。因此,在处理完这一行代码后,有 7 个标记被传递给编译器的下一部分,即解析器。解析器将在下一篇文章中介绍。
本文最初发表于 Xojo 博客,标题为“编译器 101 - 概述和词法分析器”。
文章来源:https://dev.to/lefebvre/compilers-101---overview-and-lexer-3i0m