我是靠谱客的博主 烂漫翅膀,最近开发中收集的这篇文章主要介绍编译原理-学习笔记 第一章 引论,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

开始学习编译原理,大家共同学习

转载地址:https://zhangt.top/CS/Compilation-Principles-Study-Notes/
出处:
本文标题:编译原理-学习笔记
本文作者:ZhangT
本文链接:https://zhangt.top/CS/Compilation-Principles-Study-Notes/
发布时间:2020-02-17
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!

在这里插入图片描述

什么是编译程序

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

在这里插入图片描述

  • 编译程序(Compiler):把某一种高级语言程序等价地转换成另一种低级语言程序(如汇编语言或机器语言程序)的程序
    在这里插入图片描述
    *运行编译程序的计算机:宿主机 * 运行目标程序的计算机:目标机 * 根据用途和侧重,编译程序可分为: 诊断编译程序(Diagnostic Compiler) 优化编译程序(Optimizing Compiler) 交叉编译程序(Cross Compiler):编译程序产生不同于其宿主机的目标代码 可变目标编译程序(Retargetable Compiler:不需要重写编译程序中与机器无关的部分。

  • 解释程序(Interpreter):
    把源语言写的源程序作为输入,但不产生目标程序,而是边解释边执行源程序
    在这里插入图片描述

为什么要学习编译原理

  • 理解计算系统,注意不是计算机系统。
  • 设计计算系统
  • 计算思维 Computational Thinking
    * 计算思维是运用计算机科学的基础概念去求解问题、设计系统和理解人类的行 为,它包括了一系列广泛的计算机科学的思维方法
    * 计算思维和阅读、写作和算术一样,是21世纪每个人的基本技能,而不仅仅属于计算机科学家
    * 包括
    • 抽象
    • 自动化
    • 问题分解
    • 递归
    • 权衡
    • 保护、冗余、容错、纠错和恢复
    • 利用启发式推理来寻求解答
    • 在不确定情况下的规划、学习和调度

编译过程

  • 词法分析
    * 输入源程序字符串,扫描哪些字符构成了标识符,哪些字符构成了常数
    * 依循的原则:构词规则
    * 描述工具:有限自动机
   for       i   :=     1     to     100   do
基本字 标识符 赋值号 整常数 基本字 整常数 基本字
  • 语法分析
    * 在词法分析的基础上,根据语法规则把单词符号串分解成各类 语法单位(语法范畴),如下图得到了一棵语法树。
    * 依循的原则:语法规则
    * 描述工具:上下文无关文法
    在这里插入图片描述
  • 中间代码产生
    * 对各类语法单位按语言的语义进行初步翻译
    * 依循的原则:语义规则
    * 描述工具:属性文法
    * 中间代码:三元式、四元式,树,…
    在这里插入图片描述
  • 优化
    * 对前阶段产生的中间代码进行加工变换,以期在最后阶段产生更高效的目标代码
    * 依循的原则:程序的等价变换原则
    * 比如下图的憨憨程序就可以被编译器优化得很优秀
    在这里插入图片描述
  • 目标代码产生
    * 把中间代码变换成特定机器上的目标代码
    * 依赖于硬件系统结构和机器指令的含义
    * 目标代码三种形式
    • 汇编指令代码: 需要进行汇编
    • 绝对指令代码: 可直接运行
    • 可重新定位指令代码: 需要链接

编译程序的结构

  • 编译程序总框
    在这里插入图片描述
  • 出错处理
    • 发现源程序中的错误,把有关错误信息报告给用户
    • 语法错误
      • 源程序中不符合语法(或词法)规则的错误
      • 非法字符、括号不匹配、缺少;、…
    • 语义错误
      • 源程序中不符合语义规则的错误
      • 说明错误、作用域错误、类型不一致、…
  • 遍 (pass)
    • 所谓的 “遍”,就是对源程序或源程序的中间表示从头到尾扫描一遍
    • 编译程序的五个阶段,当然可以实现为五“遍”,也就是每个阶段都接受上一阶段的输出,然后完成本阶段的变换,生成本阶段完整的输出,每个阶段的输出都是源程序的一个完整表示,如一个完整的单词序列、一个完整的语法分析树、一个完整的中间代码表示、甚至是目标代码表示 等等
    • 阶段与遍是不同的概念
      • 一遍可以由若干段组成
        在实际工作中,从程序效率和软件设计的角度考虑,我们往往会把若干联系非常紧密的阶段,合成一遍处理,比如说我们通常把词法分析、语法分析、中间代码生成这三个阶段合成一遍处理。
        把词法分析和中间代码产生实现为一些子程序,也就是词法分析子程序或者是语义子程序,这两类子程序由语法分析模块来驱动或者调用。
        在这个过程中,语法分析起主导作用,在语法分析的驱动下,词法分析 语法分析和中间代码生成三个阶段穿插进行,当词法分析完成最后一个单词的识别的时候,整个分析树也就很快得到了,同时所有的语法单位的翻译也就完成了,三个阶段合成一遍完成。
      • 一个阶段也可以分若干遍来完成
        有些情况下一个阶段也可以分若干遍来实现,优化就是这样的例子,通常来说优化这个阶段被分成了很多遍,比如说 可以先对中间代码扫描一遍识别程序的基本结构,再扫描一遍完成简单的优化,再扫描一遍完成循环的优化,有时循环优化还有可能分成很多遍
  • 编译前端和后端
    在这里插入图片描述
    • 编译前端
      • 与源语言有关,如词法分析,语法分析,语义分析与中间代码产生,与机器无关的优化
    • 编译后端
      • 与目标机有关,与目标机有关的优化,目标代码产生
    • 带来的好处
      • 程序逻辑结构清晰
      • 优化更充分,有利于移植

编译程序的生成

工具:

  • 以汇编语言和机器语言为工具
    • 优点: 可以针对具体的机器,充分发挥计算机的系统功能;生成的程序效率高
    • 缺点: 程序难读、难写、易出错、难维护、生产的效率低
  • 以高级程序设计语言为工具
    • 程序易读、易理解、容易维护、生产的效率高
      在这里插入图片描述
      上图表示已经有了 I 这种高级语言的实现和编译器,用 I 语言实现将 S 语言编译为 T 语言的编译器

高级语言书写:

  • 利用有的某种语言的编译程序实现另一种语言的编译程序
    下图表示利用 P1 编译器,将 L1 语言写的 P2 编译器,编译成 A 代码写的 P2 编译器
    在这里插入图片描述

移植方法:

  • 把一种机器上的编译程序移植到另一种机器上,跨机器
    在这里插入图片描述

自编译方式

  • 你通过低级语言实现 L 语言的一部分 L1,然后拿 L1 和低级语言去实现 L1+L2,然后拿 L1+L2 去实现 L1+L2+L3,依次类推。
    在这里插入图片描述

编译程序自动产生

  • 编译程序-编译程序,也叫编译程序产生器,也叫编译程序书写系统
  • LEX:词法分析程序产生器
  • YACC:语法分析程序产生器
    在这里插入图片描述

最后

以上就是烂漫翅膀为你收集整理的编译原理-学习笔记 第一章 引论的全部内容,希望文章能够帮你解决编译原理-学习笔记 第一章 引论所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(46)

评论列表共有 0 条评论

立即
投稿
返回
顶部