什么阻止了高效的Haskell虚拟机(例如JVM)的出现?

26
我一直在思考,除了开发工作量之外,是什么阻碍了像JVM或PyPy这样高效虚拟机的Haskell实现?是语言结构吗?我认为那些难以高效解释的语言(比如Python,非常动态),已经有不错的虚拟机了。
此外,如果没有任何障碍,STG是否是一个好的“字节码”目标,因为所有优化都是在Core上完成的?
是否有任何讨论这个话题的文章或博客文章?
编辑:
- 我知道HaLVM,但我不认为它是我想要的。 - 我也知道runhaskell,但它根本不有效率。

1
它们不是...JVM是一种通用虚拟机,理论上可以将任何语言编译到它上面。可能不是最佳性能选择,但它可以工作。 - Karoly Horvath
2
  1. GHC 可以做到。
  2. 你不需要 JVM 尾部调用优化,你可以生成已经优化过的代码。
- Karoly Horvath
5
既然Haskell已经编译成相当高效的本地代码,为什么还要创建一个虚拟机呢? - Paulo Pinto
7
@yi_H,将函数式语言编译为不支持proper tail calls的语言或虚拟机有两种主要方法:(1)作为一个大函数,或者(2)使用trampolines。但在JVM上,这两种方法都不是很可行,因为闭包、thunks和一般的分配成本等问题会造成阻碍。尽管很多人热衷于使用JVM作为通用虚拟机,但事实并非如此。 - Andreas Rossberg
2
@yi_H:记住,尾递归也适用于相互递归的函数。在这种情况下,将优化转换为迭代循环更加困难。 - hugomg
显示剩余20条评论
6个回答

22

有什么阻止高效 Haskell 虚拟机的因素吗?

没有 - 已经有一个,Daan Leijen 的 LVM。它足够高效,以至于被用于乌得勒支大学的 Haskell "教学语言" Helium 的运行时系统。

尽管如此,我不知道它是否仍在使用,所以对于问题“有什么阻止高效 Haskell 虚拟机的因素吗?”可以回答为人力、持续投资等。当 Haskell 已经有一个好的编译器时,一个好的虚拟机就成为奢侈品,正如 Paulo Pinto 已经指出的那样。


6
我不知道这里是否有任何技术限制。有一种名为Frege的语言,与Haskell在语义上非常接近,它针对JVM。因此,只是迄今为止没有人考虑将Haskell编译成JVM而已。事实上,作为一个怀疑JVM的人,我想知道那会带来什么。如果只是中间语言的可移植性,我更愿意在LLVM或预构建二进制文件方面工作。

1
一直以来,有些人尝试将 Haskell 应用于 JVM(例如搜索 LambdaVM),但似乎都陷入了困境。 - Ingo
据我所知,Frege实际上编译成Java代码,然后再编译成JVM字节码。Frege和Haskell之间的一些根本区别在于原始类型:Frege使用Java的String、int等类型,而Haskell则有不同的规定。 - Dan Burton
1
@Dan - String在Haskell中并不是一个原始类型,对吧?至于int,Haskell标准没有规定如何实现int,我敢打赌Haskell使用C ints来实现。 - Ingo

5

UHC拥有JavaScript后端,当然可以在浏览器的JavaScript引擎上运行。我的意思是我没有看到任何阻止Haskell针对不同后端的东西。事实上,我认为UHC的设计就是为了方便针对不同后端进行目标定位。


5
我无法发表评论,这可能比本地代码编译器更具反虚拟机特性,但是楼主可能会对Reduceron感兴趣。请参考Reduceron

1
没有任何东西阻止Haskell拥有一个虚拟机。Haskell在JVM上运行得非常好,甚至可以比GHC更快,在生成的代码命中JIT编译器的热点时,经过JIT预热后更快。请参见Eta,这是一个将完整的GHC 7.10.3 Haskell带到JVM上并具有类型安全Java互操作性的项目。它只需要大量耐心和时间来开发。

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接