什么是编译器设计?类型、构建工具、示例
什么是编译器?
编译器是一种计算机程序,可以帮助您将用高级语言编写的源代码转换为低级机器语言。它将用一种编程语言编写的代码翻译成另一种语言,而不会改变代码的含义。编译器还可以使最终代码高效,并针对执行时间和内存空间进行优化。
编译过程包括基本的翻译机制和错误检测。编译器过程在前端经历词法、语法和语义分析,在后端经历代码生成和优化。
编译器的特性
- 正确性
- 编译速度
- 保持代码含义的正确性
- 目标代码的速度
- 识别合法和非法程序结构
- 良好的错误报告/处理
- 代码调试帮助
编译器类型
以下是编译器的不同类型
- 单遍编译器
- 两遍编译器
- 多遍编译器
单遍编译器
在单遍编译器中,源代码直接转换为机器代码。例如,Pascal语言。
两遍编译器
两遍编译器分为两个部分,即:
- 前端:它将合法代码映射到中间表示(IR)。
- 后端:它将IR映射到目标机器。
两遍编译器方法还简化了重新定向过程。它还支持多个前端。
多遍编译器
多遍编译器会多次处理源代码或程序的语法树。它将一个大程序分解成多个小程序并进行处理。它开发了多个中间代码。所有这些多遍都以前一个阶段的输出来作为输入。因此,它需要的内存更少。它也称为“宽编译器”。
编译器的任务
编译器执行的主要任务是:
- 将源程序分解成片段,并对其施加语法结构
- 允许您从中间表示构建所需的目标程序,并创建符号表
- 编译源代码并检测其中的错误
- 管理所有变量和代码的存储。
- 支持独立编译
- 读取、分析整个程序,并翻译成语义等效的
- 根据机器类型将源代码翻译成目标代码
编译器历史
编译器历史的重要里程碑如下:
- “编译器”一词最早于 20 世纪 50 年代初由 Grace Murray Hopper 使用。
- 第一个编译器是由 John Backum 和他的团队于 1954 年至 1957 年在 IBM 构建的。
- COBOL 是第一个于 1960 年在多个平台上编译的编程语言。
- 在 20 世纪 60 年代和 70 年代,对扫描和解析问题进行了研究,以提供完整的解决方案。
语言处理系统的步骤
在了解编译器概念之前,您需要先了解与编译器一起工作的其他一些工具。
- 预处理器:预处理器被认为是编译器的一部分。它是一种为编译器生成输入的工具。它处理宏处理、扩充、语言扩展等。
- 解释器:解释器与编译器类似,都可以将高级语言翻译成低级机器语言。两者之间的主要区别在于解释器逐行读取和转换代码。编译器一次性读取整个代码并创建机器代码。
- 汇编器:它将汇编语言代码翻译成机器可理解的语言。汇编器的输出结果称为目标文件,它是由机器指令以及将这些指令存储在内存中所需的数据组合而成。
- 链接器:链接器帮助您链接和合并多个目标文件以创建可执行文件。所有这些文件可能都已通过单独的汇编器进行编译。链接器的主要任务是查找程序中调用的模块,并找出所有模块存储的内存位置。
- 加载器:加载器是操作系统的一部分,它负责将可执行文件加载到内存并运行它们。它还会计算程序的大小,从而创建额外的内存空间。
- 交叉编译器:编译器设计中的交叉编译器是一种帮助您生成可执行代码的平台。
- 源到源编译器:当一种编程语言的源代码被翻译成另一种语言的源代码时,通常使用源到源编译器这个术语。
编译器构造工具
随着计算机相关技术的普及,编译器构造工具应运而生。它们也被称为编译器编译器、编译器生成器或翻译器。
这些工具使用特定的语言或算法来指定和实现编译器组件。以下是编译器构造工具的示例。
- 扫描器生成器:此工具以正则表达式作为输入。例如,Unix 操作系统的 LEX。
- 语法制导翻译引擎:这些软件工具使用解析树提供中间代码。它的目标是将一个或多个翻译与解析树的每个节点关联起来。
- 解析器生成器:解析器生成器以语法作为输入,并自动生成源代码,该源代码可以根据语法解析字符流。
- 自动代码生成器:接受中间代码并将其转换为机器语言。
- 数据流引擎:此工具有助于代码优化。在这里,信息由用户提供,并将中间代码进行比较以分析任何关系。它也称为数据流分析。它有助于您找出值如何在程序的一个部分传输到另一部分。
为什么要使用编译器?
- 编译器会验证整个程序,因此没有语法或语义错误。
- 可执行文件由编译器优化,因此执行速度更快。
- 允许您在内存中创建内部结构。
- 无需在构建它的同一台机器上执行程序。
- 将整个程序翻译成其他语言。
- 在磁盘上生成文件。
- 将文件链接为可执行格式。
- 检查语法错误和数据类型。
- 帮助您增强对语言语义的理解。
- 有助于处理语言性能问题。
- 非平凡编程项目的机会。
- 用于构建编译器的技术也可用于其他目的。
编译器的应用
- 编译器设计有助于高级编程语言的完整实现。
- 支持计算机体系结构并行性的优化。
- 机器新内存层次结构的设计。
- 广泛用于翻译程序。
- 与其他软件生产力工具结合使用。
摘要
- 编译器是一种计算机程序,可以帮助您将用高级语言编写的源代码转换为低级机器语言。
- 正确性、编译速度、保持代码含义的正确性是一些编译器设计的重要特性。
- 编译器分为三部分:1) 单遍编译器 2) 两遍编译器和 3) 多遍编译器。
- “编译器”一词最早于 20 世纪 50 年代初由 Grace Murray Hopper 使用。
- 语言处理系统的步骤是:预处理器、解释器、汇编器、链接器/加载器。
- 重要的编译器构造工具有 1) 扫描器生成器、2) 语法制导翻译引擎、3) 解析器生成器、4) 自动代码生成器。
- 编译器的主要任务是验证整个程序,因此没有语法或语义错误。