运行时系统如何支持对已编译二进制文件的"GC"?
How can runtime systems support "GC" on compiled binaries?
所以基本上我只知道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,你是正确的。如果你是说它是通过智能指针或一个单独的过程完成的,那你就错了。
- Android 在编译二进制文件时重建静态库
- 编译多个C++文件.调用二进制文件以运行代码
- 为什么许多项目不提供预编译的二进制文件?
- 当我在支持 avx2 的机器上编译并在另一台仅支持 avx 的机器上运行二进制文件时会发生什么?
- 将文件信息(字符数组)嵌入到编译的二进制文件中
- 如何在Android中从本机编译的c ++二进制文件访问相机
- 如何使用 GLFW 预编译的二进制文件编译 Visual Studio 2019 发布版本
- 在 64 位 Linux armv8 计算机上编译 32 位二进制文件时遇到问题
- 编译代码时如何不制作二进制文件?
- 在 NDK 上编译两个带有 gradle 的项目,其中一个依赖于另一个的二进制文件
- 如何在不退出和失去断点的情况下重新加载重新编译的二进制文件
- 如何编译适用于较旧 Linux 发行版的二进制文件
- 将 tesseract 编译/捆绑为一个二进制文件
- 如何将所有依赖项和共享库编译为一个二进制文件
- 编译C++二进制文件是否存储原始源代码
- 包含预编译二进制文件与手动编译二进制文件不同的头文件的正确方法
- 如果我用较新版本的gcc编译二进制文件,我如何找到需要在客户机linux机器上安装的库?
- 使用Qt ARM预编译二进制文件进行交叉编译
- 是否有可能在Android中通过编译二进制文件生成本地缓冲区溢出来获得根访问权限?
- 运行时系统如何支持对已编译二进制文件的"GC"?