- 1、本文档共92页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
至今,我们已经研究了对源程序进行静态分析的编译程序的不同阶段,这些分析仅取决于源程序本身的特性,它与目标程序、目标机器以及目标机器的操作系统特性完全无关。但是,编译程序的最终目的是将源程序翻译成能够在目标机器上运行的目标程序,这就要求编译程序不仅能生成目标代码,而且还要在生成目标代码之前进行目标程序运行环境的设计和数据空间的分配,即在生成目标代码之前,需要把程序的静态的正文与实现该程序运行时的活动联系起来。 如在目标代码运行时,源程序中的各种变量、常量等如何在存储器中存放,又如何对它们进行访问;这些变量或常量的作用域和生存期如何确定;递归过程(函数)的数据空间如何在运行过程中实现动态的分配。这些问题对编译程序来说,都是非常复杂而又十分重要的。 从编译角度看,程序语言关于名字的作用域和生存期的定义规则决定了分配目标程序数据空间的基本策略。如果一个程序语言不允许有递归过程,不允许含有可变体积的数据项目或待定性质的名字,那么就能在编译时完全确定其程序的每个数据项目存储空间的位置,这种策略叫做静态分配策略。如果程序语言允许有递归过程(函数)和可变(体积的)数组,则其程序数据空间的分配需采用某种动态策略(在程序运行时动态地进行程序数据空间的分配);此时,目标程序可用一个栈作为动态的数据空间。程序运行时,每当进入一个过程(函数)或分程序,其所需的数据空间就动态地分配于栈顶, 一旦该过程(函数)或分程序运行结束,其所占用的空间就予以释放,这种方法叫做栈式动态分配策略。如果程序语言允许用户动态地申请和释放存储空间,并且申请和释放之间不一定遵守“先请后放”和“后请先放”的原则,此时就必须让运行程序持有一个大存储区(称为堆),凡申请者从堆中分给一块,凡释放者退还给堆,这种方法叫做堆式动态分配策略。 如果在编译时就能够确定一个程序在运行时所需的存储空间大小,则在编译时就能够安排好目标程序运行时的全部数据空间,并能确定每个数据项的单元地址,存储空间的这种分配方法叫做静态分配。 对FORTRAN语言来说,其特点是不允许过程有递归性,每个数据名所需的存储空间大小都是常量(即不允许含可变体积的数据,如可变数组),并且所有数据名的性质是完全确定的(不允许出现在运行时再动态确定其性质的名字这种情况)。这些特点确保整个程序所需数据空间的总量在编译时是完全确定的,从而每个数据名的地址就可静态地进行分配。 静态存储分配是一种最简单的存储管理。一般而言,适于静态存储分配的语言必须满足以下条件: (1) 数组的上下界必须是常数; (2) 过程调用不允许递归; (3) 不允许采用动态的数据结构(即在程序运行过程中申请和释放的数据结构)。 满足这些条件的语言除了FORTRAN之外,还有BASIC等语言。在这些语言中,编译程序可以完全确定程序中数据项所在的地址(通常为相对于各数据区起始地址的位移量)。由于过程调用不允许递归,因此数据项的存储地址就与过程相联系。过程调用所使用的局部数据区可以直接安排在过程的目标代码之后,并把各数据项的存储地址填入相关的目标代码中,以便在过程运行时访问这个局部数据区。 在此,不存在对存储区的再利用问题,目标程序执行时不必进行运行时的存储空间管理,过程的进入和退出变得极为简单。 图6-1 一个FORTRAN程序段的局部数据区 FORTRAN语言的静态存储管理特点是FORTRAN程序中的各程序段均可独立地进行编译。在编译过程中,给程序中的变量或数组分配存储单元的一般做法是:为每一个变量(或数组)确定一个有序的整数对;其中,第一个整数用来指示数据区(局部数据区或公用区)的编号,第二个整数则用来指明该变量(或数组)所对应的存储起始单元相对于其所在数据区起点的位移(即相对于数据区起点的地址),并将这一对整数填入符号表相应登记项的信息栏中。至于各数据区的起始地址在编译时可暂不确定,待各程序段全部编译完成之后,再由连接装配程序最终确定,并将各程序段的目标代码组装成一个完整的目标程序。 一个FORTRAN程序段的局部数据区可由图6-1所示的项目组成。其中,隐参数是指过程调用时的连接信息(不在源程序中明显出现),如调用时的返回地址、调用时寄存器的保护等;形式单元用来存放过程调用时形参与实参结合的实参地址或值。 我们首先考虑一种简单程序语言的实现,这种语言没有分程序结构,过程定义不允许嵌套,但允许过程的递归调用,允许过程含有可变数组。例如,C语言除不允许含有可变数组外,就是这样一种语言。C语言的程序结构如下: 全局数据说明 main(?) { main中的数据说明 } void R(?) { R中的数据说明 } void Q( )
您可能关注的文档
- 边做边学——Premiere Pro CS3视频编辑案例教程 教学课件 作者 杨剑涛 04.ppt
- 边做边学——Premiere Pro CS3视频编辑案例教程 教学课件 作者 杨剑涛 05.ppt
- 边做边学——Premiere Pro CS3视频编辑案例教程 教学课件 作者 杨剑涛 06.ppt
- 边做边学——Premiere Pro CS3视频编辑案例教程 教学课件 作者 杨剑涛 07.ppt
- 边做边学——Premiere Pro CS3视频编辑案例教程 教学课件 作者 杨剑涛 08.ppt
- 边做边学——会声会影 X3视频编辑案例教程 教学课件 作者 王世宏 陈娟 01.ppt
- 边做边学——会声会影 X3视频编辑案例教程 教学课件 作者 王世宏 陈娟 02.ppt
- 边做边学——会声会影 X3视频编辑案例教程 教学课件 作者 王世宏 陈娟 03.ppt
- 边做边学——会声会影 X3视频编辑案例教程 教学课件 作者 王世宏 陈娟 04.ppt
- 边做边学——会声会影 X3视频编辑案例教程 教学课件 作者 王世宏 陈娟 05.ppt
文档评论(0)