编译原理——引论


编译原理介绍的是如何将高级语言变为硬件能识别的机器语言

第一章 引论

1.1程序设计语言与编译:

  • 程序设计语言:高级语言,汇编语言,机器语言

    • 汇编程序:将汇编语言转化为机器语言
    • 不同机器之间可能汇编语言不同,因此高级语言出现了
  • 程序语言的转化

    • 翻译,将某种语言的源程序,在不改变语义的情况下转化为另外一种语言
    • 编译,将高级语言转化为低级语言的过程
    • 解释,接收某个高级语言的一个输入,让计算机马上执行,得到结果,在进行下一句
  • 编译:

    • 分为编译,运行两个阶段

      • 源程序–>编译程序–>目标代码

        .c文件—>dev/gcc---->.exe文件

    • 分为四个阶段

      • 编译–汇编–链接–运行

      • 源文件–>编译器–>汇编语言–>汇编语言程序–>目标代码–>链接

        ​  编译时     |     汇编时

      • 编译后产生的是汇编语言代码

      • 在这种情况下,.c文件转化为汇编语言程序之前会生成

      • 其中的汇编程序生成的是obj文件或.exe文件,需要在进行link动作进行链接,最后变为.exe程序

  • 解释:

    • 以源程序作为输出,不产生目标程序,一边解释,一边执行
    • 优点:直观易懂,结构简单,易于实现人机对话
    • 缺点:效率低

1.2编译程序概述

基本介绍:
  • 先看自然语言的翻译

    • 识别出句子中的一个个单词
    • 分析句子的语法结构
    • 根据句子的含义进行初步解释
    • 对译文进行修饰
    • 写出最后的译文
  • 编译程序的工作

    • 词法分析
    • 语法分析
    • 语义分析和中间代码生成
    • 优化
    • 目标代码生成
      在这里插入图片描述
词法分析
  • 任务:对于源程序的字符串进行扫描,识别为一个一个的单词

  • 单词就是高级语言中有意义的最小语法单位,由字符构成

  • 按照词法规则,识别出正确的单词,转化为统一的规格,给语法分析使用

  • 转化

    • 对基本字,运算符,界限符的转化
    • 标识符的转化
    • 常数的转化
    • 转化完成后的格式:(类号,内码)
      • 类号,哪一类符号
      • 内码,一类中具体某一个符号
  • 描述词法规则的有效工具

    • 正规式 单词是否符合规范
    • 有限自动机 使用有限自动机来比较
语法分析
  • 任务:在词法分析的基础上,根据语法规则,把单词符号组成各类的语法单位:短语,子句,短语,过程,程序

  • 语法规则:称文法,规定单词如何构成短语,语句,过程和程序

  • 语法规则表示:

    • 巴斯克范式(BNF):A::=B|C 表示:A定义为B或C
      • <句子>::=<主><谓><宾>
      • <主>::=<定><名>
  • 语法分析方法:

    • 推导和归约
  • 推导:

    • 证明代码中的某一句是赋值语句,也就是这一句代码可以通过某个巴斯克范式的左部得到。
  • 最右推导:将定义中的右边符号的转化为等价公式
    在这里插入图片描述

  • 归约:

    • 推导的逆过程就是规约

    • 最左推导,最右规约
      在这里插入图片描述

    • 从右边倒推到左边

  • 语法树:

    • 计算机可以通过构造语法树的方式来判断语句是否有效
    • 如果叶子节点都是对应的语句内容就是构造成功

    在这里插入图片描述

中间代码生成:
  • 对代码翻译的初稿,对语法分析识别出的各类语法范畴,分析含义

  • 两阶段步骤:

    • 对每种语法范畴进行静态语义检查
    • 若语义正确,进行中间代码的翻译
  • 形式:

    • 四元式,三元式,逆波兰式
      在这里插入图片描述四元式中间代码表
优化
  • 对前面产生的中间代码进行加工变换,以期待最后阶段产生的代码有更高的效率

  • 原则:等价变换

  • 主要方面:公共子表达式的提取,合并以知量,删除无用语句,循环优化等
    在这里插入图片描述在这里插入图片描述可以发现(3)和(5)是重复代码在这里插入图片描述
    (4)句中T1每次的变化量为1 且(3)和(4)可以合并起来,将I赋值给m放在外面,在使用m=m+10 m每次循环累加10

目标代码生成:
  • 将中间优化代码生成特定的机器语言上的低级语言代码

  • 形式:

    • 绝对指令代码:可以立即执行
    • 汇编指令代码:需要汇编程序汇编后运行
    • 可重定位指令代码:需要先将目标模块连接起来,确定变量,常数在主存中的位置,装入主存后才可以成为可以运行的绝对指令代码
  • 表格和表格管理:

    • 用来记录源程序的各种信息以及编译过程中的各种状况

    • 词法分析,语法分析,中间代码生成使用的表:符号表,常数表,标号表,分程序入口表,中间代码表等

    • 符号表:

      • 在词法分析过程中产生

      • 用来登记源程序的常量名,变量名,数组名,过程名等,记录他们的性质,定义和引用情况在这里插入图片描述

    • 常数表与标号表:
      在这里插入图片描述

    • 标号表:if goto语句中的标号

    • 入口名表:

      • 登记过程的层号,分程序符号入口等
        在这里插入图片描述
    • 中间代码表:

  • 出错处理:

    • 源程序出错编译程序需要发现错误并报告给用户
    • 专门出错处理程序完成
    • 错误类型:
      • 语法错误
      • 语义错误
  • 遍:

    • 对源程序从头到尾扫描一次,并生成相关的加工处理
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值