📜  编译器设计介绍

📅  最后修改于: 2021-09-28 11:02:35             🧑  作者: Mango

编译器是一种将用高级语言(源语言)编写的程序转换为低级语言(对象/目标/机器语言)的软件。

  • 在机器“A”上运行并为另一台机器“B”生成代码的交叉编译器。它能够为运行编译器的平台以外的平台创建代码。
  • Source-to-source Compiler或 transcompiler 或 transpiler 是一种编译器,它将以一种编程语言编写的源代码转换为另一种编程语言的源代码。

语言处理系统(使用编译器)——
我们知道计算机是软件和硬件的逻辑组合。硬件知道一种语言,我们很难掌握,因此我们倾向于用高级语言编写程序,这对我们在思想上的理解和维护要简单得多。现在这些程序经过了一系列的改造,以便它们可以很容易地被机器使用。这是语言程序系统派上用场的地方。

  • 高级语言——如果程序包含#define 或#include 指令,例如#include 或#define,则称为HLL。它们更接近人类,但远离机器。这些 (#) 标记称为预处理器指令。他们指导预处理器做什么。
  • 预处理器 –预处理器通过包含称为文件包含的文件和所有使用宏扩展的 #define 指令来删除所有 #include 指令。它执行文件包含、扩充、宏处理等。
  • 汇编语言 –它既不是二进制形式也不是高级别的。它是一种中间状态,是机器指令和执行所需的其他一些有用数据的组合。
  • 汇编器——对于每个平台(硬件 + 操作系统),我们都有一个汇编器。它们不是通用的,因为对于每个平台我们都有一个。汇编器的输出称为目标文件。它把汇编语言翻译成机器码。
  • 解释器——解释器将高级语言转换为低级机器语言,就像编译器一样。但是它们读取输入的方式不同。编译器一次性读取输入,进行处理并执行源代码,而解释器逐行执行相同的操作。编译器扫描整个程序并将其作为一个整体翻译成机器代码,而解释器一次翻译一个语句。解释程序通常比编译程序慢。
  • 可重定位机器代码——它可以在任何时候加载并且可以运行。程序内的地址将采用这样一种方式,它将配合程序移动。
  • 加载器/链接器 –它将可重定位代码转换为绝对代码并尝试运行程序,从而导致正在运行的程序或错误消息(有时两者都可能发生)。链接器将各种目标文件加载到单个文件中以使其可执行。然后加载器将它加载到内存中并执行它。

编译器的阶段 –
编译有两个主要阶段,而这又包含许多部分。他们每个人都从上一级的输出中获取输入,并以协调的方式工作。

分析阶段——从给定的源代码创建一个中间表示:

  1. 词法分析器
  2. 语法分析器
  3. 语义分析器
  4. 中间代码生成器

词法分析器将程序划分为“标记”,语法分析器使用语言的语法识别程序中的“句子”,语义分析器检查每个结构的静态语义。中间代码生成器生成“抽象”代码。
合成阶段——从中间表示创建等效的目标程序。它有两个部分:

  1. 代码优化器
  2. 代码生成器

Code Optimizer 对抽象代码进行优化,最终的 Code Generator 将抽象的中间代码翻译成具体的机器指令。

GATE CS 角问题

练习以下问题将帮助您测试您的知识。所有问题都在前几年的 GATE 或 GATE 模拟测试中提出。强烈建议您练习它们。

  1. GATE CS 2011,问题 1
  2. GATE CS 2011,问题 19
  3. GATE CS 2009,问题 17
  4. GATE CS 1998,问题 27
  5. GATE CS 2008,问题 85
  6. GATE CS 1997,问题 8
  7. GATE CS 2014(第 3 组),问题 65
  8. GATE CS 2015(第 2 组),问题 29

参考 –
编译介绍 – viden.io
幻灯片共享