精华内容
下载资源
问答
  • 在编译程序中与生成中间代码目的无关的是(B)。 A 便于目标代码优化 B 便于存储空间的组织 C 便于目标代码的移植 D 便于编译程序的移植 逆波兰表示法表示表达式时无须使用括号。正确 四元式之间的联系是通过...

    第七章复习题

    1. 中间代码是介于源语言程序和什么之间的一种代码?(D)。
      A 源代码
      B 机器语言
      C 汇编语言
      D 目标代码

    2. 在编译程序中与生成中间代码的目的无关的是(B)。
      A 便于目标代码优化
      B 便于存储空间的组织
      C 便于目标代码的移植
      D 便于编译程序的移植

    3. 逆波兰表示法表示表达式时无须使用括号。正确

    4. 四元式之间的联系是通过(B)实现的。
      A 指示器
      B 临时变量
      C 符号表
      D 程序变量

    5. 后缀式 ab+cd+/可用表达式(B)来表示。
      A a+b/c+d
      B (a+b)/(c+d)
      C a+b/(c+d)
      D a+b+c/d

    6. 表达式( ┐ A ∨B)∧(C∨D)的逆波兰表示为(B)。
      A ┐AB∨∧CD∨
      B A┐B∨CD∨∧
      C AB∨┐CD∨∧
      D A┐B∨∧CD∨

    7. 间接三元式表示法的优点为(A)。
      A采用间接码表,便于优化处理
      B 节省存储空间,不便于表的修改
      C便于优化处理,节省存储空间
      D 节省存储空间,不便于优化处理

    8. 数组元素的地址计算与数组的存储方式有关。正确

    9. 树形表示和四元式不便于优化,而三元式和间接三元式则便于优化。错误

    10. 表达式ab-c-d$e$f-g-hi中,运算符的优先级由高到低依次为-、、$,且均为右结合,则其后缀式为(C)。
      A $a-b-cd$e-f-ghi
      B bcd–a
      efgh–i*$$
      C abcd–efgh–i$$
      D abc-d-e$fg-h-i$

    11. 以下(D)不是中间代码的表示形式。
      A DAG图
      B 后缀式
      C 三元式
      D 间接四元式

    12. 表达式a+bc-d/e↑f的后缀式是(C)。
      A ab+c
      d-e↑f
      B abc+def/↑-
      C abc
      +def↑/-
      D abc*±def↑/

    13. 编译过程中将源代码翻译成中间代码,具有很多优点,其中(A)不是中间代码的优点。
      A 中间代码不能用于解释
      B 利于在不同目标机上实现同一种语言
      C 利于进行与机器无关的优化
      D 编译程序的逻辑结构更为简单明确

    14. 中间代码生成时依据的是(C)。
      A 语法规则
      B 词法规则
      C 语义规则
      D 等价变换规则

    15. 采用三元式实现三地址代码时,不利于对中间代码进行优化。正确

    展开全文
  • 编译原理--中间代码生成

    千次阅读 2020-01-08 15:25:16
    文章目录基础DAG三地址代码问题声明语句的翻译表达式和赋值语句的翻译控制流翻译布尔表达式的翻译switch 语句的翻译过程调用的翻译回填 基础 DAG 语法树是一种图形化的中间表示。但语法树中,公共子表达式每出现一次...

    基础

    DAG

    语法树是一种图形化的中间表示。但语法树中,公共子表达式每出现一次,就有一个对应的子树,产生了大量冗余,
    因此定义了另一种中间表示:有向无环图(Directed Acyclic Graph, DAG)
    有向无环图的构造与抽象语法树类似。
    在这里插入图片描述

    三地址代码

    一般包括一个运算符和之多三个运算分量(地址),所以叫做三地址代码。这里的地址包括:变量、常量、临时变量。

    • 指令集合
      • 运算/赋值指令:x=y op z ,x = op y
      • 复制指令:x=y
      • 无条件转移指令:goto L
      • 条件转移指令:if x goto L ,ifFalse x goto L
      • 条件转移指令:if x relop y goto L
      • 过程调用/返回 p(x1, x2, …, xn)
        • param x1 //设置参数
        • param x2
        • …
        • param xn
        • call p, n //调用子过程p,n为参数个数
      • 带下标的复制指令:x=y[i] x[i]=y • 注意:i表示离开数组位置第i个字节,而不是数组的第i个元素
      • 地址/指针赋值指令: • x=&y x=*y *x=y

    在这里插入图片描述

    • 三地址代码的四元式表示
      格式(字段): op arg1 arg2 result
      如:+ x y z
      对于有些指令,一些参数是空缺的,如
      param x1 null null
      [if goto] x null L
      在这里插入图片描述
    • 三地址代码的三元式表示
      op arg1 arg2
      使用三元式的位置来引用三元式的运算结果
      在这里插入图片描述
    • 三地址代码的间接三元式表示
      包含了一个指向三元式的指针的列表  我们可以对这个列表进行操作,完成优化功能;操作时不 需要修改三元式中的参数
      在这里插入图片描述
    • 静态单赋值SAA
      在这里插入图片描述

    问题

    声明语句的翻译

    PPT 24-54

    表达式和赋值语句的翻译

    在这里插入图片描述

    • 数组引用生成代码的翻译方案

    非终结符号L的三个综合属性

    1. L.addr指示一个临时变量,计算数组引用的偏移量 ij * wj
    2. L.array是一个指向数组名字对应的符号表条目的指针, L.array.base为该数组的基地址
    3. L.type是L生成的子数组的类型,对于任何数组类型t,其宽度由 t.width给出,t.elem给出其数组元素的类型
      在这里插入图片描述

    控制流翻译

    • 文法:B表示布尔表达式,S代表语句 S → if (B) S1 ; S → if (B) S1 else S2 ;S → while (B) S1 . 代码的布局见下图
      在这里插入图片描述
    • 继承属性
      • B.true:B为真的跳转目标
      • B.false:B为假的跳转目标
      • S.next:S执行完毕时的跳转目标

    例:Sif B then S1S\longrightarrow if\ B\ then\ S_1
    在这里插入图片描述
    在这里插入图片描述

    布尔表达式的翻译

    • 当布尔表达式的计算用于跳转分治

    布尔表达式翻译的主要语义动作是跳转,而跳转的标签主要根据短路规则来确定。
    在这里插入图片描述
    在这里插入图片描述

    • 当布尔表达式的计算用于赋值
      采用临时变量的方法
      在这里插入图片描述

    switch 语句的翻译

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    过程调用的翻译

    在这里插入图片描述

    回填

    布尔表达式用于语句的控制流时,它总是在取值true时和取值false 时分别跳转到某个位置

    • 引入两个综合属性

      • truelist: 包含跳转指令(位置)的列表,这些指令在取值true时执行
      • falselist:包含跳转指令(位置)的列表,这些指令在取值false时执行
    • 辅助函数

      • Makelist(i):创建一个只包含i的列表
      • Merge(p1,p2):将p1和p2指向的列表合并
      • Backpatch(p,i):将i作为目标标号插入到p所指列表中的各指令中
        在这里插入图片描述
        在这里插入图片描述
    • 控制转移语句的回填
      M的作用就是用M.instr记录下一个指令的位置 • N的作用是生成goto指令坯,N.nextlist只包含这个指令 的位置

    在这里插入图片描述
    在这里插入图片描述

    展开全文
  • Soot -- 中间代码Jimple介绍

    千次阅读 2016-10-16 22:07:14
    一、Jimple总述jimple是一种中间代码 1.jimple设计的目的: 用来简化分析,以及简化向java字节码的过渡。 2.不同中间代码之间的转化图。 (下图有些旧,但思想很好。) (1)与java代码相关: - 图中可以...

    一、Jimple总述

    jimple是一种中间代码


    1.jimple设计的目的:
    用来简化分析,以及简化向java字节码的过渡


    2.不同中间代码之间的转化图
    (下图有些旧,但思想很好。)

    (1)与java代码相关:
    - 图中可以看出,我们可以进行编译以及反编译。【针对java】
    - 我们可以将java通过一种编译方式(javac),将其转换为 .class文件。【针对java】
    - 对于java并不一定要有一种编译方式,比如说,可以将java编译成Gimp。

    (2)与Soot中间代码相关:
    - 【soot擅长的中间代码Baf,Gimp,Jimple(soot最擅长处理jimple)。
    - 所以通过Jimple中间代码的形式来让soot进行处理是个不错的选择。
    - 【Gimp】一旦通过java编译方式到Gimp格式,接下来就由Soot来控制了,进入了soot控制的世界了。
    - 【Baf】通过 .class文件也可以经过转换进入Baf格式,又进入soot的世界了。
    - 任何一种中间代码形式都可以进行输出
    - java,或者.class文件,经过转化后,变为soot可以处理的形式,然后读者就可以在soot中进行分析 或者优化了。


    配图:
    这里写图片描述
    摘自:《Jimple : Simplifying Java Bytecode for Analyses and Transformations》(1998)

    再配上一张最新的官方图:

    这里写图片描述
    摘自: soot生存手册

    二、jimple特点


    - 有类型的
    - 3地址的
    - 基于语句的

    有类型的


    在java中是有类型的,当我们定义一个变量的时候,是需要声明其类型的
    (反例是:javascript,在运行的时候才能确定其类型)

    int i;


    将上面代码转化为jimple之后,类型依旧保留,并没有丢失

    int i;

    三地址


    java代码

    int i ,j;
    i = 2;
    j = 2*i + 8;


    Jimple中间代码
    - 可以看出在3地址表示中出现了很多临时变量temp.
    - 将上面的java代码拆解的十分细致。
    - 赋值需要借助于临时变量
    - 3地址,这一特点使得java代码中很多高级的特性,被分解成很多细小的单位。
    - 一般而言,三地址代码将包含大部分低级操作,即目标机所支持的指令。
    - 关于3地址的一些简答介绍(中间代码

            int i, j, temp$0, temp$1, temp$2, temp$3;
    
            temp$0 = 2;
    
            i = temp$0;
    
            temp$1 = 2 * i;
    
            temp$2 = temp$1;
    
            temp$3 = temp$2 + 8;
    
            j = temp$3;

    基于语句的


    根据下面对于jimple语句介绍(第三节)就能发现其基于语句的特性。
    1. 基于语句说明jimple中代码,基本组成单位,抽象程度还是比较高的。【java字节码等相比】
    2. jimple一条语句能够封装进java字节码中很多的指令。

    三、Jimple中的语句

    Jimple的一些基本语法

    摘自《Jimple : Simplifying Java Bytecode for Analyses and Transformations》(1998)
    这里写图片描述

    这里写图片描述

    Soot对于jimple中语句的对象化

    soot在简化语句方面的作用,java字节码规定的操作语句是十分复杂的,这对于语句的分析而言,无疑会造成一定的复杂性。中间的jimple的引入了,将一些复杂的细节进行了屏蔽,从而有利于在此基础上进行分析。(jimple有15种语句(简化))

    soot中Jimple语句类型

    • 负责过程内控制流的语句:IfStmt , GotoStmt , TableSwitchStmt , LookupSwitchStmt
    • 负责过程间的控制流语句:InvokeStmt , ReturnStmt , ReturnVoidStmt.
    • 监控语句:EnterMonitorStmt , ExitMonitorStmt.
    • ThrowStmt , RetStmt

    这里写图片描述
    摘自:soot生存手册

    stmt语句

      stmt继承自Unit , 是jimple语句的一个基础,体现了jimple语句的一些基本特征。
      用途:在进行数据流分析的时候,需要模拟stmt的执行,这时候就会用到这些提到下面的这些特征。
      stmt是位于方法体(SootMethod)中的,而SootMethod又位于一定的类(SootClass)中的。 —-> 这里想说的是,Stmt操作的不仅有SootMethod中的内容(局部变量等),同时又可以操作SootClass中的一些内容。见下面的代码:

    • 【引用】是否有成员变量的引用。 (containsFieldRef () )
    public interface Stmt extends Unit
    {
        public void toString(UnitPrinter up);
    
        public boolean containsInvokeExpr();//是否包含函数调用
        public InvokeExpr getInvokeExpr();
        public ValueBox getInvokeExprBox();
    
        public boolean containsArrayRef();//是否含有数组引用
        public ArrayRef getArrayRef();
        public ValueBox getArrayRefBox();
    
        public boolean containsFieldRef();//是否使用了【类】的成员变量
        public FieldRef getFieldRef();
        public ValueBox getFieldRefBox();
    }

      而我们查看Unit,会发现:

    • 【使用】哪些变量,值被使用。
    • 【定义】哪些变量被定义。
    • 【关联】与其他Unit有何关联。
    • 【分支】是否是分支结构。
    • fallsThrough 暂时不知道 …

    这里写图片描述

    待续…

    展开全文
  • 第七章:语法制导翻译和中间代码

    千次阅读 2019-03-27 22:19:24
    2. 在编译程序中与生成中间代码目的无关的是( )。 A. 便于目标代码优化 B. 便于存储空间的组织 C. 便于目标代码的移植 D.便于编译程序的移植 3. 逆波兰表示法表示表达式时无须使用括号。 正确 错误...

     

    (垃圾博主随心情更新。。。。)

    1. 中间代码是介于源语言程序和什么之间的一种代码?( )

    A. 源代码

    B. 机器语言

    C. 汇编语言

    D. 目标代码

    2. 在编译程序中与生成中间代码的目的无关的是( )。

    A. 便于目标代码优化

    B. 便于存储空间的组织

    C. 便于目标代码的移植

    D. 便于编译程序的移植

    3. 逆波兰表示法表示表达式时无须使用括号。

    正确

    错误

    4. 四元式之间的联系是通过( )实现的。

    A. 指示器

    B. 临时变量

    C. 符号表

    D. 程序变量

    显示答案揭示答案

    5. 后缀式 ab+cd+/可用表达式( )来表示。

    A. a+b/c+d

    B. (a+b)/(c+d)

    C. a+b/(c+d)

    D. a+b+c/d

    6. 表达式( ┐ A ∨B)∧(C∨D)的逆波兰表示为( )。

    A. ┐AB∨∧CD∨

    B. A┐B∨CD∨∧ 

    C. AB∨┐CD∨∧

    D. A┐B∨∧CD∨

    7. 间接三元式表示法的优点为( )。

    A.采用间接码表,便于优化处理 

    B. 节省存储空间,不便于表的修改 

    C.便于优化处理,节省存储空间  

    D. 节省存储空间,不便于优化处理

    8. 数组元素的地址计算与数组的存储方式有关。

    正确

    错误

    9. 树形表示和四元式不便于优化,而三元式和间接三元式则便于优化。

    正确

    错误

    10. 表达式a*b-c-d$e$f-g-h*i中,运算符的优先级由高到低依次为-、*、$,且均为右结合,则其后缀式为( )。

    A. $*a-b-cd$e*-f-ghi

    B. bcd--a*efgh--i*$$

    C. abcd--*efgh--i*$$

    D. ab*c-d-e$fg-h-i*$ 

    11. 以下( )不是中间代码的表示形式。

    A. DAG图

    B. 后缀式

    C. 三元式

    D. 间接四元式

    12 表达式a+b*c-d/e↑f的后缀式是( )。

    A. ab+c*d-e↑f

    B. abc+*def/↑-

    C. abc*+def↑/-

    D. abc*+-def↑/

    13. 编译过程中将源代码翻译成中间代码,具有很多优点,其中( )不是中间代码的优点。

    A. 中间代码不能用于解释

    B. 利于在不同目标机上实现同一种语言

    C. 利于进行与机器无关的优化

    D. 编译程序的逻辑结构更为简单明确

    14. 中间代码生成时依据的是( )。

    A. 语法规则

    B. 词法规则

    C. 语义规则

    D. 等价变换规则

    15. 采用三元式实现三地址代码时,不利于对中间代码进行优化。

    正确

    错误

     

     

    注:那个,我又回来了,如果后面有需要的话可以评论或者私信告诉我哟,看到的话想起来的话还是会回来的,拜呀!

    展开全文
  • 2 在编译程序中与生成中间代码目的无关的是(B )。 A 便于目标代码优化 B 便于存储空间的组织 C 便于目标代码的移植 D 便于编译程序的移植 3 逆波兰表示法表示表达式时无须使用括号。 正确 4 四元式...
  • 5.2 中间代码生成与优化_布尔表达式的翻译  我们仍然按照语法分析和语义检查时的思路,先讨论表达式的翻译,再处理语句。表达式从概念上来说,可分为算术表达式和布尔表达式,在一些编程语言(例如Java)中对这两者...
  • CDN 是什么 、CDN 引入

    千次阅读 2019-01-03 13:42:30
    CDN 的全称是 Content Delivery Network,即内容分发网络。 CDN的基本原理是广泛采用各种缓存服务器,将...纵观整个宽带服务的价值链,内容提供商和用户位于整个价值链的两端,中间依靠网络服务提供商将其串接起来...
  • 本文代码实现基本按照《数据结构》课本目录顺序,外加大量的复杂算法实现,一篇文章足够。能换你一个收藏了吧?
  • 重构笔记——引入本地扩展

    千次阅读 2015-04-09 13:32:17
     在上一篇文章中介绍了“引入外加函数”。本文将介绍“引入本地扩展”这种重构手法。  下面让我们来学习这种重构手法吧。 开门见山  发现:你需要为服务类提供一些额外函数,但你无法修改这个类。  解决:...
  • 引入文件系统

    千次阅读 2014-06-14 20:52:05
    比如在中间加一些内容,后面内容的偏移就变了。 权衡利弊,还是引入文件系统。   问:怎样利用系统盘上的文件系统,来突破512字节大小的限制 答: 制件软盘过程: 系统启动过程: (1)...
  • Java代码优化提点

    万次阅读 2013-10-30 11:04:16
    程序代码可以是中间代码,也可以是目标代码。等价的含义是使得变换后的代码运行结果与变换前代码运行结果相同。优化的含义是最终生成的目标代码更加轻松自如(运行时间更短、占用空间更小)地工作,时空效率优化。 ...
  • 结合配置与代码的各自优势,我们可以把配置当成代码进行管理:以编程语言(比如 Python)生成配置,实际上配置变成方便程序识别的中间产物,RD 管理的是生成配置的代码,利用代码的模块化以及代码重用性,避免配置的...
  • 残差神经网络—代码详解

    万次阅读 2018-08-26 15:10:44
    resnet是“shortcut connections”的在connections是在恒等映射下的特殊情况,它没有引入额外的参数和计算复杂度。 假如优化目标函数是逼近一个恒等映射, 而不是0映射, 那么学习找到对恒等映射的扰动会比重新...
  • 编写可读性代码的艺术

    千次阅读 2016-07-16 10:30:42
    当然,为了达到这些目的,仅有编写程序的礼节是不够的,还需要很多相关的知识。这些知识既不属于编程技巧,也不属于算法设计,并且和单元测试或者测试驱动开发这些话题也相对独立。这些知识往往只能在公司无人问津的...
  • C++代码调试建议

    千次阅读 2015-12-04 10:27:40
    1.代码调试的重要性代码调试在程序开发阶段占有举足轻重的地位,可见代码调试的重要性。但是有一点必须强调:程序是设计出来的,而不是调试出来的。这是所有程序员必须牢记在心的一条准则。一个没有设计或者这几得很...
  • 重构笔记——代码的坏味道(下)

    千次阅读 2014-12-22 18:59:32
    在重构笔记——代码的坏味道(上)中介绍了22种坏味道中的11种,本文将介绍其余的11种坏味道。之所以将其分为两篇文章介绍,是因为一篇文章介绍22种方法显得篇幅太长,担心读者难以坚持看完。(PS:在对这些"代码的...
  • Py之MT:Multithreaded的简介、引入、使用方法之详细攻略 目录 Multithreaded的简介 Multithreaded的引入 Multithreaded的使用方法 1、Python提供了几个用于多线程编程的模块 2、Python中使用线程有两种...
  • 什么是低代码(Low-Code)?

    千次阅读 多人点赞 2020-11-16 12:27:21
    简介:什么是低代码?我们为什么需要低代码?低代码会让程序员失业吗?本文总结了低代码领域的基本概念、核心价值与行业现状,带你全面了解低代码。一 前言如果选择用一个关键词来代表即将过去的2020年,我相信所有...
  • 我们是如何优化英雄联盟的代码

    千次阅读 2017-05-08 11:44:42
    在大多数情况下,新的代码不见得足够快,所以我们不断迭代解决方案,知道新的代码能达到优化的目的。 现在,让我们看下在英雄联盟代码库中这几个步骤的实施细节,并以最近优化的粒子系统逐步介绍。 步骤1:...
  • YOLOv3原理及代码解析

    万次阅读 多人点赞 2019-01-15 23:10:01
    YOLO v3原理及代码解析 YOLO是一种端到端的目标检测模型。YOLO算法的基本思想是:首先通过特征提取网络对输入特征提取特征,得到特定大小的特征图输出。输入图像分成13×13的grid cell,接着如果真实框中某个object...
  • 《重构-改善既有代码的设计》一书在第三章指出了22种代码的坏味道,下面是我对这些坏味道的总结,分享给大家,还请指正。1. Duplicated Code(重复的代码)重复的代码分三种类型: - 位于同一个类:提炼成新方法...
  • 静态代码检查工具 FindBugs

    千次阅读 2014-03-21 14:52:26
    使用 FindBugs的原因和方法   ...在这个由两部分组成的系列文章的第一部分中,高级软件工程师 Chris Grindstaff 分析了 FindBugs如何帮助提高代码质量以及排除隐含的缺陷。 代码质量工具
  • Javascript代码规范

    千次阅读 2016-06-08 15:26:13
    本文档的目标是使JavaScript代码风格保持一致,容易被理解和被维护。 虽然本文档是针对JavaScript设计的,但是在使用各种JavaScript的预编译语言时(如TypeScript等)时,适用的部分也应尽量遵循本文档的约定。 任何...
  • iOS--代码

    千次阅读 2013-07-03 10:38:23
    iOS4引入了一个新特性,支持代码块的使用,这将从根本上改变你的编程方式。代码块是对C语言的一个扩展,因此在Objective-C中完全支持。如果你学过Ruby,Python或Lisp编程语言,那么你肯定知道代码块的强大之处。简单...
  • 精选(7) 代码重构

    万次阅读 2019-05-02 22:20:15
    对软件内部结构的一种调整,目的是在不改变软件可观察行为的前提下,提高其可理解性,降低其修改成本。 另一种解释是:使用一系列重构手法,在不改变软件可观察行为的前提下,调整其结构。 2、为何重构 改进软件设计...
  • 一、代码审查(Code Review)是软件开发中常用的手段,和QA测试相比,它更容易发现和架构以及时序相关等较难发现的问题,还可以帮助团队成员提高编程技能,统一编程风格等。 1、代码审查要求团队有良好的文化 团队...
  • Java8-11-Stream 引入

    万次阅读 2019-03-25 21:12:41
    文章目录流是什么举例说明基础类jdk7 实现jdk8 实现jdk8 并行版本jdk8 stream 的优势流简介代码流与集合的差别是否急切只能遍历一次外部迭代与内部迭代内部迭代的优势流操作中间操作终端操作流的使用参考资料目录...
  • 书写简洁规范的代码

    千次阅读 2017-07-21 18:18:07
    写出简洁规范的代码对于开发者而言非常重要,它体现了开发者自己的专业性和技术水平,而且能够赢得别人的赞赏。对团队来说,团队成员遵循统一的代码规范,能够更好地维护代码库的稳定和谐。 Android是基于Java语言...
  • 代码混淆详解

    万次阅读 多人点赞 2014-10-13 09:23:43
    Java 是一种跨平台的、解释型语言,Java 源代码编译成中间”字节码”存储于 class 文件中。由于跨平台的需要,Java 字节码中包括了很多源代码信息,如变量名、方法名,并且通过这些名称来访问变量和方法,这些符号带...
  • 让微信 8.0 「裂开」「炸弹」的特效代码来了

    万次阅读 多人点赞 2021-01-27 22:46:37
    其中: 是表情选择按钮,使用一个笑脸 svg 图片表示,里边的 是表情选择框弹出层,里边的表情将在 JS 中动态加载,目的是为了实现动画预览。 是聊天消息输入框,没什么特别的。 是发送按钮 这个是 HTML 的基本结构,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 85,291
精华内容 34,116
关键字:

引入中间代码的目的是