LLVM与C--; 从根本上说,LLVM对Haskell来说不比C--好吗?

dr.*_*ddn 26 haskell llvm clang ghc c-minus-minus

我一直很高兴LLVM足够低,无法对任何系统进行建模,并认为苹果正在采用它; 但苹果并没有特别支持Haskell ;

而且,有些人认为Haskell会更好用C--:

那些LLVM的人没有解决零开销垃圾收集的问题并不太令人惊讶.在保持数据模型不可知的同时解决这个问题是计算机科学中一个悬而未决的问题.

- LHC不会使用LLVM.

Edw*_*ang 27

在使用操作C--的新代码生成后端工作了一点之后,我可以说有很多原因可以解释为什么C--比LLVM更好,以及为什么它们并不是真的完全相同.

  1. C--在比LLVM更高的抽象级别上运行; 例如,我们可以在C--中生成代码,其中堆栈指针是完全隐式的,并且只在稍后的编译过程中显示它.这使得应用某些类型的优化变得更加容易,因为更高级别的表示允许更少的不变量进行代码运动.

  2. 虽然我们正在积极寻求解决这个问题,但LLVM遇到了与via-C后端相同的问题:它需要我们创建proc点.什么是proc点?本质上,因为Haskell不使用经典的调用/ ret调用约定,所以每当我们将道德等效于子过程调用时,我们需要将一个continuation推入堆栈然后跳转到子过程.这个延续通常是一个本地标签,但LLVM要求它是一个实际的过程,所以我们需要将函数分解成更小的部分(每个部分称为一个过程点).这对于在程序级别上工作的优化来说是个坏消息.

  3. C--和LLVM采用不同的方法来优化数据流.LLVM使用传统的SSA样式和phi节点:C--使用一个名为Hoopl的酷框架,它不需要你维护SSA不变量.我可以确认:Hoopl中的编程优化非常有趣,尽管某些类型的优化(一次性使用的变量的内联)在这个数据流设置中并不是最自然的.


Don*_*art 22

那么,UNSW有一个项目将GHC Core转换为LLVM

请记住:10年前还不清楚LLVM是否会构建C--无法实现的所有基础架构.不幸的是,LLVM具有可移植的优化代码的基础结构,但不具备高级语言支持的基础结构,C - ha(s)d.

一个有趣的项目是 C-- 定位LLVM ......


更新,从GHC 7开始,GHC使用LLVM进行代码生成.使用-fllvm标志.这改善了一些低级程序的数值性能.否则,性能类似于旧的GCC后端.


Chu*_*uck 12

GHC现在正式拥有一个LLVM后端,结果证明它与GCC和本地代码生成竞争,实际上在某些情况下更快.LLVM项目接受了 David Terei在LLVM上为Haskell创建的新调用约定,令人惊讶的是,这两个项目实际上正在合作.