网站大量收购独家精品文档,联系QQ:2885784924

编译原理课程设计第七节运行时环境.ppt

  1. 1、本文档共62页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
课程内容 第一章 概论 第二章 词法分析 第三章上下文无关文法及分析 第四章自上而下的语法分析 第五章自下而上的语法分析 第六章语义分析 第七章运行时环境 第八章代码生成 当源程序的目标代码被运行时,在内存中不仅有目标代码,而且还要保存各种信息,如必须为源程序中所出现的一些量(常量、变量及某些数组等)分配运行时的存储空间。即编译器要从操作系统得到一块存储区,用于被编译过的目标程序的运行。 存储分配是在运行阶段进行的,但编译程序在编译阶段要为其设计好存储组织形式,并将这种组织形式通过生成的目标代码体现出来。(举例说明:函数调用分析.txt) 目标代码运行时,存储空间的组织称为目标代码的运行时环境。 运行时环境有三个类型:完全静态环境(fully static environment)、基于栈的环境(stack-based environment),以及完全动态环境(fully dynamic environment)。这3种类型的混合形式也是可能的。 代码区域:目标代码的存储区域,由于代码区在执行之前是固定的,所以在编译时所有目标代码的地址都是可计算的; 全程/静态区域:静态数据区用来存放那些具有绝对地址的数据和变量(如静态变量和全程变量);编译器可以确定其所占用存储空间的大小; 栈区:在运行时分配存储空间的数据就分配在栈区;编译器知道存在栈中的具体数据大小和存活时间; 堆区:供用户动态申请存储空间,编译器不需要知道究竟得从heap中分配多少空间,也不需要知道从heap上分配的空间究竟需要存在多久。 由于栈区和堆区的长度会随着目标代码的运行而变化,因此把它们分配在数据区的两端。一般情况下,栈向下长,堆向上长,可以使栈和堆共用一空白存储空间。 在PASCAL,C语言中,通常采用以过程为单位的动态存储分配方案: 当一过程(函数)被调用时,就在栈顶为该过程分配所需的数据空间(过程活动记录),当一个过程工作完毕返回时,它在栈顶的数据空间(过程活动记录)也即释放。 过程的活动记录(activation record,AR)是一段连续的存储区,用于存放过程的一次执行所需要的信息,当调用或激活过程或函数时,必须为被调用过程的活动记录分配空间。 活动记录存放的信息至少应包括以下几个部分: 在完全静态环境中,不仅全局变量,所有的变量都是静态分配,即整个程序所需数据空间的总量在编译时是完全确定的,从而每个数据名的地址就可静态地进行分配,适于静态分配的语言,要求满足的条件是: 每个数据名所需的存储空间的大小都是常量 不允许采用动态的数据结构,即在程序运行过程中申请或释放的数据结构 过程不可递归调用 程序所需的数据空间在程序运行前就可确定,称为_______管理技术。 静态存储 动态存储 栈式存储 堆式存储 静态存储分配允许程序出现_______。 递归过程 可变体积的数据项目 静态变量 待定性质的名字 在一个所有过程都是全局的、过程定义不允许嵌套,但允许过程的递归调用的程序设计语言(例如C语言)中,基于栈的动态运行时环境有两个指针: sp:栈顶部(top of stack)指针;对于x86系统来说,它采用sp或esp寄存器存储栈顶部的地址; fp(frame point)指向当前活动记录的控制链的指针,对于x86系统,它采用bp或ebp寄存器存储当前活动记录的控制链的地址,其作用如下: 1.通过该指针可以访问当前执行函数的局部变量; 2.通过该指针可以访问主调程序的活动记录; 3.允许在当前的被调函数执行完毕时,用它来恢复主调函数的活动记录。 目标代码的生成必须支持变量和临时变量的实际定位,并增加支持运行时环境所必需的代码。 对名字的访问 如何处理可变长度的问题 局部临时变量 嵌套声明 在没有局部过程的基于栈的运行时环境中,所有的非局部的名字都是全局的,因此也就是静态的,都具有一个固定的静态地址,可以被直接访问。 对函数参数和局部变量而言,在大多数的语言中,每个局部声明的偏移量仍是可有编译程序静态地计算出来,因为过程的声明在编译时是固定的,而且为每个声明分配的存储器大小也根据其数据类型而固定。 目标代码的生成必须支持变量和临时变量的实际定位,并增加支持运行时环境所必需的代码。 对名字的访问 如何处理可变长度的问题 局部临时变量 嵌套声明 目标代码的生成必须支持变量和临时变量的实际定位,并增加支持运行时环境所必需的代码。 对名字的访问 如何处理可变长度的问题 局部临时变量 嵌套声明 考虑C表达式: x[i]=(i+j)*(i/k+f(j)) 在这个表达式从左到右的求值计算中,在对f的调用过程中需要保存中间结果: x[i]的地址、i+j的和、i/k的商。 这些中间值可计算到寄存器中,根据寄存器进行保存和恢复;或者可将它们作为临时变量存储

文档评论(0)

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

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

1亿VIP精品文档

相关文档