编译原理介绍

 ̄綄美尐妖づ 提交于 2019-12-04 09:04:55

什么是编译程序

把某一种语言程序(称为源语言程序)等价地转换
成另一种语言程序(称为目标语言程序)的程序
高级语言程序需要编译程序的翻译才能变成机器语言程序(目标程序),机器程序可以运行成为结果

编译程序:
1.诊断编译程序(Diagnostic Compiler)
2.优化编译程序(Optimizing Compiler)
3.交叉编译程序(Cross Compiler)
4.可变目标编译程序(Retargetable Compiler)
解释程序(Interpreter)
把源语言写的源程序作为输入,但不产生目标
程序,而是边解释边执行源程序

为什么要学习编译原理

理解计算系统

设计计算系统

训练计算思维(Computational Thinking)

计算思维基本概念
Jeannette M. Wing, Computational Thinking,
Communications of ACM, Vol.49, No.3, 2006,
pp.33-35.
被认为是近十年来产生的最具有基础性、长期性的
学术思想,成为21世纪计算机科学研究和教育的热

  • 计算思维是运用计算机科学的基础概念去求解问题、
    设计系统和理解人类的行为,它包括了一系列广泛
    的计算机科学的思维方法
  • 计算思维和阅读、写作和算术一样,是21世纪每个
    人的基本技能,而不仅仅属于计算机科学家
  • 计算思维在生物、物理、化学、经济学、统计学等
    其他学科中的影响已经显现
    计算思维包括一系列广泛的计算机科学的思维方法:
  • 抽象
  • 忽略一个主题中与当前问题(或目标)无关的那些方面,
    以便更充分地注意与当前问题(或目标)有关的方面
  • 从众多的事物中抽取出共同的、本质性的特征,舍
    弃其非本质的特征
  • 是一种从个体把握一般、从现象把握本质的认知过
    程和思维方法
  • 图灵机就是一种抽象
  • 编译原理中的"抽象"
    • 有限自动机
    • 形式文法
  • 自动化
  • 将抽象思维的结果在计算机上实现,是一个将计算
    思维成果物化的过程,也是将理论成果应用于技术
    的实践
  • 自动化的思维方法不仅体现在编译程序本身的工作
    机制上,更体现在了编译程序的生成工具的研究和
    设计上
  • 编译原理中的"自动化“
    • 有限自动机
    • 预测分析程序
    • 算符优先分析
    • LR分析
  • 问题分解
  • 分解(Decomposition)
  • 将大规模的复杂问题分解成若
    干个较小规模的、更简单的问
    题加以解决
  • 对问题本身的明确描述,并对问
    题解法作出全局性决策
  • 把问题分解成相对独立的子问题
  • 再以同样的方式对每个子问题进
    一步精确化,直到获得对问题的
    明确的解答
  • 分解(Decomposition)
  • 层次化管理
  • 编译原理中的"问题分解"
  • 为什么编译程序引入中间语言?
  • 为什么编译分成多个阶段?
  • 为什么分析过程分成多遍?
  • 递归
  • 递归(Recursion)
  • 问题的解决依赖于类似问题的解决,只不过后者的
    复杂程度或规模较原来的问题更小
  • 一旦将问题的复杂程度和规模化简到足够小时,问
    题的解法其实非常简单
  • 编译原理中的"递归"
    • 递归下降分析
    • 基于树遍历的属性计算
    • 语法制导翻译
  • 权衡
  • 权衡(折衷, Tradeoff )
  • 理论可实现 vs. 实际可实现
  • 理论研究重在探寻问题求解的方法,对于理论成果
    的研究运用又需要在能力和运用中作出权衡
  • 编译原理中的"权衡"
  • 用上下文无关文法来描述和处理高级程序设计语言
  • 优化措施的选择
  • ...
  • 保护、冗余、容错、纠错和恢复
  • 利用启发式推理来寻求解答
  • 在不确定情况下的规划、学习和调度
  • ...

    编译原理

  • 编译理论与技术
  • 计算机科学与技术中理论和实践相结合的最好典范
  • ACM 图灵奖
  • 授予在计算机技术领域作出突出贡献的科学家
  • 程序设计语言、编译相关的获奖者是最多的
  • 编译理论与技术
  • 计算机科学与技术中理论和实践相结合的最好典范
  • 体现了很多典型的计算思维方法
  • 编译原理和方法的应用
  • Html/XML 分析
  • 语言处理工具
  • 搜索引擎

    编译过程

    编译程序是怎样把高级语言(如C++)翻译成低
  • 级语言(如机器指令)的?
  • 把英文翻译为中文
  • 识别出句子中的一个个单词---词法分析
  • 分析句子的语法结构---语法分析
  • 根据句子的含义进行初步翻译---中间代码产生
  • 对译文进行修饰---优化
  • 写出最后的译文---目标代码产生
    以上是编译程序工作的五个阶段
  • 编译过程——词法分析
  • 任务: 输入源程序,对构成源程序的字符串进行
    扫描和分解,识别出单词符号
  • 依循的原则:构词规则
  • 描述工具:有限自动机
    for i := 1 to 100 do
    基本字 标识符 赋值号 整常数 基本字 整常数 基本字
  • 编译过程——语法分析
  • 任务:在词法分析的基础上,根据语法规则把
    单词符号串分解成各类语法单位(语法范畴)
  • 依循的原则:语法规则
  • 描述工具:上下文无关文法
    Z := X + 0.618 * Y(算术表达式--》算术表达式--》赋值语句)
  • 编译过程——中间代码产生
  • 任务:对各类语法单位按语言的语义进行初步翻译
  • 依循的原则:语义规则
  • 描述工具:属性文法
  • 中间代码:三元式,四元式,树,...
  • Z:=X + 0.618 * Y 翻译成四元式为
    |序号 | OPR | OPN1 | OPN2 | RESULT | 注释|
    |:--:|:--:|:--:|:--:|:--:|:--:|:--:|
    |(1)| * | 0.618| Y | T1 | T1:=0.618*Y|
    |(2)| + | X | T1 | T2 | T2:=X+T1|
    |(3)| := | T2 | | Z | Z:=T2|
  • 编译过程——优化(;例如乘法变成加法)
  • 任务:对前阶段产生的中间代码进行加工变换,
    以期在最后阶段产生更高效的目标代码
  • 依循的原则:程序的等价变换规则

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

