编译原理陈火旺第三版第九章课后题答案

news2024/10/7 10:16:44

下面的答案仅供参考!

1. 有哪些存储分配策略?并叙述何时用何种存储分配策略?

答:存储分配策略分为静态分配策略和动态分配策略两大类,而动态分配策略又可分为栈式动态分配策略和堆式动态分配策略两类。
      在一个的具体的编译系统中,究竟采用哪种存储分配策略,主要应根据程序语言关于名称的作用域和生存期的定义规则。如果编译时能够确定一个程序运行时所需要的全部数据空间的大小(如 FORTRAN 语言),那么,在编译时就可安排好目标程序运行时的全部数据空间,这时可采用静态分配策略。
      反之,则需要采用动态分配策略。至于采用栈式动态分配策略还是堆式动态分配策略,需要根据存储空间动态申请的特性决定。如果存储空间动态申请与释放服从“先请后还,后请先还”的原则,且程序的名字服从分程序结构所限定的作用范围(如 ALGOL语言),则可采用栈式动态分配策略。如果存储空间动态申请与释放没有约束关系,则必须采用堆式动态分配策略。

*2. 假定有如下一个FORTRAN程序段的说明句序列

              SUBROUTINE EXAMPLE(X, Y)

              INTEGER A, B(20), C(10, 15), D, E

              COMPLEX F, G

              COMMON /CBK/D, E, F

              EQUIVALENCE (G, B(2)), (D, B(1))

请给出数据区EXAMPLECBK中各符号名的相对地址。

*3. 出现在公用区中等价环元素的地址分配方法和非公用区中等价环元素的地址分配方法有什么不同?为什么?

      公用区中等价环元素的地址分配是:当沿公用链依次给对公用区元素分配地址时,若遇到等价环中的元素,则立即把公用区当前待分配的地址分配给当前遇到的等价元素,而不必顾及其相对数是否为等价环中的最小者。这样分配的结果可能导致等价环中的元素与公用区中其它非等价环元素等价。
     非公用区中等价环元素的地址分配方法是:每当遇到等价环中的元素时,不是将局部数据区当前待分配地址直接分配给所遇到的等价环元素,而是将其分配给从这个等价环中找到的相对数最小的等价元素,然后再按等价环其它的等价元素的相对数与最小相对数的差数,予以分配相应的地址。这样就不致使局部数据区非等价元素与等价环元素等价,也不会使两个不同的等价环元素等价。
下面的例子充分说明了两者的不同。

FORTRAN说明语句序列1:
REAL    A(5)
COMMON  /C/B(3),K,T
EQUIVALENCE      (K,A(2))

FORTRAN说明语句序列2:
REAL    B(3),K,T,A(5)

EQUIVALENCE     (K,A(2))
     例子中都是变量K与数组A的第2个元素是等价的。第1种情形中,K后的变量T的地址会紧排在变量K之后。第2种情形中,变量T的地址必须要等到分配完数组A 的地址后才能分配变量K的地址。其存储分配如图所示。

4. 下面是一个Pascal程序

              program PP(input, output)

                     VAR k:integer;

                     FUNCTION F(n:integer): integer

                     begin

                            if n<=0 then F:=1

                            else F:=n*F(n-1);

                     end;

              begin

                     K:=F(10);

                     …

              end.

当第二次(递归地)进入F后,DISPLAY的内容是什么?当时整个运行栈的内容是什么?

由于过程F在主过程中定义,因此,过程F的 Display表中的内容有两项,分别为主过程活动记录首地址和过程F本身的最新活动记录首地址。当程序第次(递归地)进入F后, Display表的内容及当时整个运行栈的内容如图所示。(假设主过程活动记录的首地址为I+0)
 

5. 对如下的Pascal程序,画出程序执行到(1)和(2)点时的运行栈。

              progarm Tr(input, output);

                     VAR  i:integer; d:integer;

                     procedure A(k:real);

                            VAR p:char;

                            procedure B;

                                   VAR c:char;

                                   Begin

                                          …(1)…

                                   end; {B}

                            procedure C;

                                   VAR t:real;

                                   Begin

                                          …(2)…

                                   end; {C}

                            Begin

                                   ……

                                   B;

                                   C;

                                   ……

                            end; {A}

                     Begin {main}

                            …

                            A(d);

                            …

                     end.

答:子过程B和子过程C是子过程A内部并列定义的两个子过程,他们之间不存在定义的嵌套关系。程序执行到(1)和(2)点时运行栈状态分别如图(a)和图(b)所示。(假设主过程活动记录的首地址为I+0)。

 (a)程序执行到(1)点时的运行栈;(b)程序执行到(2)点时的运行栈

6. 有如下示意的Pascal源程序

              program main;

                     VAR a, b, c:integer;

                     procedure X(i, j:integer);

                            VAR d, e:real;

                            procedure Y;

                                   VAR f, g:real;

                                   Begin

                                   …

                                   End; {Y}

                            procedure Z(k:integer);

                                   VAR h, I, j:real;

                                   Begin

                                   ……

                                   end; {Z}

                            Begin

                                   ……

                                   10:Y;

                                   ……

                                   11:Z;

                                   ……

                            end; {X}

                     Begin

                            ……

                            X(a, b);

                            ……

                     end. {main}

