gpt4 book ai didi

garbage-collection - 如何在没有 gc 的情况下实现闭包?

转载 作者:行者123 更新时间:2023-12-04 00:00:39 24 4
gpt4 key购买 nike

我正在设计一种语言。首先,我想决定生成什么代码。该语言将具有类似于 javascript 的词法闭包和基于原型(prototype)的继承。但我不是 gc 的粉丝,并尽量避免。那么问题来了:有没有一种优雅的方式来实现闭包,而无需在堆上分配堆栈帧并将其留给垃圾收集器?

我的第一个想法:

  • 使用引用计数和垃圾收集循环(我不太喜欢这个)
  • 使用意大利面条堆栈(看起来非常低效)
  • 将闭包的形成限制在某些上下文中,这样我就可以摆脱返回地址堆栈和本地堆栈。

  • 我不会使用高级语言或遵循任何调用约定,所以我可以随心所欲地粉碎堆栈。

    (编辑:我知道引用计数是垃圾收集的一种形式,但我在其更常见的含义中使用 gc)

    最佳答案

    如果您可以通过不使用 GC 来解释您试图避免的事情,这将是一个更好的问题。我相信您知道,大多数提供词法闭包的语言都将它们分配在堆上,并允许它们在创建它们的激活记录中保留对变量绑定(bind)的引用。

    我知道的唯一替代方法是 gcc用于嵌套函数:为函数创建一个蹦床并将其分配到堆栈上。但正如 gcc 手册所说:

    If you try to call the nested function through its address after the containing function has exited, all hell will break loose. If you try to call it after a containing scope level has exited, and if it refers to some of the variables that are no longer in scope, you may be lucky, but it's not wise to take the risk. If, however, the nested function does not refer to anything that has gone out of scope, you should be safe.



    简短的版本是,您有三个主要选择:
  • 在堆栈上分配闭包,并且在包含函数退出后不允许使用它们。
  • 在堆上分配闭包,并使用某种垃圾收集。
  • 做原创研究,可能从 ML、Cyclone 等所拥有的区域开始。
  • 关于garbage-collection - 如何在没有 gc 的情况下实现闭包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/89266/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com