❤️❤️❤️拯救者-编译原理期末速成❤️❤️❤️
第1章 引论
编译程序和解释程序、编译过程和编译程序的结构、
< 编译程序和解释程序 >
- 编译程序和解释程序是用于执行计算机程序的两种不同方法。它们在程序执行方式和性能上有一些关键区别。
- 编译程序(Compiler):
- 编译程序是一种将源代码文件一次性转换为机器代码(或中间代码)的工具。这个过程称为编译。
- 编译过程发生在程序实际运行之前,通常由一个称为编译器的特殊程序执行。
- 编译后的代码保存在一个可执行文件中,该文件可以在不需要源代码的情况下多次执行。
- 编译程序的主要优势是在执行时通常比解释程序更快,因为代码已经转换为机器代码。
- 典型的编译语言包括C、C++、Java(部分编译和部分解释)、Rust等。
- 解释程序(Interpreter):
- 解释程序是一种逐行解释源代码,并在运行时执行代码的工具。解释器逐行读取源代码,并根据其内容执行相应的操作。
- 解释器不生成独立的可执行文件,而是每次运行都需要重新解释源代码。
- 解释程序的主要优势在于它们更灵活,允许动态类型检查和动态内存管理。
- 典型的解释语言包括Python、JavaScript、Ruby、PHP等。
- 编译程序和解释程序的一些比较:
- 性能:编译程序通常在执行时更快,因为它们已经将源代码转换为机器代码,无需再解释;解释程序的执行速度较慢,因为它们需要逐行解释源代码。
- 调试:解释程序通常更容易调试,因为它们可以提供更详细的错误信息和动态修改代码的能力;译程序在调试时可能需要更多的工作,因为错误信息通常不如解释程序详细,并且可能需要重新编译整个程序。
- 跨平台性:解释程序通常更具有跨平台性,因为它们的解释器可以在不同平台上运行相同的源代码;编译程序可能需要针对不同的平台重新编译,以生成针对特定平台的可执行文件。
总之,编译程序和解释程序各有优势和劣势,选择哪种取决于项目的需求和性能要求。有时候,混合使用这两种方法也可以实现最佳的性能和灵活性。例如,一些语言采用即时编译(Just-In-Time Compilation,JIT)的方式,在运行时将部分代码编译成机器代码,以获得更好的性能和灵活性。
1.2 编译过程和编译程序的结构(重点)
1.2.1 编译过程概述
1.2.2 编译程序结构
1.2.3 编译阶段的组合
编译过程是将源代码转换为目标代码(通常是机器代码或中间代码)的一系列步骤。编译程序的结构涉及这些步骤的组织和实现。以下是编译过程和编译程序的基本结构:
编译过程的基本步骤:
-
词法分析(Lexical Analysis):也称为扫描(Scanning),这个步骤将源代码分割成一个个的词法单元(tokens),例如,将源代码中的字符串、关键字、标识符等分离出来。
-
语法分析(Syntax Analysis):在这一步中,编译器使用词法分析器生成的词法单元来构建语法树(Syntax Tree)或抽象语法树(Abstract Syntax Tree,AST),以验证源代码的语法是否正确。
-
语义分析(Semantic Analysis):编译器进行语义检查,确保源代码的语义是正确的。这包括类型检查、变量声明检查以及其他语言特定的语义规则。
-
中间代码生成(Intermediate Code Generation):在这一步中,编译器生成中间代码,这是一种抽象的表示形式,通常比源代码更容易优化和转换为目标代码。中间代码可以是三地址代码、虚拟机代码等。
-
优化(Optimization):编译器可以对中间代码进行各种优化,以提高目标代码的性能。这包括常量折叠、死代码消除、循环展开等。
-
目标代码生成(Code Generation):在这一步中,编译器将中间代码转换为目标代码,这是特定于目标平台的机器代码或汇编语言。
-
链接(Linking):如果程序由多个源文件组成,链接器将这些文件组合在一起,解析符号引用,并创建最终可执行文件。
编译程序的基本结构:
编译程序是一个复杂的软件系统,通常由多个组件组成。以下是一个典型的编译程序的结构:
-
前端(Front End):前端负责词法分析、语法分析、语义分析和中间代码生成。它将源代码转换为中间表示形式。前端通常与编程语言的语法和语义紧密相关。
-
优化器(Optimizer):优化器是一个可选的组件,用于对中间代码进行各种优化。它可以包括多个优化阶段,以提高目标代码的性能。
-
后端(Back End):后端负责目标代码的生成。它将中间代码转换为目标平台的机器代码或汇编语言。后端通常与目标硬件架构相关。
-
符号表管理器(Symbol Table Manager):编译程序需要维护一个符号表,用于跟踪变量、函数和其他标识符的信息。符号表管理器负责创建、更新和查询符号表。
-
错误处理器(Error Handler):编译程序需要检测和处理源代码中的错误。错误处理器负责报告错误并提供有关错误的详细信息。
-
驱动程序(Driver):编译程序的驱动程序协调前端、优化器、后端和其他组件之间的交互。它指导整个编译过程并生成最终的目标文件或可执行文件。
这只是编译程序的基本结构,实际的编译器可以更复杂,具体取决于编译器的设计和用途。不同编程语言和目标平台可能需要不同类型的编译器。
1.3 编译程序在其他软件中的应用(自学)
1.4 PL/0语言编译系统(自学)
周四,三周一次,机测
- 第一阶段:词法分析p2
- 第二阶段:语法分析p3
- 任务
- 程序语言的语法单位
- 第三阶段
- 第四阶段
- 第五阶段:目标代码生成p5·
第2章 文法和语言
- 文法和语言的形式定义:产生式、文法的定义:G(VN,VT,P,S)、两种表示方式
- 推导:非终结符集 → 终结符集
- 句型、句子:
- 语言:
- 文法的类型:
- 上下文无关的概念