编译原理chapter10(精品·公开课件).pptVIP

  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文档。上传文档
查看更多
数据空间的三种不同使用方法和管理方法 栈式存储分配的实现 参数传递 参数传递 知道一个语言使用的参数传递方法很重要,因为一个程序的结果依赖于所使用的方法。考察下图中的PASCAL程序,知道该程序的输出是a=2,b=1,如果将第3行的关键字var去掉,则该程序的输出是a=1,b=2。 因为有关键字var时,PASCAL语言的参数传递使用的方式是传地址,去掉var,则使用传值方式。 传值 传值(值调用),即计算出实参的值,然后把它传给被调过程。具体处理过程是: 1)形式参数当作过程的局部变量处理,即在被调用过程的活动记录中开辟形参的存储空间,这些存储位置就是所说的形式单元。 2)调用过程计算实参的值,并将它们的右值放在形式单元开辟的空间中。 3)被调用过程执行时,就象使用局部变量一样使用这些形式单元。 传值的重要特点是,对形式参数的任何计算不影响调用过程的活动记录中实参的值。也即在上图的程序中,如果第3行的关键字var去掉后,PASCAL将以传值方式将x和y传递给过程swap。 传值 第12行swap(a,b)调用过程将不会影响a和b的值。其等价于执行下列运算: x:=a y:=b temp:=x x:=y y:=temp 这里,x,y和temp局部于swap,虽然赋值改变了变量x,y和temp的值,但当控制从该调用返回而swap的该活动记录释放后,这些改变即消失,这种调用方式不影响调用过程的活动记录。 1 2 add_a: add_b: 调用者数据区 1 2 x: y: 被调用者数据区 执行完swap过程但还没有返回时 1 2 add_a: add_b: 调用者数据区 2 1 x: y: 被调用者数据区 执行完swap过程且返回后 1 2 add_a: add_b: 调用者数据区 被释放 被释放 x: y: 被调用者数据区 执行swap(a,b)时 传值 通过值调用的过程可由非局部量或由指针而对调用过程发生影响。比如下图中的C程序,x和y声明为整型指针,第10行调用swap(a,b)中的操作符导致将指向a和b指针传给过程swap。该程序的输出为:a=2,b=1 这个例子中的指针的使用恰好提示了一个编译程序怎样实现地址(引用)调用。 传地址 当参数通过引用传递时(也称作传地址或引用调用),调用过程传递给被调过程的是指针,指向实在参数存储位置的指针。 1)如实参是一个名字或具有左值的表达式,则左值本身传递过去; 2)如实参是一表达式,比如a+b或2,而没有左值,则表达式先求值,并存入某一位置,然后该位置的地址传递过去; 3)被调用过程中对形式参数的任何引用和赋值都通过传递到被调用过程的指针被处理成间接访问。例如,在上述的程序中,若用实参j和a[j]对过程swap进行调用,即 swap(j,a[j]),其效果如下面所述。若仍执行swap(a,b)调用,参数传递采用传地址方式的图示如下: 1 2 add_a: add_b: 调用者数据区 add_a add_b x: y: 被调用者数据区 执行完swap过程但还没有返回时 2 1 add_a: add_b: 调用者数据区 add_a add_b x: y: 被调用者数据区 执行完swap过程且返回后 2 1 add_a: add_b: 调用者数据区 被释放 被释放 x: y: 被调用者数据区 执行swap(a,b)时 code static data stack heap name storage value state environment 名字到存储、到值的映射 临时工作单元 局部变量 机器状态信息 存取链 控制链 实参 返回地址 1)临时工作单元:比如计算表达式过程中需要存放中间结果用的临时值单元; 2)局部变量:一个过程的局部变量; 3) 机器状态信息:容纳过程执行前机器状态的信息,诸如程序计数器、寄存器的值,这些值需要在控制从过程返回时给予恢复; 4)存取链:用以存取非局部变量,这些变量存放于其它过程活动记录中,并不是所有语言都需要; 5)控制链:指向调用该过程的那个过程的活动记录,这也不是所有语言都需要的; 6)实参:也称形式单元,由调用过程向该被调用过程提供实参的值或地址。当然在实际编译程序中,也常使用寄存器传递实参; 7)返回地址:保存该被调用过程返回后的地址。 但并不是所有的语言,所有的编译程序全部使用这些信息。上述各种信息域的大小,在编译时是已知的,如果局部变量中包含有可变数组,那么则采用前两章中介绍的内情向量,将内情向量置于过程活动记录中。另外,有些语言的编译程序还将参数个数存放于活动记录中,以便进行参数个数的检查。 一般

文档评论(0)

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

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

1亿VIP精品文档

相关文档