“托管语言”是一个超载的术语,所以这里是一个单词的答案,然后是一些关于(我)想到的通常不同含义的细节:
像在 CLR 目标中一样管理
不,Haskell 不会编译到 Microsoft CLI 的 IL。
好吧,我读到有一些解决方案可以做到这一点,但是 imo,不要.. CLR 不是为 FP 构建的,并且会严重缺乏优化,可能会产生研究语言性能。如果我个人真的很想以 CLR 为目标,我会使用 F#——它不是一种函数式语言,但它很接近。
注意这是术语“托管语言”的最准确和实际含义。接下来的意思是,好吧,错误的,但不幸的是,很常见。
像自动垃圾收集一样管理
是的,这几乎是必须的。我的意思是,超出规范:如果我们必须进行垃圾收集,它将破坏使我们在高海拔地区工作的功能主题,这是我们心爱的家园。
它还将强制执行杂质和内存模型。
管理为编译为由 VM 运行的字节码
没有(通常)。
这取决于你的后端:今天不仅我们有不同的 Haskell 编译器,一些编译器也有不同的后端——甚至还有 JavaScript 的后端!
因此,如果您确实想以 VM 为目标,您可以使用现有的/为其创建后端。但是 Haskell不需要它。因此,就像您可以编译为原生原始金属二进制文件一样,您也可以编译为其他任何内容。
与 C# 1、VB.NET 等 CLR 语言相比,与 Java 等相比,您不必针对JVM、CLR、Mono 等,因为 Haskell 根本不需要VM。
GHC 就是一个很好的例子。当您在 GHC 中编译时,它不会将您直接编译为二进制,而是编译为一种称为 Core 的中间语言,然后从 Core 到 Core 优化一段时间,然后再转到另一种称为 STG 的语言,然后才继续编写代码一代(如果你告诉它,它可以停在那里)。2现在,您还可以使用它编译为 LLVM 字节码(经过一些很棒的优化)。借助 LLVM 后端,GHC 可以生成速度快得多的程序。有关它和 GHC 后端的更多信息,请访问此处。
下图说明了 GHC 编译管道,您可以在此处找到有关各个阶段的更多信息。
看到三个不同目标底部的叉子了吗?这些是我所指的后端。
1一个未来的例外和一个有趣的事实:微软目前正在开发原生 .NET!巧妙地命名为:Microsoft .NET Native。