《编译原理》第1章(引论)学习笔记

本文详细介绍了编译器的工作流程,包括词法分析、语法分析、语义分析、中间代码生成、代码优化、代码生成、符号表管理和编译器构造工具的使用。编译器将源程序分解并转化为语义等价的目标程序,通过不同的阶段确保程序的正确性和效率。词法分析识别词素,语法分析构建语法树,语义分析检查源程序的语义一致性,而代码优化则旨在生成更高效的目标代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第 1 章 引论

1.2 一个编译器的结构

  • 编译器:把源程序映射为在语义上等价的目标程序

    • 分析部分(前端)
      • 把源程序分解成为多个组成元素,并在这些要素之上加上语法结构
    • 综合部分(后端)
      • 根据中间表示和符号表中的信息来构造用户期待的目标程序
  • 一个编译器的各个步骤

    在这里插入图片描述

1.2.1 词法分析(扫描)

  • 词法分析器读入组成源程序的字符流,并且将它们组织成为有意义的词素的序列

  • 对于每个词素,词法分析器产生如下形式的词法单元作为输出:
    < t o k e n − n a m e , a t t r i b u t e − v a l u e > <token-name,attribute-value> <tokenname,attributevalue>

    • token-name是一个由语法分析步骤使用的抽象符号

    • attribute-value指向符号表中关于这个词法单元的条目

1.2.2 语法分析(解析)

  • 语法分析器使用由词法分析器生成的各个词法单元的第一个分量来创建树形的中间表示

1.2.3 语义分析

  • 语义分析器使用语法树和符号表中的信息来检查源程序是否和语言定义的语义一致。它同时也收集类型信息,并把这些信息存放在语法树或符号表中,以便在随后的中间代码生成过程中使用
  • 类型检查:编译器检查每个运算符是否具有匹配的运算分量

1.2.4 中间代码生成

  • 中间表示的性质
    • 易于生成
    • 能够被轻松地翻译为目标机器上的语言

1.2.5 代码优化

  • 机器无关的代码优化步骤试图改进中间代码,以便生成更好的目标代码
  • ”更好“通常意味着更快,但是也可能会有其他目标,如更短的或能耗更低的目标代码

1.2.6 代码生成

  • 代码生成器以源程序的中间表示形式作为输入,并把它映射到目标语言
  • 一个至关重要的方面:合理分配寄存器以存放变量的值

1.2.7 符号表管理

  • 符号表数据结构为每个变量名字创建了一个记录条目
  • 记录的字段就是名字的各个属性
  • 这个数据结构应该允许编译器迅速查找到每个名字的记录,并向记录中快速存放和获取记录中的数据

1.2.8 将多个步骤组合成趟

  • 在一个特定的实现中,多个步骤的活动可以被组合成一趟
  • 每趟读入一个输入文件并产生一个输出文件

1.2.9 编译器构造工具

  • 语法分析器的生成器
    • 可以根据一个程序设计语言的语法描述自动生成语法分析器
  • 扫描器的生成器
    • 可以根据一个语言的语法单元的正则表达式描述生成词法分析器
  • 语法制导的翻译引擎
    • 可以生成一组用于遍历分析树并生成中间代码的例程
  • 代码生成器的生成器
    • 依据一组关于如何把中间语言的每个运算翻译成为目标机上的机器语言的规则,生成一个代码生成器
  • 数据流分析引擎
    • 可以帮助收集数据流信息,即程序中的值如何从程序的一个部分传递到另一部分。数据流分析是代码优化的一个重要部分
  • 编译器构造工具集
    • 提供了可用于构造编译器的不同阶段的例程的完整集合
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

旺仔不爱牛奶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值