0

对使用静态链访问非局部变量的一种批评是,对超出静态父级范围的变量的引用比对局部变量的引用成本更高。必须遵循静态链,每个封闭范围从引用到声明一个链接。幸运的是,在实践中,对远距离非局部变量的引用很少见,所以这不是一个严重的问题。对静态链方法的另一个批评是,对于时间要求严格的程序,程序员很难估计非本地引用的成本,因为每个引用的成本取决于引用之间的嵌套深度和范围。宣言。使这个问题更复杂的是,后续的代码修改可能会改变嵌套深度,从而改变一些引用的时间,

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

4

3 回答 3

1

这个问题听起来很熟悉(如果你愿意的话,就像家庭作业一样),所以我将采取谨慎的态度来回答并告诉你的搜索重点。

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

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

于 2012-04-22T22:37:38.150 回答
0

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

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

于 2012-04-24T00:24:09.597 回答
0

这似乎是小事一桩。

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

所以我有意见:

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

所以它从来都不重要。

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

于 2021-03-02T07:43:36.067 回答