作者:唯爱-U澄_155 | 来源:互联网 | 2023-08-29 12:43
我需要某种算法将垃圾收集添加到我的语言(正在编译为 c)并添加一个 free 语句或其他方式,以便它不会有内存泄漏。
是的,我在编译为 C 时查看了垃圾收集,但我不明白答案,并希望得到关于如何做的更详细的答案。
编辑:例如,如果代码是
int *i = malloc(4);
int *i = malloc(4);
用我的语言,这应该编译为
进而
free(i);
一旦我不再使用或退出堆栈框架 谢谢
回答
您首先需要阅读垃圾收集手册。
您稍后需要用书面英语记录垃圾收集器的约定和不变量。是分代GC吗?它是多线程友好的吗?它是精确的还是保守的?
C.Queinnec Lisp In Small Pieces的书很有帮助。它描述了如何编写各种 Lisp 解释器,以及一些 Lisp 到 C 编译器的代码。一些章节与垃圾收集及其与生成的 C 代码的关系有关。
在龙书(约编译)对GC的一章。
A.Appel 的书Compiling with Continuations也很有帮助。
然后,您可以记录并可能定义实现您的 GC 约定的宏。
请注意,这malloc
可以被视为一种分配垃圾收集数据的缓慢方式。例如阅读 Appel 的旧论文Garbage Collection 可以比 Stack allocation 更快(后来讨论过,但它确实提供了一个很好的直觉)。您可以考虑使用mmap(2)获取大内存区域并以更快的方式在其中分配。然后你不会free
单独的垃圾值(如果你采用复制 GC 策略,使用切尼算法),但会munmap(2)一次大内存区域。还要研究malloc
在GNU libc或musl libc中实现的 C 源代码。
请参阅我的Bismon项目作为带有 GC 的 C 代码(开源,适用于 Linux)的示例。
另请查看Ocaml解释器和编译器的 C 代码。
或者在SBCL或Chicken/Scheme的 C 运行时内。
或者在一些开源JVM的代码中。
该中的bigloo项目是一个Lisp的C编译器。
在GNU Emacs的编辑器包含一个垃圾收集器。该GCC编译器还包含一个。
循环引用很难用引用计数方案处理。
还可以考虑使用Boehm 保守垃圾收集器开源库。
您的 GC 将特定于操作系统,并且可能特定于目标处理器。
所述RefPerSys项目(在C ++中,随着代的C ++在运行时代码)具有GC。
最后,valgrind实用程序(检测内存泄漏的工具)是开源的,可以认为包含一些 GC。
另请阅读最近提交给ACM SIGPLAN会议的论文。其中一些与垃圾收集有关。考虑稍后提交您自己的关于 GC 的论文。
预算几年的全职工作。
附注。作为介绍,请阅读 P.Wilson Uniprocessor Garbage Collection Techniques的旧论文