南开大学编译原理第7章课件演示幻灯.ppt

  1. 1、本文档共81页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
调用序列(续) 返回序列 被调用者设置返回值(位于栈底,与调用者活动记录相邻) 利用保存的状态信息,被调用者恢复top_sp和其他寄存器,然后跳转到返回地址 调用者复制返回值 可变长度数据 top_sp top 7.3.3 空悬(dangling)引用 例7.6: 内存空间已释放,但还存在指向它的引用——程序员的错误! int *dangle() { int i = 23; return i; } main() { int *p; p = dangle(); } 7.3.4 堆分配策略 栈分配策略的局限,不能处理下列情况 局部名字的值在活动结束后能够保持 被调用函数的活动生存期比调用者长——可用活动树表示控制流的语言无法实现 对小的(或大小已知的)活动记录 为若干可能大小,创建空闲块链表(静态) 为大小为s的活动记录分配空间,尽量使用s’的空闲块表,s’为大于等于s的最小值。空间释放时,将块退回空闲块链表 对大块内存分配,利用堆管理器 堆分配策略(续) r的活动记录得到保持 7.4 访问非局部名字 栈 词法/静态作用域规则 lexical-,static-scope rule C、Pascal、Ada 嵌套问题 动态作用域规则 dynamic-scope rule Lisp、APL、Snobol 7.4.1 程序块(block) 语句块+它的局部数据声明 { 声明 语句} 特性:嵌套结构、不会交叉 “最近嵌套规则”,most closely nested rule 对于块B中的声明,其作用域包括B 块B中未声明名字x,则B中对x的引用由某个外层块B’中x的声明所确定,B’满足: 在包围B的,且有x的声明的外层块中,B’是距离B最近的那个 嵌套块作用域示例 main() { int a = 0; int b = 0; { int b = 1; { int a = 2; printf(“%d %d\n”, a, b); } { int b = 3; printf(“%d %d\n”, a, b); } printf(“%d %d\n”, a, b); } printf(“%d %d\n”, a, b); } B0 B1 B2 B3 声明 作用域 int a = 0; B0-B2 int b = 0; B0-B1 int b = 1; B1-B3 int a = 2; B2 int b = 3; B3 运行结果 2 1 0 3 0 1 0 0 实现方法 栈实现,将块看作过程 过程内实现 7.4.2 无过程嵌套的静态作用域 C 局部名字——栈 任何过程之外的名字——静态分配 非局部——全局概念 过程可作为参数和返回值?非局部名字都可用静态地址访问到 过程作为参数——无嵌套情况 program pass(input, output); var m : integer; function f(n : integer) : integer; begin f := m + n end; function g(n : integer) : integer; begin g := m * n end; procedure b(function h(n : integer) : integer); begin write(h(2)) end; begin m := 0; b(f); b(g); writeln end. 运行结果: 2 0 7.4.3 包含过程嵌套的静态作用域 Pascal,最近嵌套规则 program sort(input, output); var a : array[0..10] of integer; x : integer; procedure readarray; var i : integer; begin … a … end {readarray}; procedure exchange(i, j : integer); begin x:=a[i];a[i]:=a[j];a[j]:=x end {exchange}; procedure quicksort(m, n : integer); var k, v : integer; function partition(y, z : integer) : integer; var i, j : integer; begin …a… …v… end {partition}; begin … end {quicksor

文档评论(0)

youngyu0329 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档