Haskell是一种托管语言吗?

Tom*_*myQ 12 haskell ghc

我是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中垃圾收集的以下理解之一是正确的:

  1. GHC将Haskell代码编译为本机代码.在编译处理中,垃圾收集例程会被添加到原始程序代码中吗?
  2. 有一个程序与Haskell程序一起运行以执行垃圾收集?

情况1是正确的:运行时系统代码在编译期间添加到程序代码中.

  • 特定于语言的运行时存在一段时间.如果我没记错的话,Turbo Pascal有一个.有人可能会说`libc`是"特定于C的运行时";-) (2认同)
  • @TommyQ这很好,但是C语言运行时不是虚拟机,Turbo Pascal语言运行时不是虚拟机,Haskell语言运行时不是虚拟机,... (2认同)