Design patterns 编译器中的静态链接问题

Design patterns 编译器中的静态链接问题,design-patterns,static,compiler-optimization,chain,Design Patterns,Static,Compiler Optimization,Chain,使用静态链访问非局部变量的一个批评是 在静态父对象之外的作用域中引用变量的成本大于引用的成本 对当地人来说。必须遵循静态链,从引用到声明的每个封闭范围都有一个链接。幸运的是,在实践中 遥远的非局部变量很少,所以这不是一个严重的问题。另一个 对静态链方法的批评是,它对程序员来说是困难的 致力于一项时间紧迫的计划,以估算非本地参考资料的成本, 因为每个引用的成本取决于 参考和声明的范围。使这一问题进一步复杂化的是 随后的代码修改可能会改变嵌套深度,从而改变 某些引用的计时,无论是在已更改的代码中还是

使用静态链访问非局部变量的一个批评是 在静态父对象之外的作用域中引用变量的成本大于引用的成本 对当地人来说。必须遵循静态链,从引用到声明的每个封闭范围都有一个链接。幸运的是,在实践中 遥远的非局部变量很少,所以这不是一个严重的问题。另一个 对静态链方法的批评是,它对程序员来说是困难的 致力于一项时间紧迫的计划,以估算非本地参考资料的成本, 因为每个引用的成本取决于 参考和声明的范围。使这一问题进一步复杂化的是 随后的代码修改可能会改变嵌套深度,从而改变 某些引用的计时,无论是在已更改的代码中还是在 代码远离更改


这种方法是否还有其他潜在问题

这个问题听起来非常熟悉(如果你愿意的话),所以我将采取谨慎的方式回答,并告诉你的搜索重点在哪里

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

为了防止静态范围需要额外的澄清: 排除的两个问题是: 如果引用和被引用变量的声明之间的作用域数量很大,则非局部引用速度较慢。时间关键型代码很困难,因为非本地引用的成本不相等,并且可能随着代码升级和修复而改变


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

这似乎是小题大做

我必须为Modula-3C后端实现这一点

所以我有一些观察:

  • 你可以分摊费用。如果函数中经常访问“uplevel local”,则可以将其地址缓存在本地/寄存器中。我没有实施这一点
  • 这是非常罕见的东西。
    • 支持这一编程语言很少(模块-3?模2?Pascal?没有C、C++、RISE、GO…)< /LI>
    • 在这些语言中,嵌套函数相当少见
    • 在这些嵌套函数中,访问高级局部变量的情况更为罕见
    • 而且很少对性能敏感
所以这并不重要


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

我完全理解动态和静态范围界定是什么。除了静态链接,我知道静态作用域还有哪些实现,但它仍然是使用最广泛的,请给出另一个原因,以便我可以使用另一种实现方式。静态链接必须针对每个子程序调用和返回进行修改。子程序调用所需的操作很复杂。虽然在编译时很容易确定正确的父作用域,但在调用时必须找到父作用域的最新激活记录实例。静态链接是使用最广泛的,但静态作用域与语言的作用域规则相对应。为什么静态范围界定是一件坏事?静态链的自底向上(从基本ARI到调用方ARI)堆栈遍历不是导致这个问题的原因吗?已经开发了一些静态链的替代方案,最显著的是一种使用称为显示的辅助数据结构的方法(静态链更好,除非显示可以保存在寄存器中)。然而,没有一种替代方法优于静态链法,静态链法仍然是使用最广泛的方法。此外,深度访问在动态范围界定方面也具有优势,在创建动态链接方面也有类似的作用。除此之外,我没有想法!!