【问题标题】:Algorithm to have garbage collection when compiling to c编译为 c 时进行垃圾收集的算法
【发布时间】:2021-05-28 04:12:18
【问题描述】:

我需要某种算法来将垃圾收集添加到我的语言(正在编译为 c)中,并添加一条 free 语句或其他方式,这样它就不会出现内存泄漏。

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

编辑:例如,如果代码是

int *i = malloc(4);

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

int *i = malloc(4);

然后

free(i);

一旦 i 不再使用或退出堆栈帧 谢谢

【问题讨论】:

  • 你的语言实现是开源的吗? C代码在哪里?请给一些网址!
  • 不是大多数垃圾收集器的工作方式!
  • 你能解释一下垃圾收集器是如何工作的吗,我很难理解,而且对编译器设计还很陌生
  • 不,因为需要一整本书来解释 GC 的工作原理。我的回答提到了几本书,我没有时间再写一本关于垃圾收集的书。请随时向我发送一封电子邮件(书面英语、法语或俄语),其中包含多个段落(UTF-8 编码,HTML5 是可能的)basile@starynkevitch.net
  • ...或者你可以从 GoLang 运行时窃取代码。

标签: c algorithm garbage-collection compiler-construction


【解决方案1】:

您首先需要阅读garbage collection handbook

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

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

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

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

然后您可以document 并可能定义 macros 来实现您的 GC 约定。

请注意,malloc 可以被视为一种分配垃圾收集数据的缓慢方式。例如,阅读 Appel 的旧论文 Garbage Collection can be faster than Stack allocation(后来进行了辩论,但它确实提供了很好的直觉)。您可以考虑使用mmap(2) 获取大内存区域并以更快的方式在其中分配。然后你不会free 单个垃圾值(如果你采用复制GC 策略,使用Cheney's algorithm),但会同时munmap(2) 一个大内存区域。还要研究mallocGNU libcmusl libc中实现的C源代码。

请参阅我的 Bismon 项目作为带有 GC 的 C 代码(开源,适用于 Linux)示例。

还要查看 Ocaml 解释器和编译器的 C 代码。

或在SBCLChicken/Scheme 的C 运行时内。

或者在一些开源JVM的代码里面。

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

GNU emacs 编辑器包含一个垃圾收集器。 GCC 编译器还包含 one

Circular references 难以使用reference counting 方案处理。

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

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

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

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

还阅读最近提交给ACM SIGPLAN 会议的论文。其中有几个与garbage collection 相关。考虑稍后提交您自己的关于 GC 的论文。

预算几年的全职工作。

附言。作为介绍,请阅读 P.Wilson Uniprocessor Garbage Collection Techniques 的旧论文

【讨论】:

    【解决方案2】:

    体重不错,@Basile Starynkevitch 是对的;垃圾收集的主题是一个庞大而棘手的研究和科学领域,其中包含所有内容!在构建内存管理语言时,需要做很多理解。

    但是,如果您正在创建一种新语言(特别是如果它是个人和/或学习项目),那么您可能只是使用 something 而没有完全理解它的含义,目的是真正花大量时间确定未来最好的垃圾收集策略。

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-06-10
        • 1970-01-01
        • 1970-01-01
        • 2019-07-30
        相关资源
        最近更新 更多