运行时系统如何支持对已编译二进制文件的"GC"?

How can runtime systems support "GC" on compiled binaries?

本文关键字:编译 二进制文件 GC 系统 何支持 支持 运行时      更新时间:2023-10-16

所以基本上我只知道GC的一些基本概念:(

我是函数式编程语言的新手,当我研究Haskell的运行时系统RTS时,我发现RTS支持从Haskell编译的二进制文件的GC。

所以我对这部分感到困惑,是否有一个单独的进程由RTS创建,可以对Haskell二进制文件做GC的东西?

更重要的是,如果有的话,C/c++有任何GC实现吗?(假设程序员只使用某种"智能指针"来使用内存,他们不需要关心内存管理,GC进程会照顾它)…?据我所知,.net似乎可以以这种方式工作……我说的对吗?

是否有一个由RTS创建的独立进程可以对Haskell二进制文件进行GC ?

一般来说,

垃圾收集不需要单独的进程(例如,"后台"进程)。进程),尽管一些虚拟机垃圾收集器可能会这样做(我不知道)。

把垃圾收集器看作与堆分配器合并。每当您请求分配一些内存时,都要调用堆来完成此任务(在找到要分配的块之前可能会挂起一段时间)。对于垃圾收集器,只需要一个额外的步骤,垃圾收集器在分配内存之前首先检查它是否应该进行一些收集。

垃圾收集的核心是内存的插装(或注释),以便能够推断哪些内存块仍然被引用/可访问。这种插装仅仅意味着在某些关键时刻进行额外的操作,比如分配、回收(如果有明确的机制的话)和设置/获取指针值(通常是"隐藏的")。底层的垃圾收集语言,而不是像C/c++这样有"原始"的语言。指针)。

更重要的是,如果有,是否有C/c++的GC实现?

是的,C/c++有各种各样的GC实现。它们不是很流行,可能是因为C足够低级,事情通常是可管理的,而c++有RAII(和智能指针),几乎完全消除了对GC的需要。

但是如果你真的想要C/c++的GC,你当然可以得到它。有非确定性GC库(类似于JVM或。net)和确定性GC库(类似于PHP或Python)。

据我所知,.net似乎可以这样工作…我说的对吗?

是的,. net像Java一样,是垃圾收集的。据我所知,从GC用户的角度来看,. net与JVM差不多。

所以我对这部分感到困惑,是否有一个单独的进程由RTS创建,可以对Haskell二进制文件做GC的东西?

。为什么会有呢?您不需要单独的进程来执行GC。Java JVM不需要单独的进程。你似乎有些困惑。你所需要的只是运行库中的一些代码。

更重要的是,如果有,是否有C/c++的GC实现?

是的。

据我所知,.net似乎可以这样工作…我说的对吗?

如果你的意思是。net有GC,你是正确的。如果你是说它是通过智能指针或一个单独的过程完成的,那你就错了。

相关文章: