开始时我遇到的第一个问题是防止算法在本地扩展函数(即用C编写的函数)中收集“对象”。根集包括解释器堆栈上的“对象”和符号表中的“对象”,这些我不应该有太多麻烦,然而,如果在C函数中创建一个容器“对象”,然后填充子“对象”,由于它实际上不在解释器堆栈上或绑定到符号,我该如何防止GC收集它们?
使GC实现变得更容易的事情:
- 我语言中的所有“对象”都是内置类型(例如,不是面向对象的)
- 解释器堆栈只是指向结构体的指针堆栈
- 符号表只是指向结构体的指针数组
f = open('words.txt', 'r');
lines = readlines(f);
close(f);
解释器(在解析、编译为字节码之后):
push
文件名, 打开模式- 调用
builtin_fopen
函数,它返回一个封装了FILE*
的结构体 - 将结果存储在符号
f
中 push
符号f
- 调用
builtin_flines
函数创建一个列表类型l
,然后使用C语言的fread
函数将文件的每一行作为字符串类型读取并附加到列表l
中 - 将结果存储在符号
lines
中,等等......
现在,如果在分配包含文件中一行的字符串时GC运行,则根集还没有任何对l
的引用,因此l
可能被回收。有什么更好的处理方式吗?