【发布时间】:2013-03-29 21:01:47
【问题描述】:
我正在为一种玩具过程语言开发一个爱好编译器/解释器,并且我已经实现了我打算探索的大部分功能,除了一个好的垃圾收集算法(类似于this guy)。我已经阅读了很多关于各种算法的内容,并且对如何实现它们有了大致的了解。我的语言运行时的早期迭代使用了引用计数,但我放弃了它以学习更高级的东西,所以我现在正在考虑使用标记和复制压缩算法。
我开始的第一个问题是阻止算法在本机扩展函数(即用 C 编写的函数)中收集“对象”。根集由解释器堆栈上的“对象”和符号表中的“对象”组成,我不应该对这些有太多麻烦,但是,如果在 C 函数中创建容器“对象”,然后填充子“对象”,我如何防止 GC 收集它们,因为它实际上不在解释器堆栈上或绑定到符号?
使实施 GC 更容易的事情:
- 我的语言中的所有“对象”都是内置类型(例如,不是面向对象的)
- 解释器堆栈只是一个指向结构的指针堆栈
- 符号表只是指向结构的指针数组
用户代码:
f = open('words.txt', 'r');
lines = readlines(f);
close(f);
解释器(解析后,编译成字节码...):
-
push文件名,打开模式 - 调用
builtin_fopen,它返回一个包装FILE*的结构 - 将结果存储在符号
f - 推符号
f - 调用
builtin_flines创建一个列表类型l,然后使用Cfread读取每一行 将文件作为字符串类型,将其附加到列表l - 将结果存储在符号
lines中,以此类推....
现在,如果 GC 在分配文件中包含一行的字符串之一时运行,则根集还没有对 l 的任何引用,因此它应该被收集。
有关如何更好地处理此问题的任何想法?
【问题讨论】:
-
"mark and copy" -- 大概你的意思是mark and sweep。解释器分配的所有对象都应该在它们自己的堆中,与扩展函数使用的对象分开。如果你想 GC 扩展函数内存,你正在寻找类似 Boehm 保守 GC 的东西。
-
我的意思是 mark and compact 复制可访问对象。这个想法是扩展函数分配的对象旨在被放入解释器堆栈和/或绑定到符号,因此应该在以后进行垃圾收集。
-
你可能会发现我感兴趣的问题here。
-
我认为我的解决方案是 Chris Dodd,n.m. 和 Derek Pressnall 的答案的结合。 n.m. 将特殊分配保持在堆顶指针顶部上方的方法很有用,但不能解决本机函数执行过程中的垃圾收集问题。 Chris Dodd 为本地函数创建运行时接口以获取对象句柄的方法很棒,但 Derek Pressnall 实际上解释了如何做到这一点,方法是将对象指针的引用传递给 mutator。这个解释得到我的50分。
标签: c garbage-collection interpreter