美文网首页
编译器笔记42-运行存储分配-非局部数据的访问

编译器笔记42-运行存储分配-非局部数据的访问

作者: 衣忌破 | 来源:发表于2020-03-10 16:00 被阅读0次

非局部数据的访问

  • 一个过程除了可以使用过程自身定义的 局部数据以外,还可以使用过程外定义的非局部数据。

  • 语言可以分为两种类型

  1. 支持过程嵌套声明的语言
    可以在一个过程中声明另一个过程,例:Pascal

  2. 不支持过程嵌套声明的语言
    不可以在一个过程中声明另一个过程,例:C

支持过程嵌套声明的语言

例: Pascal.png

不支持过程嵌套声明的语言

例:C.png

无过程嵌套声明时的数据访问

  • 变量的存储分配和访问
  1. 全局变量被分配在静态区,使用静态确定的地址访问它们。
  2. 其它变量一定是栈顶活动的局部变量。可以通过运行时刻栈的top_sp指针访问它们。

有过程嵌套声明时的数据访问

嵌套深度

  • 过程的嵌套深度
  1. 不内嵌在任何其它过程中的过程,设其嵌套深度为1。
  2. 如果一个过程p 在一个嵌套深度为i 的过程中定义,则设定p
    的嵌套深度为i +1。
  • 变量的嵌套深度
    将变量声明所在过程的嵌套深度作为该变量的嵌套深度
例.png

访问链 (Access Links)

  • 静态作用域规则:只要过程b 的声明嵌套在过程a的声明中,过程b 就可以访问过程a中声明的对象。

  • 可以在相互嵌套的过程的活动记录之间建立一种称为访问链 (Access link) 的指针,使得内嵌的过程可以访问外层过程中声明的对象。

如果过程b 在源代码中 直接嵌套 在过程a 中(b的嵌套深度比a的嵌套深度多1) ,那么b 的 任何活动中的访问链都指向最近的a的活动。

例子

例.png 0.png 1.png 2.png 3.png

访问链的建立

外层调用内层.png 本层调用本层.png 内层调用外层.png

相关文章

  • 编译器笔记42-运行存储分配-非局部数据的访问

    非局部数据的访问 一个过程除了可以使用过程自身定义的 局部数据以外,还可以使用过程外定义的非局部数据。 语言可以分...

  • OC基础学习:内存中的区域

    OC中,内存一般分为五大区域 栈存储局部变量和实参由编译器自动分配释放存储空间有限地址是连续的地址分配从大到小访问...

  • 编译器笔记38-运行存储分配-运行存储分配概述

    运行存储分配策略 编译器在工作过程中,必须为源程序中出现的一些数据对象分配运行时的存储空间。 对于那些在编译时刻就...

  • 内存中的存储方式

    1.栈区(stack):由编译器自动分配释放,存放为运行函数而分配的局部变量、函数参数、返回数据、返回地址等。 2...

  • 编译器笔记39-运行存储分配-静态存储分配

    静态存储分配 在静态存储分配中,编译器为每个过程确定其活动记录在目标程序中的位置。这样,过程中每个名字的存储位置就...

  • 缓存知识前奏

    程序运行的局部性 时间局部性:一个数据访问后,很快被再次访问空间局部性:一个数据被访问时,其周边数据也有可能被访问...

  • 编译器笔记43-运行存储分配-堆式存储分配

    堆式存储分配 堆式存储分配是把连续存储区域分成块,当活动记录或其它对象需要时就分配。 块的释放可以按任意次序进行,...

  • 编译器笔记40-运行存储分配-栈式存储分配

    栈式存储分配 有些语言使用过程、函数或方法作为用户自定义动作的单元,几乎所有针对这些语言的编译器都把它们的有些语言...

  • 第二章 一切都是对象 2018-10-08

    1.保存数据 寄存器: 最快的保存区域,位于处理器内部,由编译器分配 堆栈: 保存常规 RAM(随机访问存储器)区...

  • 缓存问题

    缓存的本质 先聊一下缓存存储的基础。首先,局部性原理,是缓存存储的基础,即在局部的时间,对数据的访问是局部的、集中...

网友评论

      本文标题:编译器笔记42-运行存储分配-非局部数据的访问

      本文链接:https://www.haomeiwen.com/subject/napvdhtx.html