编译为 c 时进行垃圾收集的算法

Algorithm to have garbage collection when compiling to c

我需要某种算法来将垃圾收集添加到我的语言(正在编译为 c)中,并添加一个自由语句或其他一些方式,以便它不会有内存泄漏。

是的,我看了Garbage collection when compiling to C,但我不明白答案,希望能得到更详细的答案。

编辑:例如如果代码是

int *i = malloc(4);

在我的语言中,这应该被编译为

int *i = malloc(4);

然后

free(i);

一旦 i 不再使用或离开栈帧 谢谢

您首先需要阅读 garbage collection handbook

您稍后需要用书面英语记录垃圾收集器的约定和不变量。是分代GC吗?它是多线程友好的吗?是精确还是保守?

C.Queinnec Lisp In Small Pieces 的书很有帮助。它描述了如何编写各种 Lisp 解释器和一些 Lisp 到 C 的编译器。一些章节与垃圾收集及其与生成的 C 代码的关系有关。

Dragon book(关于编译)有一章是关于GC的。

A.Appel 的书 Compiling with Continuations 也很有帮助。

然后您可以 文档 并可能定义 实现您的 GC 约定。

请注意,malloc 可被视为分配垃圾收集数据的一种缓慢方式。例如阅读 Appel 的旧论文 Garbage Collection can be faster than Stack allocation (it was debated later, but it does give a good intuition). You could consider fetching large memory zones with mmap(2) and allocating inside them in some faster way. Then you won't free individual garbage values (if you adopt a copying GC strategy, using Cheney's algorithm), but will munmap(2) a large memory zone at once. Study also the C source code of malloc implementation inside GNU libc or musl libc.

将我的 Bismon 项目作为使用 GC 的 C 代码示例(开源,适用于 Linux)。

另请查看 Ocaml 解释器和编译器的 C 代码。

或在 SBCL or of Chicken/Scheme.

的 C 运行时内

或者一些开源代码里面JVM.

Bigloo 项目是一个 Lisp 到 C 的编译器。

GNU emacs editor contains a garbage collector. The GCC compiler also contains one.

Circular references are difficult to handle with reference counting 方案。

也考虑使用 Boehm conservative garbage collector 开源库。

您的 GC 将特定于操作系统,并且可能特定于目标处理器。

RefPerSys 项目(在 C++ 中,在运行时生成 C++ 代码)有一个 GC。

最后,valgrind 实用程序(一种检测内存泄漏的工具)是开源的,可以认为它包含一些 GC。

另请阅读最近提交给 ACM SIGPLAN conferences. Several of them are related to garbage collection 的论文。考虑稍后提交您自己关于 GC 的论文。

预算几年的全职工作。

PS。作为介绍,请阅读 P.Wilson Uniprocessor Garbage Collection Techniques

的旧论文

重量不错,@Basile Starynkevitch是对的;垃圾收集的主题是一个庞大而棘手的研究和科学领域,涉及所有方面!在构造内存管理语言时,需要做的理解很多。

但是,如果您要创建一门新语言(尤其是个人 and/or 学习项目,您可能只是简单地使用 某些东西 而没有完全理解其含义),目的是真正花大量时间确定未来最好的垃圾收集策略。

正如计算机科学中经常出现的情况(时间与内存)一样,不同的垃圾收集策略会涉及一些痛苦和糟糕的情况,您需要了解、记录并尽量减少这些情况。

供您实现的简单垃圾收集器可能是基于 reference counter

您似乎对基于区域分析的静态内存分配感兴趣。

您可以查看此方法的 MLKit 实现。