Memory management 基于区域的内存管理 我设计了一种高级语言,我希望它具有C++的速度(它将使用LLVM),但它是安全和高级别的,比如C语言。垃圾收集速度慢,新建/删除不安全。我决定尝试使用“基于区域的内存管理”(web上有一些关于它的文章,主要是针对函数式语言的)。使用它的唯一“有用”语言是Cyclone,但它也有GC。基本上,对象在词法堆栈上分配,并在块关闭时释放。对象只能引用同一区域或更高区域中的其他对象,以防止挂起引用。为了使这更灵活,我添加了可以在堆栈上下移动并通过循环保留的并行区域。在大多数情况下,类型系统将能够验证分配,但在某些地方需要低开销的运行时检查

Memory management 基于区域的内存管理 我设计了一种高级语言,我希望它具有C++的速度(它将使用LLVM),但它是安全和高级别的,比如C语言。垃圾收集速度慢,新建/删除不安全。我决定尝试使用“基于区域的内存管理”(web上有一些关于它的文章,主要是针对函数式语言的)。使用它的唯一“有用”语言是Cyclone,但它也有GC。基本上,对象在词法堆栈上分配,并在块关闭时释放。对象只能引用同一区域或更高区域中的其他对象,以防止挂起引用。为了使这更灵活,我添加了可以在堆栈上下移动并通过循环保留的并行区域。在大多数情况下,类型系统将能够验证分配,但在某些地方需要低开销的运行时检查,memory-management,language-design,Memory Management,Language Design,例: 这看起来实用吗?我是否需要添加非词汇范围的引用计数区域?我是否需要添加可以引用任何对象的弱变量,但要检查区域删除?你能想出任何算法,这些算法很难在这个系统中使用或者会泄漏吗?它将如何返回一个动态创建的对象?谁会“拥有”它并负责释放记忆 重新计数或GC非常常见,因为它们几乎总是最佳选择。分代垃圾收集器可能非常有效。如果我使用基于区域的内存管理实现一种语言,我可能会阅读。也就是说,我已经有一段时间没有研究这些东西了,如果我知道最新的技术是什么的话,我相信最新的技术已经在进步。你应该去研究苹果的

例:


这看起来实用吗?我是否需要添加非词汇范围的引用计数区域?我是否需要添加可以引用任何对象的弱变量,但要检查区域删除?你能想出任何算法,这些算法很难在这个系统中使用或者会泄漏吗?

它将如何返回一个动态创建的对象?谁会“拥有”它并负责释放记忆


重新计数或GC非常常见,因为它们几乎总是最佳选择。分代垃圾收集器可能非常有效。

如果我使用基于区域的内存管理实现一种语言,我可能会阅读。也就是说,我已经有一段时间没有研究这些东西了,如果我知道最新的技术是什么的话,我相信最新的技术已经在进步。

你应该去研究苹果的内存管理。它有发布池和区域,这听起来确实很像你在这里做的事情


我不会对“GC很慢”这句话发表评论,

我会劝阻您不要尝试。问题是,为了确保地区安全,你需要一个非常复杂的打字系统——我相信你已经看过托夫特和塔尔平的论文,你对其中的复杂性有了概念。即使您确实成功地使区域工作,您的程序也很有可能需要一个生命周期为程序生命周期的区域,并且该区域至少必须被垃圾收集。(这就是为什么Cyclone具有区域和GC。)

因为你才刚刚开始,我鼓励你去收集垃圾。现代垃圾收集器可以非常快速地制造出来,而无需花费大量精力。主要问题是从连续的可用空间进行分配,以便分配速度更快。将AMD64或其他具有备用寄存器的机器作为目标有助于您使用硬件寄存器作为分配指针

有很多好的想法可以适应;最容易实现的一个是基于页面的收集器,如Joel Bartlett的主要复制收集器,其思想是只从完全空的页面分配


如果您想研究现有的垃圾收集器,它有一个相当复杂的增量垃圾收集器(因此没有可见的暂停时间),并且实现只有700行。它的速度足够快,可以在很多性能很重要的游戏中使用。

您可以从Tofte和Talpin关于基于区域的内存管理的论文开始。

要返回分配的对象,调用者必须传递一个区域,以便将其作为参数进行分配。然后调用方将“拥有”它,当该区域关闭时,它将被释放。MLton还进行区域推断,以避免分配GC管理的内存。诺曼·拉姆齐的回复中已经引用了托夫特和塔尔平的引用。。。很好的尝试;-)这篇帖子发布后,情况有变化吗。真的,在语言的语义中添加区域有多难?也就是说,每个值级别的术语不仅有一个类型,还有一个区域。然后,将值传输到不同的区域将需要显式的复制或移动操作,该操作将保留类型,但不保留区域。使用相同的底层参数多态机制,函数可以是类型多态和区域多态。对于我来说,一种与C语言速度完全一样(不是几乎一样)且没有垃圾收集暂停的类似ML的语言的想法听起来非常诱人。。。
region(A) {
    Foo@A x=new Foo(); //x is deleted when this region closes.
    region(B,C) while(x.Y) {
        Bar@B n=new Bar();
        n.D=x; //OK, n is in lower region than x.
        //x.D=n; would cause error: x is in higher region than n.
        n.DoSomething();
        Bar@C m=new Bar();
        //m.D=n; would cause error: m and n are parallel.
        if(m.Y)
            retain(C); //On the next iteration, m is retained.
    }
}