【问题标题】:problems with Static Chaining in a compiler编译器中的静态链接问题
【发布时间】:2012-04-22 21:06:02
【问题描述】:

对使用静态链访问非局部变量的一个批评是 对超出静态父级范围的变量的引用比引用成本更高 给当地人。必须遵循静态链,每个封闭范围从引用到声明一个链接。幸运的是,在实践中,参考 遥远的非局部变量很少见,所以这不是一个严重的问题。其他 对静态链方法的批评是对程序员来说很难 开展一项时间紧迫的计划,以估计非本地参考的成本, 因为每个引用的成本取决于 参考和声明的范围。使这个问题进一步复杂化的是 后续代码修改可能会改变嵌套深度,从而改变 一些引用的时间,无论是在更改的代码中,还是可能在 代码远离变化。

这种方法还有其他潜在问题吗?

【问题讨论】:

    标签: design-patterns static compiler-optimization chain


    【解决方案1】:

    这个问题听起来非常熟悉(如果你愿意的话,有点像家庭作业),所以我会谨慎地回答并告诉你的搜索重点。

    静态链实现静态作用域。一个是概念,另一个是这个概念是如何实现的。我建议使用代数的关联属性并从那里开始。 :)

    并且以防万一静态范围需要一些额外的说明: http://hoolihan.net/blog-tim/2009/02/17/static-vs-dynamic-scope/

    【讨论】:

    • 我完全明白,什么是动态和静态范围。而且我知道除了静态链接之外还有哪些静态作用域的实现,但它仍然是使用最广泛的,给我另一个理由,这样我就可以使用另一种实现方式。
    • 每次子程序调用和返回都必须修改静态链。子程序调用所需的操作很复杂。尽管在编译时很容易确定正确的父作用域,但必须在调用时找到父作用域的最新激活记录实例。
    • 静态链接是最广泛使用的,但静态范围是相对于语言的范围规则的。为什么静态作用域是一件坏事?静态链接的自下而上(从 ARI 到调用者 ARI)堆栈遍历不会导致问题吗?
    • 已经开发了一些静态链的替代方案,最值得注意的是一种使用称为显示的辅助数据结构的方法(静态链更好,除非显示可以保存在寄存器中)。然而,没有发现任何替代方法优于静态链方法,静态链方法仍然是最广泛使用的方法。此外,在动态范围界定方面也具有优势的深度访问在创建动态链接时的行为方式类似。
    • 除此之外,我没有主意了!!
    【解决方案2】:

    排除的两个问题是: 如果引用和被引用变量的声明之间的范围数很大,则非局部引用会很慢。时间关键代码很困难,因为非本地引用的成本不相等,并且会随着代码升级和修复而改变。

    但是,必须为每个子程序调用和返回修改静态链。子程序调用所需的操作很复杂。尽管在编译时很容易确定正确的父作用域,但必须在调用时找到父作用域的最新激活记录实例。通过静态链的漫长步行将是开销。已经开发了一些静态链的替代方案,最值得注意的是一种使用称为显示的辅助数据结构的方法(静态链更好,除非显示可以保存在寄存器中)。然而,没有发现任何替代方法优于静态链方法,静态链方法仍然是最广泛使用的方法。此外,在动态范围界定方面也具有优势的深度访问在创建动态链接时以类似的方式起作用。

    【讨论】:

      【解决方案3】:

      这似乎是小事一桩。

      我必须为 Modula-3 C 后端实现这个。

      所以我有意见:

      • 您可以摊销成本。如果在函数中频繁访问“uplevel local”,您可以将其地址缓存在本地/寄存器中。我没有实现这个。
      • 这是极其罕见的东西。
        • 支持这一点的编程语言很少见(Modula-3、Modula-2?Pascal?C、C++、Rust、Go 中的任何一种都不是……)
        • 在这些语言中,嵌套函数相当少见。
        • 在这些嵌套函数中,访问高级本地函数的情况更加罕见。
        • 然后很少对性能敏感。

      所以它从来都不重要。

      我不明白什么是“显示”与“静态链”。这不是一回事吗?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-11-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多