4

我正在设计一种高级语言,我希望它具有 C++ 的速度(它将使用 LLVM),但要像 C# 一样安全和高级。垃圾回收很慢,new/delete 不安全。我决定尝试使用“基于区域的内存管理”(网上有几篇关于它的论文,主要是针对函数式语言)。唯一使用它的“有用”语言是 Cyclone,但它也有 GC。基本上,对象是在词法堆栈上分配的,并在块关闭时被释放。对象只能引用同一区域或更高区域中的其他对象,以防止悬空引用。为了使这更灵活,我添加了可以在堆栈上上下移动的并行区域,并通过循环保留。在大多数情况下,类型系统将能够验证分配,

前任:

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.
    }
}

这看起来实用吗?我需要添加非词法范围的引用计数区域吗?我是否需要添加可以引用任何对象但检查区域删除的弱变量?您能想到任何算法很难与该系统一起使用或会泄漏吗?

4

5 回答 5

14

我会劝阻你不要尝试地区。问题是,为了保证区域安全,您需要一个非常复杂的类型系统——我相信您已经看过 Tofte 和 Talpin 的论文,并且您对所涉及的复杂性有所了解。即使您确实使区域成功运行,您的程序也很可能需要一个其生命周期就是程序生命周期的区域——并且该区域至少必须被垃圾收集。(这就是 Cyclone 有区域GC 的原因。)

由于您才刚刚开始,我鼓励您使用垃圾收集。现代垃圾收集器可以在不费力气的情况下变得非常快。主要问题是从连续的可用空间进行分配,以便快速分配。它有助于以 AMD64 或其他具有备用寄存器的机器为目标,这样您就可以使用硬件寄存器作为分配指针。

有很多好主意可以适应;最容易实现的一种是基于页面的收集器,例如 Joel Bartlett 的主要复制收集器,其想法是您仅从完全空的页面进行分配。

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

于 2009-03-28T01:07:13.887 回答
5

如果我正在实现一种具有基于区域的内存管理的语言,我可能会阅读A language-independent framework for region inference。也就是说,我已经有一段时间没有研究这些东西了,如果我知道最先进的技术是什么的话,我相信最先进的技术已经发展了。

于 2009-03-28T01:00:07.133 回答
0

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

我不会评论“GC很慢”的评论,

于 2009-03-28T01:00:41.250 回答
0

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

于 2012-02-17T19:35:03.263 回答
-1

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

Refcounting 或 GC 如此普遍,因为它们几乎总是最好的选择。分代垃圾收集器可能非常有效。

于 2009-03-28T00:30:49.497 回答