精华内容
下载资源
问答
  • 在编译过程中生成中间代码
    千次阅读
    2020-04-07 12:35:44

    中间代码定义

    源程序的一种内部表示,不依赖目标机的结构,易于机械生成目标代码的中间表示。
    如果不生成中间代码而是直接生成机器语言或者汇编语言形式的目标代码,优点是编译时间短,缺点是目标代码执行效率和质量都比较低,移植性差。

    为什么不直接翻译成机器码呢,而多此一举生成中间代码再转换?(代码的鲁棒性)

    是为了提高编译器的可移植性,因为不同的cpu的指令集是不一样的,假如直接翻译成机器代码,那么当你换了一块cpu之后,可能你的编译器就完全不能运行了,所以为了鲁棒性,将代码先翻译成中间代码,然后在能在多个不同的cpu上做出相应的改变并且运行了。
    在这里插入图片描述

    使用中间代码的好处:

    1)一是便于编译器程序的开发和移植(鲁棒性)
    2)二是代码进行优化处理

    常见的中间代码表示形式

    逆波兰式(后缀式)、三地址码(三元式、四元式)、抽象语法树、有向无环图。

    逆波兰式 运算量(操作数)写在前面,把运算符写在后面,因此又称为后缀表示法
    在这里插入图片描述

    三地址码——最常用的中间代码形式是三地址码,它的实现形式常采用四元式形式。
    指每条代码包含一个运算和三个地址,两个地址用于存放运算对象,一个地址用于存放运算结果。其一般形式为x=y op z。
    四元式
    一个四元式具有四个域的记录结构,表示为:(op,arg1,arg2,result)。op为运算符;result存放运算结果;arg为运算对象,如果为空,则使用空格,留出位置。
    四元式与三元式的唯一区别:
    将由序号所表示的运算结果改为:用(临时)变量来表示。
    此改变使得四元式的运算结果与其在四元式序列中的位置无关.为代码的优化提供了极大方便,因为这样可以删除或移动四元式而不会影响运算结果.
    在这里插入图片描述

    例:将 a=b*c+b*d用三元形式
    (1) (*,b,c)
    (2) (*,b,d)
    (3) (+,(1),(2))
    (4) (=,(3),a)
    
    例:将 a=b*c+b*d用四元式形式
    写成三地址码的赋值语句形式如下:
        1) t1 = b*c
        2) t2 = b*d
        3) t3 =t1+t2
        4) a = t3
    写成四元形式如下:
        1) (*,b,c,t1)
        2) (*,b,d,t2)
        3) (+,t1,t2,t3)
        4) (=,t3, ,a)
    

    抽象语法树
    抽象语法树(Abstract SyntaxCode,AST)是语法树的一种简化形式,是源程序的抽象语法结构的树状表示,树的每个节点都表示源代码中的一种结构。

    有向无环图
    有向无环图(Directed Acyclic Graph,简称DAG)对表达式中的每个子表达式都有一个结点,内部结点表示运算符,它的孩子代表运算分量。DAG中代表公共子表达式的结点只出现一次,具有多个父结点。

    一个例子

    声明语句的翻译之变量的声明 一个变量的声明应该由两部分来完成:类型的定义和变量的声明
    类型定义:为编译器提供存储空间大小的信息
    变量声明:为变量分配存储空间
    组合数据的类型定义和变量声明:定义与声明在一起,定义与声明分离.

    引用于介篇文章

    更多相关内容
  • //以字母作为标号 其index为endSign对应的元素 char value[128];//对应值字符串 struct WordAnalysisList *next; }WordAnalysisList; //headWAL 对应语法分析时的输入 WordAnalysisList *headWAL, *currendWAL...
  • 华南理工大学SE编译原理实验4 - 中间代码生成
  • 这是编译原理的源代码,涉及了编译原理的各个过程:词法分析,LL1语法分析,语义分析,中间代码生成中间代码优化(常表达式优化,公共表达式优化,循环不变式优化),中间代码生成目标代码,目标代码的解释执行,...
  • 中间代码生成实验报告.doc
  • 实验课上写的编译原理的语义分析和四元式代码生成
  • 编译原理课程设计代码 包含词法 语法分析器 和中间代码生成
  • 它依次把每条中间代码变换成目标代码,并且一个基本块范围内考虑如何充分利用寄存器的问题。 代码生成器。它依次把每条中间代码变换成目标代码,并且一个基本块范围内考虑如何充分利用寄存器的问题。
  • 分析中间代码生成程序 含PL0程序,源代码综合性实验报告 分析PL/0编译程序的总体结构、代码生成的方法和过程;具体写出一条语句的中间代码生成过程
  • 用于编译原理课设 或小作业 很有用的主要是三元式四元式 逆波兰式
  • 一个简单的编辑器 编译原理课设 对简单的程序进行语义分析并将中间代码生成
  • 编译原理中间代码生成器实现C++编译原理中间代码生成器实现C++
  • 编译原理实验4:中间代码生成实验包
  • 编译原理 词法分析,语法分析,中间代码生成 源代码 重庆理工大学编译原理实验。
  • 可用于编译原理的课设和平时作业,程序比较简单,结构清晰,程序从文件读入
  • 中间代码生成,把表达式换成相应的四元式,这是我编译原理实习作业,请指教
  • 编译原理实验-中间代码生成(本学期学习编译原理所作的第三个实验)
  • 编译原理语义分析和中间代码生成实验报告,基于VS2010开发的纯C#的程序,附程序执行截图
  • 表达式中间代码生成 二、实验目的 熟悉算术表达式的语法分析与中间代码生成原理。 三、实验内容 1. 构造算术表达式的四元式翻译文法 2. 设计算术表达式的递归下降子程序分析算法 3. 设计算术表达的四元式生成算法...
  • c++实现的中间代码生成语法分析的基础上,对所要分析的文档输出四元式形式。代码能有运行有注释。有使用说明。自己编译原理已通过的作业。
  • 编译原理实验指导:词法分析,语法分析以及中间代码生成及优化。使用Linux下的flex,bison和gcc实现。指导书很详细,每个部分一份指导书。
  • 华中科技大学 编译原理 面向过程的C--语言的编译器设计 功能包括:词法分析和语法分析、语义分析、中间代码生成的 源码.zip
  • 编译原理课程词法分析器,语法分析器(递归实现),中间代码生成
  • 编制程序,完成局部优化过程中的基本块划分。给定一段代码,判定程序的入口语句,划分基本块,删除无用产生式和冗余节点。
  • 提供语法制导翻译及中间代码生成,举例说明语法制导原理和概念,提供一些例题
  • 一、生成中间代码的目的 便于优化 让生成的目标代码效率更高 优化不等同于对代码的精简和算法的优化 (对于高级程序设计语言可能不能继续进行优化,但是仍然可以在编译中进行优化) 比方说多维下标变量地址计算...

    一、生成中间代码的目的

    1. 便于优化
      让生成的目标代码效率更高
      优化不等同于对代码的精简和算法的优化
      (对于高级程序设计语言中可能不能继续进行优化,但是仍然可以在编译中进行优化)
      比方说多维下标变量地址计算过程,比方说a[i][j]和 a[i][k],我们在计算他们的地址的时候都先要计算a[i]的地址然后再计算j k 的地址,实际上a[i]的计算过程实际上是重复计算了
    2. 便于移植
      编译前端:与目标机无关
      编译后端:与目标机相关
      中间代码起到一个将一对一翻译转换成一对多对一的关系,通过编译前段可以不用改变,编译后端根据目标机相关需要变化,把编译前端的工作做的越多越好。比如java多平台开发,依赖java字节码

    二、中间代码结构

    2.1 三元式

    在这里插入图片描述

    1. 计算顺序确定,逐条执行即可,不用考虑后序顺序问题
    2. 结果没有单独运算分量表示,使用指令的标号表示,在指令优化的时候比较麻烦,比如某些指令执行完之后vanish,标号消失就得重新命名

    2.2 逆波兰式

    在这里插入图片描述

    2.3 抽象语法树

    在这里插入图片描述

    2.4 四元式(tag——本课程使用)

    在这里插入图片描述

    1. 基本结构解释:第一个式操作符,后面两个是操作数按照第一个操作符来进行运算,结果保留在第四个element(中间变量)中
    2. t1相当于之前所说的中间变量保存中间的运行结果,和三元式不同的地方就在于有中间变量表示每条的运行结果
    3. 算术、逻辑、关系运算符(可以在具体文法规则中插入下面的相关运算)
    ADDI(整数加)ADDF(浮点数加)、SUBI、SUBF、MULTI、MULTF、DIVI、DIVF、MOD
    AND、OR、EQ、NE、GT、GE、LT、LE
    READI,READF,FLOAT,ASSIG,AADD...
    
    1. 在运行文法的时候遇到时随时解释

    三、语法制导方法

    如何创建四元式?语法制导技术在处理和规则相关联的任务中有着重要的应用

    1. 语法制导就是在进行语法分析的同时要完成相应的语义动作(语法分析过程中插入自己所写的执行其他功能的函数),这些语义动作都是由一些程序组成的,要完成和用户的需求相关联的任务
    2. 编译器对一个串进行语法检查的同时,可以按照语法分析的程序的结构对程序进行我们所需要的操作,从而解决我们想要解决的问题

    在这里插入图片描述
    INIT 添加到S开始头部——sum=0;
    则有: S-> #Init# AB
    A-> aA│ b #Add#
    B-> b #Add# B│c #Out#
    其中:
    Init:m = 0;
    Add : m++ ;
    Out :print(m);
    在这里插入图片描述
    起始符S首先进入符号栈,然后使用S的右侧代替S得到#init# AB,执行#init#使得m=0;执行完之后剩下AB#,不能与输入流中的字符消去;继续将A使用aA代替得到aAB,将输入流中的a和符号栈中的a匹配掉得到AB;没有匹配的,继续使用文法的右部进行替换,这次选择替换的指令是A->b# Add#,将b匹配上,然后剩下# Add# B,执Add,然后剩下B#,后面和前面的运行步骤相同,最后剩下#则证明成功实现。
    在这里插入图片描述
    匹配过程中仍然按照原来的规则选择语法压入符号栈,在进行匹配之前直接执行插入的相关操作,然后继续进行匹配


    四、中间代码生成中的几个问题

    在这里插入图片描述
    四元式当前的表示形式是便于直接读写的方式,而实际上存储在x和y的不是x和y的符号,而是一个指向xy在符号表中位置的指针。
    将语义信息(种类信息,类型信息,抽象地址)写在四元式中,但是如果全部写入会出现大量的冗余信息,所以最好的一种方式是指向对应存在语义信息的符号表中的指针,需要信息的时候直接通过指针在符号表中提取出所需信息。
    在这里插入图片描述


    五、表达式的中间代码生成

    具体表达式的四元式生成的语义程序写法:
    在这里插入图片描述

    自底向上只能添加在末尾,在归约的时候才能执行添加操作

    在这里插入图片描述
    Gen表示生成四元式的函数
    将栈顶元素按照四元式进行计算之后将栈顶元素取出计算将结果压栈
    在这里插入图片描述
    在这里插入图片描述
    首先画出其语法树,然后使用自底向上的方法看能否生成相应的四元式,过程如下:
    在这里插入图片描述

    展开全文
  • 编译原理实验 实现简单的词法分析 中间代码生成四元式
  • 编译原理-语法制导翻译技术与中间代码生成.ppt
  • 编译原理 词法分析 语法分析 优先分析表 中间代码生成
  • 编译原理实验 语义分析与中间代码生成 Sample语言的语义和代码生成规则,熟悉Sample语言的语义分析和代码生成

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 199,311
精华内容 79,724
热门标签
关键字:

在编译过程中生成中间代码