我是Haskell的新手.总是让我感到困惑的一件事是,Haskell是否是一个托管(从MS借用的术语)语言(如Java)或编译到本机代码(如C)的模糊性?
GHC页面说明"GHC将Haskell代码直接编译为本机代码或使用LLVM作为后端".
在"编译为本机代码"的情况下,如果没有像JVM这样的东西,垃圾收集等功能是如何实现的?
/ 更新 /
非常感谢您的回答.从概念上讲,您可以帮助指出我对Haskell中垃圾收集的以下哪些理解是正确的:
GHC将Haskell代码编译为本机代码.在编译处理中,垃圾收集例程会被添加到原始程序代码中吗?
要么
有一个程序与Haskell程序一起运行以执行垃圾收集?
sep*_*p2k 19
据我所知,术语"托管语言"专门指的是一种针对.NET /公共语言运行时的语言.所以不,Haskell不是托管语言,也不是Java.
关于Haskell编译的内容:正如您引用的文档所述,GHC将Haskell编译为本机代码.它可以通过直接发出本机代码或首先发出LLVM代码,然后让LLVM将其编译为本机代码来实现.无论哪种方式,运行GHC的最终结果都是本机可执行文件.
除了GHC之外,还有Haskell的其他实现 - 最值得注意的是Hugs,它是一个纯粹的解释器,永远不会生成可执行文件(本机或其他).
如果没有像JVM这样的东西,垃圾收集等功能怎么可能?
与JVM一样可行:每次分配内存时,都会向垃圾收集器注册.然后垃圾收集器不时运行,遵循给定的垃圾收集算法的步骤.GHC编译的代码使用分代垃圾收集.
为了回应您的编辑:
GHC将Haskell代码编译为本机代码.在编译处理中,垃圾收集例程会被添加到原始程序代码中吗?
基本上.除了说"将垃圾收集程序添加到原始程序代码中"可能会描绘错误的图片.GC例程只是每个Haskell程序链接的库的一部分.编译后的代码只包含在适当位置调用这些例程.
基本上,每次调用malloc时都要调用GC的alloc函数.
只需查看任何用于C的GC库以及如何使用它:您需要做的就是#include库的头和链接库,并用GC库的alloc函数替换malloc的每个出现(并删除所有调用free)和bam,你的代码是垃圾收集.
有一个程序与Haskell程序一起运行以执行垃圾收集?
没有.
Dan*_*ner 13
Haskell是否是一种托管(从MS借用的术语)语言,如Java
GHC编译的程序包括垃圾收集器.(据我所知,Haskell的所有实现都包含垃圾收集,但这不是规范的一部分.)
或像C一样的编译到本机的代码?
GHC编译的程序被编译为本机代码.拥抱解释程序,不编译为本机代码.还有其他一些实现,据我所知,它们都编译为本机代码,但我单独列出这些实现,因为我对这个事实没有信心.
在"编译为本机代码"的情况下,如果没有像JVM这样的东西,垃圾收集等功能是如何实现的?
GHC编译的程序包括一个运行时系统,它提供一些基本功能,如M-to-N绿色线程,垃圾收集和IO管理器.从某种意义上说,这有点像"类似JVM",因为它提供了许多相同的功能,但它在实现上有很大的不同:所有架构都没有通用的字节码(因此没有"虚拟机") .
我对Haskell中垃圾收集的以下理解之一是正确的:
- GHC将Haskell代码编译为本机代码.在编译处理中,垃圾收集例程会被添加到原始程序代码中吗?
- 有一个程序与Haskell程序一起运行以执行垃圾收集?
情况1是正确的:运行时系统代码在编译期间添加到程序代码中.