编译为 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 实现。
我需要某种算法来将垃圾收集添加到我的语言(正在编译为 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 实现。