程序设计语言与编译ppt课件_10.4 存储空间分配.pptxVIP

程序设计语言与编译ppt课件_10.4 存储空间分配.pptx

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多

第十章目标代码生成;1. 程序的存储空间

2. 局部环境

3. 参数传递

4. 非局部环境

;1. 程序的存储空间

2. 活动记录

3. 参数传递

4. 非局部变量

;程序要投入运行,必须在内存中分配一定的存储空间,并将程序装入其中。存储空间包含两个部分,分别是

1. 代码空间

存放可运行的代码。内容为线性存放的目标指令序列,在编译时即可确定。

2. 数据空间

存放可访问的数据。在编译时(运行前)就能确定的数据称为静态数据,存放到静态数据空间;在运行时才能确定的数据称为动态数据,存放到动态数据空间。

;动态数据空间分为堆空间和栈空间两种类型。

堆空间:某些变量的首地址、偏移量、长度或类型等信息在编译时无法确定,只能在程序运行过程中才能确定,可将这些变量分配到堆中。例如:C语言中的malloc函数、C++/Java中的new操作、某些语言中的动态变量等。

栈空间:某些变量的首地址在编译时无法确定,但它在函数的局部数据空间中的偏移量、长度和类型等信息在编译时可以确定,可将这些变量分配到栈中。

;程序的存储空间;1. 程序的存储空间

2. 活动记录

3. 参数传递

4. 非局部变量

;程序由函数(过程、子程序、程序单元)组成,每个函数拥有自己的局部数据空间。一个函数的局部数据空间也叫做该函数的活动记录(ActiveRecord),或者栈帧(StackFrame)。一个函数在执行过程中所需要的数据信息、管理信息都是通过它的活动记录来存放的。;活动记录的内容;函数之间的调用遵循“后进先出”模式,相应活动记录的分配也满足“后进先出”模式,这种分配方式叫做栈式分配。

栈式分配:用栈来分配函数的活动记录。当一个函数被调用时,在栈顶分配其活动记录;当函数退出时,在栈顶将其活动记录撤销。;P被调用

P开始运行

P调用Q

Q开始运行

Q调用R

R开始运行

;活动记录是在函数调用时动态建立,在函数退出时动态撤销的。

动态连接

主调函数调用被调函数时,在被调函数的活动记录中保存主调函数的活动记录的首地址,以便于在被调函数退出时恢复主调函数的活动记录。

动态链

由动态连接组成的一个调用链。

;A: callE

E: callF

F: callG

G: callF

;LOD TP,IP+40 #计算返回地址(5*8=40)

STO (BP+len),TP #保存返回地址(len为当前活动记录的长度)

STO (BP+len+4),BP #保存动态连接

ADD BP,len #切换到被调函数的活动记录

JMP L #转移到被调函数

;LOD JP,(BP) #获取返回地址

LOD BP,(BP+4) #切换到主调函数的活动记录

JMP JP #转移到主调函数;1. 程序的存储空间

2. 活动记录

3. 参数传递

4. 非局部变量

;一个函数(过程、子程序、程序单元)可访问的数据除了该函数自身定义的局部变量之外,还包括主调函数传递给它的参数。参数传递就是将主调函数的参数(实参)传递给被调函数的参数(形参)。

;主调方三地址码:

……

actuala

actualb

callswap

……;参数传递的常见类型有:

1. 传值

2. 传地址

;intmain()

{

inta=1,b=2;

printf(%d%d\n,a,b);

swap(a,b);

printf(%d%d\n,a,b);

return0;

};intmain()

{

inta=1,b=2;

printf(%d%d\n,a,b);

swap(a,b);

printf(%d%d\n,a,b);

return0;

};1. 程序的存储空间

2. 活动记录

3. 参数传递

4. 非局部变量

;一个函数可以访问该函数中定义的变量(局部变量),还可以访问全局变量和部分其它函数中定义的变量(非局部变量)。对非局部变量的访问方式取决于变量的作用域。

变量的作用域:能够访问某个变量的代码空间。如果一段代码处于某个变量的作用域内,则可以访问(读/写)该变量;否则,不能访问该变量。

;C/C++

Java

Python

JavaScript

Bash

Perl

LISP;静态作用域规则

这是一种最近嵌套规则,对非局部变量,访问的应是最近的嵌套外层中说明的变量。

动态作用域规则

这是一种最近活动规则,对非局部变量,访问的应是最近的调用外层中说明的变量。

;动态作用域规则

通过动态链找到最近的调用外层中说明的变量。

静态作用域规则

通过静态链找到最近的嵌套外层中说明的变量。

静态连接:指向直接嵌套外层的最新活动记录的指针。

静态链:

文档评论(0)

Kaiser + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档