📜  编译器设计介绍

📅  最后修改于: 2021-06-28 07:40:48             🧑  作者: Mango

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

  • 在计算机“ A”上运行并为另一台计算机“ B”生成代码的交叉编译器。它能够为运行编译器的平台以外的平台创建代码。
  • 源到源编译器或Transcompiler或Transpiler是将以一种编程语言编写的源代码转换为另一种编程语言的源代码的编译器。

语言处理系统(使用编译器)–
我们知道计算机是软件和硬件的逻辑组合。硬件知道一种语言,这对我们来说很难掌握,因此,我们倾向于使用高级语言编写程序,而对于我们来说,理解和维护思想就不那么复杂了。现在,这些程序经历了一系列的转换,因此它们可以很容易地被机器使用。这是语言程序系统派上用场的地方。

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

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

分析阶段–从给定源代码创建中间表示形式:

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

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

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

代码优化器优化抽象代码,最终代码生成器将抽象中间代码转换为特定的机器指令。

GATE CS Corner问题

练习以下问题将帮助您测试知识。在前几年的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(Set 3),问题65
  8. GATE CS 2015(第2集),问题29

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