编译程序的结构

  • 编译程序总框
  • 词法分析器------源程序
  • 语法分析器------中间代码(四元式)
  • 语义分析与中间代码生成器------语法单位
  • 优化段------目标代码
  • 目标代码生成器------中间代码(四元式)
  • 出错处理
  • 出错处理程序
  • 发现源程序中的错误,把有关错误信息报告给用户
  • 语法错误
  • 源程序中不符合语法(或词法)规则的错误
  • 非法字符、括号不匹配、缺少 ;、...
  • 语义错误
  • 源程序中不符合语义规则的错误
  • 说明错误、作用域错误、类型不一致、...
  • 所谓"遍", 就是对源程序或源程序的中间表示
    从头到尾扫描一次
  • 阶段与遍是不同的概念
  • 一遍可以由若干段组成
  • 一个阶段也可以分若干遍来完成
  • 编译前端与后端
  • 编译前端
  • 与源语言有关,如词法分析,语法分析,语义分析与
    中间代码产生,与机器无关的优化
  • 编译后端
  • 与目标机有关,与目标机有关的优化,目标代码产生
  • 带来的好处
  • 程序逻辑结构清晰
  • 优化更充分,有利于移植

编译程序的生成

  • 以汇编语言和机器语言为工具
  • 优点: 可以针对具体的机器,充分发挥计算机的系统
    功能;生成的程序效率高
  • 缺点: 程序难读、难写、易出错、难维护、生产的效
    率低
  • 高级语言书写
  • 程序易读、易理解、容易维护、生产的效率高
  • 利用已有的某种语言的编译程序实现另一语言的编
    译程序
  • 移植方法
  • 把一种机器上的编译程序移植到另一种机器上
  • 自编译方式
  • 编译程序自动产生
  • 编译程序-编译程序,编译程序产生器,编译程序书
    写系统
  • LEX:词法分析程序产生器
  • YACC:语法分析程序产生器
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!