首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >符号表与静态链和作用域是如何关联的?

符号表与静态链和作用域是如何关联的?
EN

Stack Overflow用户
提问于 2010-08-02 17:25:07
回答 1查看 2.5K关注 0票数 6

我现在正在修一门编程语言原理课程,但我不能用我的一生来解决这个问题。这不是家庭作业,只是一个一般性的概念问题。

在我们的课堂上,我们讨论了静态链和显示。我想我理解我们为什么需要这些。否则,当我们有嵌套的方法时,我们就无法确定当我们有嵌套方法时,我们正在谈论的变量是什么。

我的教授也谈到了一个符号表。我的问题是符号表是用来做什么的?它与静态链有什么关系?

我会给一些背景(请纠正我,如果我是错的)。

(为了让解释更容易,我要定义一些东西)

假设我们有以下代码:

代码语言:javascript
运行
复制
main(){
    int i;
    int j;
    int k;
    a(){
        int i;
        int j;
        innerA(){
            int i = 5;
            print(i);
            print(j);
            print(k);
        }
    }

    b(){
        ...
    }
    ...
}

这一叠:

代码语言:javascript
运行
复制
| innerA  |
| a       |
| b       |
| main    |
-----------              

快速描述静态链作为刷新器。

静态链用于查找在内部函数中重新定义变量时应该使用的变量。在上面显示的堆栈中,每个帧都有一个指向包含它的方法的指针。所以:

代码语言:javascript
运行
复制
| innerA  | \\ pointer to a
| a       | \\ pointer to main
| b       | \\ pointer to main
| main    | \\ pointer to global variables
-----------        

(假设静态作用域,对于动态范围,我认为每个堆栈框架只会指向它下面的一个)

我认为当我们在print(<something>)方法中执行innerA时,会发生这样的情况:

代码语言:javascript
运行
复制
currentStackframe = innerAStackFrame;
while(true){ 
    if(<something> is declared in currentStackFrame)
        print(<something>);
        break;
    else{
        currentStackFrame = currentStackFrame.containedIn();
    }
}

符号表快速刷新

我不太清楚符号表是做什么用的。但看起来是这样的:

代码语言:javascript
运行
复制
Index is has value, 
Value is reference.
 __
|  |
|--|                        --------------------------------------------------
|  | --------------------> | link to next | name | type | scope level | other |
|--|                        --------------------------------------------------
|  |                              |
|--|                ---------------
|  |                |    
|--|                |             --------------------------------------------------
|  |                 ------->    | link to next | name | type | scope level | other |
|--|                              --------------------------------------------------
|  |
|--|

如果不止一个事物具有相同的hash值,这是一个链接parameter)

  • scope

  • 名称--元素的名称(示例: i、j、a、int)

  • 类型(示例:变量、函数、

  • 级别--不能100%确定这是如何定义的。我认为:
  • 0将是内置的,
  • 1将是全局的,
  • 2将是主要的方法,
  • 3将是a,b

h 1284将是

我只想重申我的问题:

  • 符号表用于什么?
  • 它与静态链有什么关系?
  • 为什么需要静态链,因为范围信息在符号表中。
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-08-02 18:18:25

请注意,“符号表”可以表示两种不同的内容:它可能意味着编译器用来确定变量的哪个别名在哪里有作用域的内部结构,也可以是指库在加载时向用户导出的符号列表。在这里,你使用的是前一个定义。

符号表用于确定用户在使用某个名称时所引用的内存地址。当你说"x“时,你想要哪个别名"x”?

您需要同时保留静态链和符号表的原因是:当编译器需要确定哪些变量在某个范围内可见时,它需要“取消”以前在内部作用域中别名的变量。例如,当从innerA移回a时,变量i会更改其内存地址。从amain,同样的事情也会再次发生。如果编译器没有保持静态链,则必须遍历整个符号表。如果你有很多名字的话那就太贵了。使用静态链,编译器只查看当前级别,删除包含在其中的每个变量的最后定义,然后跟踪链接到一个作用域。另一方面,如果您没有符号表,那么不在本地范围内的每个变量访问都将使编译器不得不遍历静态链。

总之,您可以从静态链重构符号表,反之亦然。但你真的希望这两者都能使通用案例操作更快。如果缺少符号表,编译将花费更长的时间,因为每个非本地范围的变量访问都需要提升静态链。如果缺少静态链,编译将花费更长的时间,因为保留作用域将需要遍历符号表才能删除现已失效的条目。

顺便说一句,如果您还没有使用Michael的编程语言语用学,那么您应该看看它。这是我所见过的关于这个主题的最好的教科书。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3390193

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档