什么是编译器设计?类型、构建工具、示例

什么是编译器?

编译器是一种计算机程序,可以帮助您将用高级语言编写的源代码转换为低级机器语言。它将用一种编程语言编写的代码翻译成另一种语言,而不会改变代码的含义。编译器还可以使最终代码高效,并针对执行时间和内存空间进行优化。

编译过程包括基本的翻译机制和错误检测。编译器过程在前端经历词法、语法和语义分析,在后端经历代码生成和优化。

Compiler

编译器的特性

  • 正确性
  • 编译速度
  • 保持代码含义的正确性
  • 目标代码的速度
  • 识别合法和非法程序结构
  • 良好的错误报告/处理
  • 代码调试帮助

编译器类型

以下是编译器的不同类型

  • 单遍编译器
  • 两遍编译器
  • 多遍编译器

单遍编译器

Single Pass Compiler
单遍编译器

在单遍编译器中,源代码直接转换为机器代码。例如,Pascal语言。

两遍编译器

Two Pass Compiler
两遍编译器

两遍编译器分为两个部分,即:

  1. 前端:它将合法代码映射到中间表示(IR)。
  2. 后端:它将IR映射到目标机器。

两遍编译器方法还简化了重新定向过程。它还支持多个前端。

多遍编译器

Multipass Compilers
多遍编译器

多遍编译器会多次处理源代码或程序的语法树。它将一个大程序分解成多个小程序并进行处理。它开发了多个中间代码。所有这些多遍都以前一个阶段的输出来作为输入。因此,它需要的内存更少。它也称为“宽编译器”。

编译器的任务

编译器执行的主要任务是:

  • 将源程序分解成片段,并对其施加语法结构
  • 允许您从中间表示构建所需的目标程序,并创建符号表
  • 编译源代码并检测其中的错误
  • 管理所有变量和代码的存储。
  • 支持独立编译
  • 读取、分析整个程序,并翻译成语义等效的
  • 根据机器类型将源代码翻译成目标代码

编译器历史

编译器历史的重要里程碑如下:

  • “编译器”一词最早于 20 世纪 50 年代初由 Grace Murray Hopper 使用。
  • 第一个编译器是由 John Backum 和他的团队于 1954 年至 1957 年在 IBM 构建的。
  • COBOL 是第一个于 1960 年在多个平台上编译的编程语言
  • 在 20 世纪 60 年代和 70 年代,对扫描和解析问题进行了研究,以提供完整的解决方案。

语言处理系统的步骤

在了解编译器概念之前,您需要先了解与编译器一起工作的其他一些工具。

Steps for Language Processing Systems
语言处理系统的步骤
  • 预处理器:预处理器被认为是编译器的一部分。它是一种为编译器生成输入的工具。它处理宏处理、扩充、语言扩展等。
  • 解释器:解释器与编译器类似,都可以将高级语言翻译成低级机器语言。两者之间的主要区别在于解释器逐行读取和转换代码。编译器一次性读取整个代码并创建机器代码。
  • 汇编器:它将汇编语言代码翻译成机器可理解的语言。汇编器的输出结果称为目标文件,它是由机器指令以及将这些指令存储在内存中所需的数据组合而成。
  • 链接器:链接器帮助您链接和合并多个目标文件以创建可执行文件。所有这些文件可能都已通过单独的汇编器进行编译。链接器的主要任务是查找程序中调用的模块,并找出所有模块存储的内存位置。
  • 加载器:加载器是操作系统的一部分,它负责将可执行文件加载到内存并运行它们。它还会计算程序的大小,从而创建额外的内存空间。
  • 交叉编译器:编译器设计中的交叉编译器是一种帮助您生成可执行代码的平台。
  • 源到源编译器:当一种编程语言的源代码被翻译成另一种语言的源代码时,通常使用源到源编译器这个术语。

编译器构造工具

随着计算机相关技术的普及,编译器构造工具应运而生。它们也被称为编译器编译器、编译器生成器或翻译器。

这些工具使用特定的语言或算法来指定和实现编译器组件。以下是编译器构造工具的示例。

  • 扫描器生成器:此工具以正则表达式作为输入。例如,Unix 操作系统的 LEX。
  • 语法制导翻译引擎:这些软件工具使用解析树提供中间代码。它的目标是将一个或多个翻译与解析树的每个节点关联起来。
  • 解析器生成器:解析器生成器以语法作为输入,并自动生成源代码,该源代码可以根据语法解析字符流。
  • 自动代码生成器:接受中间代码并将其转换为机器语言。
  • 数据流引擎:此工具有助于代码优化。在这里,信息由用户提供,并将中间代码进行比较以分析任何关系。它也称为数据流分析。它有助于您找出值如何在程序的一个部分传输到另一部分。

为什么要使用编译器?

  • 编译器会验证整个程序,因此没有语法或语义错误。
  • 可执行文件由编译器优化,因此执行速度更快。
  • 允许您在内存中创建内部结构。
  • 无需在构建它的同一台机器上执行程序。
  • 将整个程序翻译成其他语言。
  • 在磁盘上生成文件。
  • 将文件链接为可执行格式。
  • 检查语法错误和数据类型。
  • 帮助您增强对语言语义的理解。
  • 有助于处理语言性能问题。
  • 非平凡编程项目的机会。
  • 用于构建编译器的技术也可用于其他目的。

编译器的应用

  • 编译器设计有助于高级编程语言的完整实现。
  • 支持计算机体系结构并行性的优化。
  • 机器新内存层次结构的设计。
  • 广泛用于翻译程序。
  • 与其他软件生产力工具结合使用。

摘要

  • 编译器是一种计算机程序,可以帮助您将用高级语言编写的源代码转换为低级机器语言。
  • 正确性、编译速度、保持代码含义的正确性是一些编译器设计的重要特性。
  • 编译器分为三部分:1) 单遍编译器 2) 两遍编译器和 3) 多遍编译器。
  • “编译器”一词最早于 20 世纪 50 年代初由 Grace Murray Hopper 使用。
  • 语言处理系统的步骤是:预处理器、解释器、汇编器、链接器/加载器。
  • 重要的编译器构造工具有 1) 扫描器生成器、2) 语法制导翻译引擎、3) 解析器生成器、4) 自动代码生成器。
  • 编译器的主要任务是验证整个程序,因此没有语法或语义错误。