Haskell是一种托管语言吗?

Haskell是一种托管语言吗?,haskell,ghc,Haskell,Ghc,我在哈斯克尔是个十足的新手。有一件事总是让我感到困惑,那就是Haskell究竟是一种像Java这样的托管(借用自MS的术语)语言,还是一种像C这样的本地代码编译语言 GHC页面上说,“GHC将Haskell代码直接编译为本机代码或使用LLVM作为后端” 在“编译为本机代码”的情况下,如果没有JVM之类的东西,像垃圾收集这样的功能怎么可能实现呢 /更新/ 非常感谢你的回答。从概念上讲,请您指出我对Haskell中垃圾收集的以下哪一种理解是正确的: GHC将Haskell代码编译为本机代码。在编译过

我在哈斯克尔是个十足的新手。有一件事总是让我感到困惑,那就是Haskell究竟是一种像Java这样的托管(借用自MS的术语)语言,还是一种像C这样的本地代码编译语言

GHC页面上说,“GHC将Haskell代码直接编译为本机代码或使用LLVM作为后端”

在“编译为本机代码”的情况下,如果没有JVM之类的东西,像垃圾收集这样的功能怎么可能实现呢

/更新/

非常感谢你的回答。从概念上讲,请您指出我对Haskell中垃圾收集的以下哪一种理解是正确的:

GHC将Haskell代码编译为本机代码。在编译过程中,垃圾收集例程会添加到原始程序代码中吗

有一个程序在Haskell程序旁边运行以执行垃圾收集

Haskell是否是一种类似Java的托管(借用自MS的术语)语言

GHC编译的程序包括一个垃圾收集器。(据我所知,Haskell的所有实现都包括垃圾收集,但这不是规范的一部分。)

还是编译成像C这样的本机代码

GHC编译程序编译为本机代码。Hugs解释程序,不编译为本机代码。据我所知,还有其他几个实现都编译成本机代码,但我单独列出了这些实现,因为我对这一事实没有信心

在“编译为本机代码”的情况下,如果没有JVM之类的东西,像垃圾收集这样的功能怎么可能实现呢

GHC编译的程序包括一个运行时系统,该系统提供一些基本功能,如M-to-N绿色线程、垃圾收集和IO管理器。从某种意义上说,这有点像拥有“类似于JVM的东西”,因为它提供了许多相同的特性,但在实现上却大不相同:在所有体系结构中都没有通用字节码(因此也没有“虚拟机”)

我对Haskell中垃圾收集的以下哪一种理解是正确的:

  • GHC将Haskell代码编译为本机代码。在编译过程中,垃圾收集例程会添加到原始程序代码中吗
  • 有一个程序在Haskell程序旁边运行以执行垃圾收集

  • 案例1是正确的:运行时系统代码在编译期间添加到程序代码中。

    据我所知,术语“托管语言”特别指针对.NET/公共语言运行时的语言。因此,Haskell不是托管语言,Java也不是

    关于Haskell的编译目的:正如您引用的文档所述,GHC将Haskell编译为本机代码。它可以通过直接发出本机代码或首先发出LLVM代码,然后让LLVM将其编译为本机代码来实现。无论哪种方式,运行GHC的最终结果都是一个本机可执行文件

    除了GHC,还有Haskell的其他实现——最著名的是Hugs,它是一个从不生成可执行文件(本机或其他)的纯解释器

    没有JVM这样的东西,垃圾收集这样的功能怎么可能实现呢

    与JVM实现的方式相同:每次分配内存时,都会向垃圾收集器注册内存。然后,垃圾收集器会按照给定垃圾收集算法的步骤不时运行。GHC编译代码使用分代垃圾收集


    回应您的编辑:

    GHC将Haskell代码编译为本机代码。在编译过程中,垃圾收集例程会添加到原始程序代码中吗

    基本上。只是说“垃圾收集例程将添加到原始程序代码中”可能会描绘出错误的画面。GC例程只是每个Haskell程序所链接的库的一部分。编译后的代码只包含在适当位置对这些例程的调用

    基本上,每次调用malloc时都要调用GC的alloc函数

    只要看看C的任何GC库及其使用方法:您所需要做的就是#包含库的头和库的链接,并用GC库的alloc函数替换每次出现的malloc(并删除对
    free
    )和bam的所有调用,您的代码被垃圾收集

    有一个程序在Haskell程序旁边运行以执行垃圾收集


    不。

    对于您目前的处境,最好将(GHC)Haskell视为“管理的”,但这不是任何其他目标。当然,这是有道理的,但这是一个足够的解释,可以代替更多的Haskell经验。

    对于您来说,“托管语言”的定义特征是什么?您引用的短语“GHC将Haskell代码直接编译为本机代码或使用LLVM作为后端”非常清楚GHC的功能,因此我怀疑“模糊性”是指“托管语言”,而不是GHC的文档中

    在“编译为本机代码”的情况下,如果没有JVM之类的东西,像垃圾收集这样的功能怎么可能实现呢

    您认为“类似JVM的东西”是如何实现垃圾收集等功能的?JVM不是魔术,它只是一个程序,与其他程序一样。在某种程度上,为了让CPU执行它,您需要有本机代码,因此很明显,像垃圾收集这样的功能在本机代码中是可能的。

    托管语言是一个重载术语,因此这里有一个词的答案,然后是(我)想到的通常不同含义的一些细节:

    在CLR目标中作为管理 ,Haskell不编译为Microsoft CLI的IL。
    嗯,我读到有一些解决方案可以做到这一点,但在我看来,没有。。CLR是