编译原理课件学习课件.pptVIP

  1. 1、本文档共55页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
CompilerPrinciples 第六讲 运行时存储空间组织 目标程序运行时的活动 运行时存储器的划分 存储分配策略 编译程序在完成词法、语法和语义分析后,在生成目标代码之前,需要把程序的静态正文和实现这个程序的运行时的活动联系起来,弄清楚将来在代码运行时刻,源代码中的各种变量、常量等用户定义的量是如何存放的,如何去访问它们。 在程序的执行过程中,程序中数据的存取是通过与之对应的存储单元来进行的。在程序语言中,程序使用的存储单元都是由标识符来表示的。它们对应的内存地址都是由编译程序在编译时或由其生成的目标程序运行时进行分配。所以对于编译程序来说存储组织与管理是一个复杂而又十分重要的问题。这一章就是对目标程序运行时的活动和运行环境进行讨论,主要讨论存储组织与管理, 包括活动纪录的建立与管理、存储器的组织与存储分配的策略、非局部名称的访问等问题。 §1.目标程序运行时的活动 一、过程的活动 这一节讨论一个过程的静态源程序和它的目标程序在运行时的活动之间的关系。 一个过程的活动指的是该过程的一次执行。 关于过程P一个活动的生存期,指的是从执行该过程体第一步操作到最后一步操作之间的操作序列,包括执行P时调用其他过程花费的时间。一般来说,术语“生存期”指的是在程序执行过程中若干步骤的一个顺序序列。 所谓递归过程是指一个过程P,若在其过程体内又再次转向它自身;或者P调用了P1,而P1中又调用了P。源语言是否允许递归过程直接影响了存储空间的分配策略。 例如Fortran中不允许递归过程,不允许含可变体积的数据项或待定性质的名字,这就完全确定了Fortran语言的分配策略—静态分配,即在编译阶段就能完全确定程序中所需的存储空间以及各个数据项的位置。 而Algol中允许递归过程,还允许可变数组,这样一来就必须使用动态分配策略了。 调用过程与被调用过程之间的信息往来主要通过全局变量或者参数传递,下面我们就来回顾一下参数传递的几种方式。 二、参数传递 1.传地址(call by address/reference): 把实在参数的地址传递给相应的形式参数。在过程段中,每个形式参数都有一个相应的存储单元:形式单元,用来存放相应的实在参数的地址。当调用一个过程时,调用段必须先把实在参数的地址传递到一个被调用段可以访问的地方。如果实在参数是个简单变量,则直接传递它的地址;如果它是表达式,那就先把它的值计算出来并存放在某一临时单元之中,然后传送这个临时单元的地址。 当程序控制转入被调用段后,被调用段首先把上述地址抄入自己的形式单元中,过程体对形式参数的任何引用或赋值都被处理成对形式单元的间接访问。 2.传值(call by value): 调用过程计算实参的值,存放在一个被调用过程可以取到的地方。被调用过程执行时,首先将这些值抄入自己的形式单元中,然后就像使用局部变量一样使用这些形式单元。 如果实在参数不为指针,则在这种情况下被调用段无法改变实参的值。 例如,看下面的Pascal程序: (1)program reference(input,output); (2)var a,b:integer; (3)procedure swap({var} x,y:integer); (4) var temp:integer; (5) begin (6) temp:=x; (7) x:=y; (8) y:=temp (9) end; (10)begin (11) a:=1; b:=2; (12) swap(a,b); (13) writeln(‘a=’,a);writeln(‘b=’,b) (14)end. 带有过程swap的PASCAL程序 procedure swap(x,y:integer); //传值 var temp:integer; begin temp:=x; x:=y; y:=temp end; 调用swap(a,b) 过程将不会影响a和b的值,其结果等价于执行下列运算: x :=a; y :=b; temp :=x; x :=y;

文档评论(0)

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

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

1亿VIP精品文档

相关文档