编译 第7章 运行时环境

编译 第7章 运行时环境

ID:22481093

大小:476.00 KB

页数:35页

时间:2018-10-20

编译 第7章 运行时环境_第1页
编译 第7章 运行时环境_第2页
编译 第7章 运行时环境_第3页
编译 第7章 运行时环境_第4页
编译 第7章 运行时环境_第5页
资源描述:

《编译 第7章 运行时环境》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、第7章运行时环境学习目标:掌握参数传递的机制理解完全静态运行时环境,基于栈的运行时环境和完全动态运行时环境的主要思想目标代码源程序词法分析语法分析语义分析中间代码优化代码生成目标代码优化记号Tokens语法树注释树中间代码目标代码词法分析,语法分析和静态语义分析是编译器中实现源语言静态分析的编译程序各阶段,这些分析仅取决于源语言的特性代码生成的任务依赖于具体的目标机器。然而同样地代码生成的一般特征在体系结构上仍保留了很大的变化,例如运行时环境运行时环境指的是目标计算机的寄存器以及存储器的结构,用来管理存储器并保存指导执行过程所需的信息。寄存器和存储器分配是在运行阶段进行的编译

2、阶段设计运行时环境只能间接地维护环境在程序执行期间它必须生成代码进行必要的维护操作三种运行时环境完全静态环境基于栈的环境完全动态环境7.1程序运行时的存储器组织7.2三种运行时环境7.3参数传递机制7.1程序运行时的存储器组织典型的计算机存储器可分为:寄存器区域较慢的直接编址的随机访问存储器(RAM)RAM区域还可以再分为代码区和数据区代码区代码区在执行之前是固定的,在编译时所有代码的地址都是可计算的过程n的代码…过程2的代码过程1的代码代码存储器过程1的入口点过程2的入口点过程n的入口点数据区运行阶段,代码访问的数据分配的存储区域全局/静态区栈区堆区动态数据区数据区的分类全

3、局/静态区在执行之前,将数据固定在存储器中,包括了程序的全局和静态数据这些数据通常都在一个固定区域内并以类似的风格单独分配给代码栈区栈区域用于其分配发生在后进先出LIFO风格中的数据堆区堆区域用于不符合LIFO协议的动态分配例如指针的分配与回收:C++的new和delete,C的malloc和free一般的运行时存储器组织自由空间栈堆全局/静态数据区域代码区域栈和堆占有相同的区域箭头表示栈和堆的生长方向7.2三类运行时环境完全静态运行时环境所有的数据是静态的,且执行程序期间在存储器中保持固定适用的语言有以下特点:不允许指针或动态分配不允许递归调用过程典型的例子是FORTRAN

4、77例如:FORTRAN程序ProgramCNSUME//主程序段……CharacterfunctionPRDUCE()//子程序段……代码区全局/静态区PRDUCE的数据区CNSUME的数据区PRDUCE的目标代码CNSUME的目标代码基于栈的运行时环境当进行一个新的过程调用时,每个新的活动记录部分都分配在栈顶,当调用退出时则再次解除分配标准命令式语言(如C,Pascal)中常见的运行时环境格式,这种语言:允许递归调用每一个调用都重新分配局部变量Programmain;全局变量定义;ProcedureR;…End(R);ProcedureQ;…End(Q);主程序执行体En

5、d.(main)若主程序调用Q,Q递归调用自己,在Q第二次进入运行后的存储结构为:栈区Q的数据Main的数据全局变量数据区代码区Q的数据全局/静态区完全动态运行时环境完全动态运行时环境数据空间在执行时可以任意次地分配与回收。活动数据仅在对它们所有的引用都消失了才再重新分配完全动态运行时环境比基于栈的运行环境要复杂许多,因为它包含了要在执行时跟踪引用,以及在执行时任意次地找寻和重新分配存储器的不可访问区域(这种处理称为垃圾回收)堆管理和完全动态运行时环境堆管理使用分配操作和释放操作处理指针分配和重新分配,这是管理堆的手工方法,因为程序员必须编写出分配和释放存储器的明确的调用在一

6、种需要完全动态的运行时环境的语言中,堆必须自动管理7.3参数传递机制过程活动记录过程或函数调用时的内存分配活动记录必须包含下面的部分参数的空间过程或函数空间,包括返回地址局部数据空间局部临时变量空间参数传递在过程调用中,参数是如何通过调用程序在跳到被调用过程的代码之前与活动记录中的位置相对应的参数的值是如何由过程代码解释依赖于源程序采用的特定参数传递机制参数传递机制值传递(值调用)引用传递(引用调用)值结果传递(复制进-复制出)名字传递(延迟赋值)1传值参数参数是表达式参数传递参数在调用时计算,它们的值存储在活动记录中参数对应的位置在被调用程序执行时,代码将直接访问这些最终值

7、结果值参数被看作是初始化的局部变量,对它的改变不会影响任何非局部变量的变化例如//过程定义procedureSWAP(n,m:real);varj:real;beginj:=n;n:=m;m:=jend;//主程序inti;intk[10];i:=5;k[i]:=6;SWAP(i,k[i]);参数传递(add_i表示i的地址)调用者的数据区add_iadd_K[i]65被调用者的数据区add_nadd_m65add_j执行了过程语句后“j:=n;n:=m;m:=j”调用者数据区add_iadd_K[i]

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。