并已知在运行时刻,以过程为单位对程序中的变量进行动态存储分配。当运行主程序而调用过程语句X时,试分别给出以下时刻的运行栈的内容和Display的内容。

(a) 已开始而尚未执行完毕标号为10的语句;

(b) 已开始而尚未执行完毕标号为11的语句。

(1)程序已开始而尚未执行完毕标号为10的语句时,运行栈的内容和Display表的内容如图(a)所示。(假设主过程活动记录的首地址为I+0)
(2)程序已开始而尚未执行完毕标号为11的语句时,运行栈的内容和 Display表的内容如图(b)所示。(假设主过程活动记录的首地址为I+0)

 (a)程序执行到标号为10的语句时的运行栈;(b)程序执行到标号为11的语句时的运行栈

7. 假定有一个语言,在每个过程内部既可以引用局部于该过程的变量,也可以引用主程序中的全局量,但过程调用既不允许递归也不允许嵌套,这些限制导致了非常简单的运行存储组织,为什么?

答:该语言的限制导致了非常简单的运行存储组织的原因,可以从运行存储组织复杂性的来源进行分析,主要包括:
(1)过程是否允许递归?由于不允许递归,则只需要考虑过程单一的数据特性。

(2)当控制从一个过程的活动返回时,对局部名称的值如何处理?同样由于过程不允许递归,则过程的活动是单一的,不会出现过程的多个活动,只考虑单一的局部名称的处理即可。

(3)过程是否允许引用非局部名称?如果每个过程内部既可以引用局部于该过程的变量,也可以引用主程序中的全局变量,可见该语言的过程引用是非常简单的,只要在过程的数据区中增加一个主程序全局变量区的首址就能满足其引用要求。所以不管该语言的动态分配需求如何,过程的局部数据区的处理是非常简单的。

9. 对于下面的程序:

              procedure P(X,Y,Z);

                     begin

                            Y:=Y+1;

                            Z:=Z+X;

                     end P;

              begin

                     A:=2;

                     B:=3;

                     P(A+B,A,A);

                     print A

              end

若参数传递的办法分别为(1)传名,(2)传地址,(3)得结果,以及(4)传值,试问,程序执行时所输出的A分别是什么?

不同的参数传递方式下程序执行时A的结果如下:

(1)传名:A=9;
(2)传地址:A=8;
(3)得结果:A=7;
(4)传值:A=2。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/831067.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

软件测试需求分析的常用方法

软件测试需求分析时&#xff0c;应要求产品人员对需求进行讲解&#xff0c;并使用相对应的方法进行科学分析&#xff0c;否则无法保障软件测试的完整性和科学性&#xff0c;从而造成在项目中后期Bug频出、风险增大等问题。 而常用的测试需求分析的方法&#xff1a; 1、功能分解…

腾讯云MSS多项能力获IDC五星评价,综合实力位列第一

近日&#xff0c;IDC发布了《IDC Technology Assessement: 中国公有云托管安全服务能力&#xff0c;2023》报告&#xff08;以下简称“报告”&#xff09;。腾讯云安全托管服务MSS凭借多年的技术积累和出色的服务能力&#xff0c;在报告的专家能力、漏洞及威胁检测、事件分析、…

二叉搜索树(BST)的模拟实现

序言&#xff1a; 构造一棵二叉排序树的目的并不是为了排序&#xff0c;而是为了提高查找效率、插入和删除关键字的速度&#xff0c;同时二叉搜索树的这种非线性结构也有利于插入和删除的实现。 目录 &#xff08;一&#xff09;BST的定义 &#xff08;二&#xff09;二叉搜…

刘汝佳の树状数组详解

引入 二叉索引树&#xff0c;也叫树状数组是一种便于数组单点修改和区间求和的数据结构 主要根据下标的lowbit值来建树 至于lowbit(x)&#xff0c;则是(x)&(-(x))&#xff0c;也就是一个二进制数从右边数第一个1代表的数 #define lowbit(x) ((x)&(-(x)))基础树状数组…

GF(2)上矩阵秩的快速计算

https://github.com/mhostetter/galois/issues

uniapp发布插件显示components/xxx文件没找到,插件格式不正确

uniapp发布插件显示components/xxx文件没找到&#xff0c;插件格式不正确 将插件文件这样一起选中&#xff0c;然后右键压缩成zip文件&#xff0c;而不是外层文件压缩

亚马逊、美客多卖家如何运营,养号技巧和硬件要求有哪些?

流量等于销量、等于利润&#xff0c;没有流量&#xff0c;一切都是白搭&#xff0c; 流量是一切销量的前提&#xff0c;我们平时做的优化、推广也是为了引入流量。所有亚马逊卖家都在围着一个目标而努力&#xff0c;那就是流量。那么亚马逊新卖家该如何引流呢? 我们需要从以下…

无涯教程-Perl - 条件判断

