【编译原理】学习笔记

❤️❤️❤️拯救者-编译原理期末速成❤️❤️❤️

第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 编译阶段的组合

编译过程是将源代码转换为目标代码(通常是机器代码或中间代码)的一系列步骤。编译程序的结构涉及这些步骤的组织和实现。以下是编译过程和编译程序的基本结构:

编译过程的基本步骤:

  1. 词法分析(Lexical Analysis):也称为扫描(Scanning),这个步骤将源代码分割成一个个的词法单元(tokens),例如,将源代码中的字符串、关键字、标识符等分离出来。

  2. 语法分析(Syntax Analysis):在这一步中,编译器使用词法分析器生成的词法单元来构建语法树(Syntax Tree)或抽象语法树(Abstract Syntax Tree,AST),以验证源代码的语法是否正确。

  3. 语义分析(Semantic Analysis):编译器进行语义检查,确保源代码的语义是正确的。这包括类型检查、变量声明检查以及其他语言特定的语义规则。

  4. 中间代码生成(Intermediate Code Generation):在这一步中,编译器生成中间代码,这是一种抽象的表示形式,通常比源代码更容易优化和转换为目标代码。中间代码可以是三地址代码、虚拟机代码等。

  5. 优化(Optimization):编译器可以对中间代码进行各种优化,以提高目标代码的性能。这包括常量折叠、死代码消除、循环展开等。

  6. 目标代码生成(Code Generation):在这一步中,编译器将中间代码转换为目标代码,这是特定于目标平台的机器代码或汇编语言。

  7. 链接(Linking):如果程序由多个源文件组成,链接器将这些文件组合在一起,解析符号引用,并创建最终可执行文件。

编译程序的基本结构:
编译程序是一个复杂的软件系统,通常由多个组件组成。以下是一个典型的编译程序的结构:

  1. 前端(Front End):前端负责词法分析、语法分析、语义分析和中间代码生成。它将源代码转换为中间表示形式。前端通常与编程语言的语法和语义紧密相关。

  2. 优化器(Optimizer):优化器是一个可选的组件,用于对中间代码进行各种优化。它可以包括多个优化阶段,以提高目标代码的性能。

  3. 后端(Back End):后端负责目标代码的生成。它将中间代码转换为目标平台的机器代码或汇编语言。后端通常与目标硬件架构相关。

  4. 符号表管理器(Symbol Table Manager):编译程序需要维护一个符号表,用于跟踪变量、函数和其他标识符的信息。符号表管理器负责创建、更新和查询符号表。

  5. 错误处理器(Error Handler):编译程序需要检测和处理源代码中的错误。错误处理器负责报告错误并提供有关错误的详细信息。

  6. 驱动程序(Driver):编译程序的驱动程序协调前端、优化器、后端和其他组件之间的交互。它指导整个编译过程并生成最终的目标文件或可执行文件。

这只是编译程序的基本结构,实际的编译器可以更复杂,具体取决于编译器的设计和用途。不同编程语言和目标平台可能需要不同类型的编译器。

1.3 编译程序在其他软件中的应用(自学)
1.4 PL/0语言编译系统(自学)

周四,三周一次,机测

  • 第一阶段:词法分析p2
  • 第二阶段:语法分析p3
    • 任务
    • 程序语言的语法单位
  • 第三阶段
  • 第四阶段
  • 第五阶段:目标代码生成p5·

第2章 文法和语言

  • 文法和语言的形式定义:产生式、文法的定义:G(VN,VT,P,S)、两种表示方式
  • 推导:非终结符集 → 终结符集
  • 句型、句子:
  • 语言:
  • 文法的类型:
  • 上下文无关的概念

第3章 词法分析

第4章 自顶向下语法分析方法

第5章 自低向上优先分析

第6章 LR分析

第7章 语法制导的语义计算

第8章 静态语义分析和中间代码生成

第9章 运行时存储组织

第10章 代码优化和目标代码生成

第11章 课程设计

第12章 编译器和相关工具实例——GCC/Binutils

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值