编译原理学习笔记1——引论

什么是编译程序

介绍程序设计语言编译程序构造的基本原理和基本实现技术。

  • 翻译程序(Translator)
    把某一种语言程序(称为源语言程序)等价地转换成另一种语言程序(称为目标语言程序)的程序

在这里插入图片描述

  • 编译程序(Compiler)
    也是一种翻译程序 把某一种高级语言程序等价地转换成另一种低级语言程序(如汇编语言或机器语言程序)的程序。
    • 诊断编译程序(Diagnostic Compiler)
    • 优化编译程序(Optimizing Compiler)
    • 交叉编译程序(Cross Compiler):一个编译程序产生不同于其宿主机的机器代码。
    • 可变目标编译程序(Retargetable
      Compiler):不需要重写编译程序中与机器无关的部分,只要改变与目标机器有关的部分,就能针对不同目标机器平台生成不同的代码。

在这里插入图片描述

运行编译程序的机器叫宿主机,运行机器语言程序的机器称为目标机,一般宿主机和目标机为同一个机器。

  • 解释程序(Interpreter) 把源语言写的源程序作为输入,但不产生目标程序,而是边解释边执行源程序。

在这里插入图片描述
小结

  • 编译:解释完成后再执行
  • 解释:边解释边执行

1 为什么学习编译原理

  • 理解计算系统
  • 设计计算系统
  • 训练计算思维(Computational Thinking)

计算思维

  • 计算思维是运用计算机科学的基础概念去求解问题、设计系统和理解人类的行为,它包括一系列广泛的计算机科学的思维方法
  • 计算思维和阅读、写作和算术一样,是21世纪每个人的基本技能,而不仅仅属于计算机科学家
  • 计算思维在生物、物理、化学、经济学、统计学等其他学科中的影响已经显现

包括一系列广泛的计算机科学的思维方法

  • 抽象
  • 自动化
  • 问题分解
  • 递归
  • 权衡
  • 保护、冗余、容错、纠错和恢复
  • 利用启发式推理来寻求解答
  • 在不确定情况下的规划、学习和调度

1.1 抽象(Abstraction)

  • 忽略一个主题中与当前问题(或目标)无关的那些方面,以便更充分地注意与当前问题(或目标)有关的方面
  • 从众多的事物中抽取出共同的、本质性的特征,舍弃其非本质的特征
  • 是一种从个体把握一般、从现象把握本质的认知过程和思维方法

1.2 自动化(Automation)

将抽象思维的结果在计算机上实现,是一个将计算思维成果物化的过程,也是将理论成果应用于技术的实践。

1.3 分解(Decomposition)

将大规模的复杂问题分解成若干个较小规模的,更简单的问题加以解决

  • 对问题本身进行明确描述,并对问题解法作出全局性决策

  • 把问题分解成相对独立的子问题

分解可进行层次化管理

  • 编译原理中的问题分解
    • 为什么编译程序引入中间语言?
    • 为什么 编译分成多个阶段?
    • 为什么分析过程分成多遍?

1.4 递归(Recursion)

  • 问题的解决依赖于类似问题的解决,只不过后者的复杂程度或规模较原来的问题更小

  • 一旦将问题的复杂程度和规模简化到足够小时,问题的解法其实非常简单

1.5 权衡(折中,Tradeoff)

  • 理论研究重在探寻问题求解的方法,对于理论成果的研究运用又需要在能力和运用中作出权衡

1.6 编译原理和方法的应用

  • Html/XML分析
  • 语言处理工具
  • 搜索引擎 测试
  • 用户接口:Shell命令解释器,
  • 查询语言:SQL,XQuery,
  • 网络协议:HTTP、SOAP

2 编译过程

2.1词法分析

  • 任务:输入源程序,对构成源程序的字符串进行扫描和分解,识别出单词符号
  • 依循的原则:构词规则
  • 描述工具:有限自动机
for     i      :=      1       to      100     do
基本字  标识符  赋值号  整常数   基本字  整常数  基本字

2.2 语法分析

  • 任务:在词法分析的基础上,根据语法规则把单词符号串分解成各类语法单位(语法范畴)
  • 依循的原则:语法规则
  • 描述工具:上下文无关文法

在这里插入图片描述

2.3 中间代码产生

  • 任务:对各类语法单位按语言的语义进行初步翻译 依循的原则:语义规则
  • 描述工具:属性文法
  • 中间代码:三元式,四元式、数

在这里插入图片描述

2.4 优化

  • 任务:对前阶段产生的中间代码进行加工变换,以期在最后阶段产生更高效的目标代码
  • 依循的原则:程序的等价变换规则

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
优化后无乘法

2.5 目标代码产生

  • 任务:把中间代码变换成特定机器上的目标代码
  • 依赖于硬件系统结构和机器指令的含义
  • 目标代码三种形式
    • 汇编指令代码:需要进行汇编
    • 绝对指令代码:可直接运行
    • 可重新定位指令代码:需要连接

.obj文件 可重定位的指令代码、相对地址,链接时,相对地址改为绝对地址可得到一个可执行的.exe文件


0001 操作码
01 寄存器操作数
00 操作数标志
00000000 第二操作数(地址)

3 编译程序的结构

在这里插入图片描述

出错处理

  • 出错处理程序

    • 发现源程序中的错误,把有关错误信息报告给用户
  • 语法错误:

    • 源程序中不符合语法(或词法)规则的错误
    • 非法字符、括号不匹配、缺失分号、…
  • 语义错误:

    • 源程序中不符合语义规则的错误
    • 说明错误、作用域错误、类型不一致、…
      遍(pass)
  • 就是对源程序或源程序的中间表示从头到尾扫描一次

  • 阶段与遍是不同的概念

    • 一遍可以由若干段组成
    • 一个阶段也可以分成若干遍来完成
      在这里插入图片描述
  • 编译前端

    • 与源语言有关,如词法分析,语法分析,语义分析与中间代码产生,与机器无关的优化
  • 编译后端

    • 与目标机有关,与目标机有关的优化,目标代码产生
  • 带来的好处

    • 程序逻辑结构清晰
    • 优化更充分,有利于移植
      在这里插入图片描述

4 编译程序的生成

以机器语言和汇编语言为工具

  • 优点:可以针对具体的机器,充分发挥计算机的系统功能,生成的程序效率高
  • 缺点:程序难读,难写,易出错,难维护,生产效率低

高级语言书写

  • 利用已有的某种语言的编译程序实现另一语言的编译程序

移植方法

  • 把一种机器上的编译程序移植到另一个机器上

自编译方式

  • 编译程序——编译程序、编译程序产生器、编译程序书写系统
  • LEX:词法分析程序产生器
  • YACC:语法分析程序产生器

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值