以下是在大多数编程语言中找到的典型判断结构的概述- Perl编程语言提供以下类型的条件语句。 Sr.No.Statement & 描述1 if statement if语句由布尔表达式和一个或多个语句组成。 2 if...else statement在 if语句之后可以是可选的 else语句。 3 if...elsif...else statemen…

如何将镜像体积海量缩减

点击上方蓝色字体&#xff0c;选择“设为星标” 回复”云原生“获取基础架构实践 镜像的传统构建 我们随便找个Golang代码项目作为案例&#xff0c;来开始构建一个镜像。下面我们以我的一个实战项目开始讲解&#xff1a;https://gitee.com/damon_one/uranus。 第一步&#xff1…

uC-OS2 V2.93 STM32L476 移植:系统移植篇

前言 上一篇已经 通过 STM32CubeMX 搭建了 NUCLEO-L476RG STM32L476RG 的 裸机工程&#xff0c;并且下载了 uC-OS2 V2.93 的源码&#xff0c;接下来&#xff0c;开始系统移植 开发环境 win10 64位 Keil uVision5&#xff0c;MDK V5.36 uC-OS2 V2.93 开发板&#xff1a;NUC…

机器学习深度学习——从全连接层到卷积

&#x1f468;‍&#x1f393;作者简介&#xff1a;一位即将上大四&#xff0c;正专攻机器学习的保研er &#x1f30c;上期文章&#xff1a;机器学习&&深度学习——非NVIDIA显卡怎么做深度学习&#xff08;坑点排查&#xff09; &#x1f4da;订阅专栏&#xff1a;机器…

D. Different Arrays

Problem - 1783D - Codeforces 思路&#xff1a; 这是一个计数问题&#xff0c;我们要统计不同数组的个数&#xff0c;可以用dp&#xff0c;让f[i][j]表示只考虑前i个&#xff0c;并且结尾为j的情况&#xff0c;那么转移方程为我们枚举i&#xff0c;与枚举前一个是多少&#xf…

电脑安装新系统不知道去哪里下载,看我就够了

大家在日常生活中肯定都会遇到电脑安装系统的需求&#xff0c;如果去微软官方购买正版的系统又很贵&#xff0c;又不太想花这个冤枉钱&#xff0c;这个时候我们就不得不去网上查找一些免费好用的系统&#xff0c;可是百度一下&#xff0c;或者Google一下&#xff0c;各种下载系…

【css】css设置表格样式-边框线合并

<style> table, td, th {border: 1px solid black;//设置边框线 }table {width: 100%; }td {text-align: center;//设置文本居中 } </style> </head> <body><table><tr><th>Firstname</th><th>Lastname</th><t…

【uniapp】样式合集

1、修改uni-data-checkbox多选框的样式为单选框的样式 我原先是用的单选&#xff0c;但是单选并不支持选中后&#xff0c;再次点击取消选中&#xff1b;所以我改成了多选&#xff0c;然后改变多选样式&#xff0c;让他看起来像单选 在所在使用的页面上修改样式即可 <uni-d…

1-搭建一个最简单的验证平台UVM,已用Questasim实现波形!

UVM-搭建一个最简单的验证平台&#xff0c;已用Questasim实现波形 1&#xff0c;背景知识2&#xff0c;".sv"文件搭建的UVM验证平台&#xff0c;包括代码块分享3&#xff0c;Questasim仿真输出&#xff08;1&#xff09;compile all&#xff0c;成功&#xff01;&…

kubernetes 集群利用 efk 收集容器日志

文章目录 [toc]前情提要制作 centos 基础镜像准备 efk 二进制文件部署 efk 组件配置 namespace配置 gfs 的 endpoints配置 pv 和 pvc部署 elasticsearchefk-cmefk-svcefk-sts 部署 filebeatfilebeat-cmfilebeat-ds 部署 kibanakibana-cmkibana-svckibana-dp使用 nodeport 访问 …

免费快速下载省市区县行政区的Shp数据

摘要&#xff1a;一般非专业的GIS应用通常会用到省市等行政区区划边界空间数据做分析&#xff0c;本文简单介绍了如何在互联网上下载省&#xff0c;市&#xff0c;区县的shp格式空间边界数据&#xff0c;并介绍了一个好用的在线数据转换工具&#xff0c;并且开源。 一、首先&am…

图卷积网络(GCN)和池化

一、说明 GCN&#xff08;Graph Convolutional Network&#xff09;是一种用于图形数据处理和机器学习的神经网络架构。GCN 可以在图形中捕获节点之间的关系&#xff0c;从而能够更好地处理图形数据。GCN 可以沿着图形上的边缘执行滤波器操作&#xff0c;将每个节点的特征向量进…

OA是什么意思?OA系统是什么

阅读本文您可以了解&#xff1a;1、OA是什么&#xff1b;2、OA系统是什么&#xff1b;3、OA系统有什么功能 一、OA是什么 当提到OA&#xff0c;我们通常指的是"Office Automation"&#xff08;办公自动化&#xff09;。 办公自动化指的是在办公室环境中使用计算机技…