- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 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;静态作用域规则
这是一种最近嵌套规则,对非局部变量,访问的应是最近的嵌套外层中说明的变量。
动态作用域规则
这是一种最近活动规则,对非局部变量,访问的应是最近的调用外层中说明的变量。
;动态作用域规则
通过动态链找到最近的调用外层中说明的变量。
静态作用域规则
通过静态链找到最近的嵌套外层中说明的变量。
静态连接:指向直接嵌套外层的最新活动记录的指针。
静态链:
您可能关注的文档
- 程序设计语言与编译ppt课件_0 课程简介.pptx
- 程序设计语言与编译ppt课件_6.2 词法分析器实例.pptx
- 程序设计语言与编译ppt课件_7.6 LR分析法.pptx
- 程序设计语言与编译ppt课件_7.2 回溯分析法.pptx
- 程序设计语言与编译ppt课件_7.1 语法分析概述.pptx
- 程序设计语言与编译ppt课件_4.2.3 文法和语言.pptx
- 程序设计语言与编译ppt课件_4.1 程序设计语言的定义.pptx
- 程序设计语言与编译ppt课件_6.1 词法分析概述+单词的类别+单词的识别.pptx
- 程序设计语言与编译ppt课件_10.1 目标代码生成概述.pptx
- 程序设计语言与编译ppt课件_10.3 寄存器分配.pptx
- 程序设计语言与编译ppt课件_10.2 简单代码生成.pptx
- 程序设计语言与编译ppt课件_8.2 中间代码.pptx
- 程序设计语言与编译ppt课件_9.3 全局优化.pptx
- 程序设计语言与编译ppt课件_9.2 局部优化.pptx
- 程序设计语言与编译ppt课件_9.1 优化的概念.pptx
- 程序设计语言与编译ppt课件_8.9 函数的翻译.pptx
- 程序设计语言与编译ppt课件_8.8 for语句的翻译.pptx
- 程序设计语言与编译ppt课件_8.7 while语句的翻译.pptx
原创力文档


文档评论(0)