编译器设计概述
计算机是我们生活中不可或缺的工具,因为它运行的应用程序可以解决许多现实生活中的问题。计算机程序员编写程序(使用编程语言)来执行各种任务。目前使用的高级编程语言只能被人类理解,但不能被计算机理解。
它需要一个编译器来将这种高级语言转换为机器可以理解的语言。在这篇文章中,我们将了解到编译器设计的基本方面。所涉及的一些方面包括语言处理系统,编译器设计架构,以及编译器的阶段。文章还将讨论编译器技术在现实生活中的应用。
什么是编译器?
编译器是一种计算机程序,它能将源语言(高级语言(HLL))转换成机器语言(低级语言(LLL)),而不改变程序的含义。它是机器可读语言和人类可读语言之间的一个中介。编译器设计的原则给出了翻译和优化过程的概述。
编译器可以进行各种操作,如解析、预处理、词法分析和语义分析。它还可以进行代码生成和代码优化。这些操作是在由输入和输出组成的阶段中实现的。
有各种类型的编译器。
一些常见的类型包括。
- 源到源的编译器:这是一种编译器,其中一种语言的源代码被转化为另一种语言的源代码。例子包括[CoffeeScript]和[Haxe]。
- 交叉编译器:在这种编译器中,源代码可以在一台机器中产生,并在另一台机器中执行。[GNU编译器集(GCC)]是交叉编译器的一个好例子。
- JIT(just in time)编译器:在这种编译器中,编译工作被推迟到运行时进行。它适用于现代编程语言,如Python、Java和JavaScript。
- 硬件编译器:这是一种使用硬件配置来产生输出的编译器,而不是一串指令。[Xilinx Synthesis Tool(XST)]是硬件编译器的一个很好的例子。
语言处理系统介绍
学习C编程语言的语言处理系统可以提高我们对编译器的利用方式的理解。这个系统由各种组件组成,对输入的语言进行处理,产生所需的输出。
计算机程序员首先使用HLL(C编程语言)编写源代码。然后,源代码经过语言处理系统的各个组件。这些组件是按照逻辑顺序组织的。
以下是对这些组件的简要解释。
- 预处理器:这个工具产生一个输出,作为编译器的输入。它执行各种操作,如宏处理、语言扩展和文件包含。
- 编译器:它编译高级语言并将其翻译成汇编器可以理解的语言(汇编代码或低级语言)。
- 汇编器:这个工具使用编译器的输出作为其输入。在这个工具中,汇编代码被转化为机器代码。汇编器产生的输出被称为目标文件。
- 链接器:这个工具将汇编器的输出转化为可执行的机器代码。在这里,所有的程序部分都被连接起来以加强执行。
- 装载器:这个工具收集可执行的机器码,并将它们加载到内存中执行。
编译器设计架构
编译器设计架构可分为两个主要部分:分析和综合。
分析部分
这一部分代表了编译器设计的前端。它包括各种操作,如分析源代码,将核心分成若干部分,并检查是否有错误。它还构建了一个符号表,将源代码符号映射到相关信息,如类型、范围和位置。
程序的中间表示(IR)在被送到综合阶段之前被生成和分析。该架构的分析部分包括预处理、词法分析、语法分析和语义分析等阶段。
合成
这一部分使用中间代码表示作为输入。它代表了编译器设计中的后端。架构的综合部分利用符号表和中间代码表示来产生目标程序。它由优化和代码生成等阶段组成。
编译器的阶段
下图显示了一个编译器的主要阶段。这些阶段位于编译器设计架构的上述两个部分。
以下是对这些阶段的简要描述。
- 词汇分析:这是编译器的第一个阶段,它接收源代码,进行扫描,并将其转换为词素。这些词素由词法分析器以标记形式表示。标记由各种类别组成,如分隔符、标识符、运算符、注释和关键词。
- 语法分析:这个阶段也被称为解析。它使用前一阶段产生的标记来产生一个语法树(解析树)。它检查标记表达式在语法上是否正确。
- 语义分析:这个阶段检查解析树中的语言规则是否被遵循。语义信息被添加到语法分析中产生的解析树中。语义分析阶段进行各种操作,如检查错误、将变量与相应的定义联系起来,并发出警告。这个阶段的输出是以注释语法树的形式出现的。
- 中间代码生成:这个阶段涉及到生成一个可以翻译成最终机器代码的中间代码。中间表示可以是各种形式,如三地址代码(与语言无关)、字节代码或堆栈代码。
- 代码优化:这是一个可选的阶段,改进或优化中间代码,使输出能够更快地运行。这个阶段消除了不必要的代码行,并确保输出占用更少的空间。
- 代码生成:这是最后一个阶段,将优化后的代码转变为所需的机器代码。
编译器技术的应用
高级编程语言的实施
编译器技术在实施高级编程语言时得到了应用。这些语言只有在有编译器将其转化为机器可以理解的低级语言时才能实现。优化编译器可以帮助提高或优化代码的性能,从而消除与高层抽象有关的低效率。
新的计算机架构设计
这项技术也被用于设计计算机体系结构。计算机架构设计经过多年的发展。最初,编译器是在机器建立起来之后创建的。现在,编译器是在新计算机架构的处理器设计阶段建立的。编译后的代码在模拟器上运行,以评价或评估架构的特点。
利用编译器技术的架构的例子包括[减少指令集计算机架构(RISC)]和专门的架构,如[超长指令字机(VLIW)],以及[单指令多数据(SIMD)架构]。
计算机架构优化
编译器技术主要通过两种方式来优化计算机体系结构:内存层次结构和并行性。并行性允许多个操作在同一时间(同时)执行。
它还使不同的应用线程能够在不同的处理器上运行。存储器层次结构允许程序员开发一个大而快速的存储。
程序翻译
这项技术也被应用于各种程序翻译,如二进制翻译、硬件合成和数据库查询解释。在二进制翻译中,编译器技术被用来翻译二进制代码。
在硬件综合中,编译器被用来将RTL(寄存器传输级)描述转化为门电路。编译器用于将查询语言(如结构化查询语言(SQL))翻译成可用于搜索数据库中记录的命令。
结论
编译器是一个重要的计算机程序,用于将人类可读的语言转换为机器语言。它与其他组件如预处理器、汇编器和加载器一起工作,在语言处理系统中产生预期的输出。它包括各种阶段,如词法分析、语法分析、语义分析、代码优化和代码生成。
编译器技术被应用于各种计算机领域,如HLL实现、程序翻译和计算机结构(设计和优化)。在未来,我们可能会经历复杂的编译器技术,它将与各种计算机应用相结合。