28

私はLLVMがどんなシステムでもモデル化できるほど低いことに興奮しており、Appleがそれを採用していることを約束していると考えました。しかし、AppleはHaskellを特にサポートしていません。

そして、HaskellはCでもっとうまくいくだろうと考える人もいます--

LLVMのユーザーがオーバーヘッドゼロのガベージコレクションの問題を解決していないことは、それほど驚くべきことではありません。データモデルにとらわれずにこれを解決することは、コンピュータサイエンスの未解決の問題です。

--LHCはLLVMを使用しません。

4

4 に答える 4

29

C--を操作する新しいコード生成バックエンドを少し使ってみましたが、C--がLLVMよりも優れている理由はいくつかあり、実際にはまったく同じではない理由もいくつかあります。

  1. C--LLVMよりも高いレベルの抽象化で動作します。たとえば、Cでコードを生成できます。スタックポインタは完全に暗黙的であり、コンパイルプロセスの後半でのみ明示されます。これにより、特定のタイプの最適化の適用がはるかに簡単になります。これは、より高いレベルの表現により、より少ない不変条件でより多くのコードモーションが可能になるためです。

  2. これを積極的に修正しようとしていますが、LLVMには、via-Cバックエンドと同じ問題があります。procポイントを作成する必要があります。procポイントとは何ですか?基本的に、Haskellは従来の呼び出し/ ret呼び出し規約を使用しないため、道徳的にサブプロシージャ呼び出しと同等のものを作成するときは常に、スタックに継続をプッシュしてからサブプロシージャにジャンプする必要があります。この継続は通常ローカルラベルですが、LLVMでは実際のプロシージャである必要があるため、関数を小さな部分に分割する必要があります(各部分はprocポイントと呼ばれます)。これは、プロシージャレベルで機能する最適化にとっては悪いニュースです。

  3. C--とLLVMは、データフローの最適化に対して異なるアプローチを採用しています。LLVMは、ファイノードで従来のSSAスタイルを使用します。C--SSA不変を維持する必要のない、Hooplと呼ばれるクールなフレームワークを使用します。確認できます。Hooplでの最適化のプログラミングはとても楽しいですが、特定の種類の最適化(1回限り使用される変数のインライン化が思い浮かびます)は、このデータフロー設定で最も自然ではありません。

于 2011-04-17T08:30:45.060 に答える
22

さて、UNSWにはGHCコアをLLVMに変換するプロジェクトがあります

覚えておいてください。10年前、LLVMがすべてのインフラストラクチャを構築することは明確ではありませんでした。C--はできませんでした。残念ながら、LLVMには移植性のある最適化されたコードのインフラストラクチャがありますが、C--ha(s)dという優れた高級言語サポートのインフラストラクチャはありません。

興味深いプロジェクトは、CからLLVMをターゲットにすることです--...


更新、GHC 7以降、GHCはコード生成にLLVMを使用します-fllvmフラグを使用します。これにより、一部の低レベルプログラムの数値パフォーマンスが向上しました。それ以外の点では、パフォーマンスは古いGCCバックエンドと同様です。

于 2009-05-03T00:54:57.093 に答える
14

GHCには現在正式にLLVMバックエンドがあり、GCCおよびnative-codegenと競合し、場合によっては実際には高速であることがわかりました。また、LLVMプロジェクトは、David TereiがLLVMでHaskell用に作成した新しい呼び出し規約を受け入れたため、驚くべきことに、2つのプロジェクトは実際に連携しています。

于 2010-03-30T17:42:04.737 に答える
1

実際の問題の1つは、LLVMがはるかに動くターゲットであるということです。

GHCは、LLVMの複数のバージョンをサポートしようとして問題が発生しました。これについては、ghc-devメーリングリストで活発な議論が行われています。

ところで、現在ghcのllvmバックエンドは、Haskellがcmm言語に変換された後です(これはほとんどCであると信じています-STG言語の特定のレジスタで拡張されています)。コンパイルを遅くする冗長な最適化が行われています。

また、歴史的に、そして現在AFAIKでは、LLVMプロジェクトはポータブルプラットフォームの提供を優先しておらず、一部の開発者は、それがコンパイラIRであり、ポータブルアセンブリ言語の形式ではないことを明確に述べています。

ある意図されたターゲットに対して作成したLLVMIRは、別の意図されたターゲットに対してはまったく役に立たない場合があります。比較のために、C--Webサイトは実際にはそれをポータブルアセンブリと呼んでいます。「1つのポータブルアセンブリ言語があればもっと幸せになるでしょう...」は彼らのウェブサイトからの引用です。そのWebサイトには、ガベージコレクションと例外処理の移植可能な実装を容易にするランタイムインターフェイスについても言及されています。

したがって、C--は、CILおよびJavaバイトコードともう少し共通点があるすべてのフロントエンドのポータブル共通グラウンドと考えることができ、LLVM IRは、ローの統合を容易にするすべてのバックエンドの表現力豊かな共通グラウンドと考えることができます。複数のターゲットに共通のレベルの最適化。LLVM IRは、LLVMプロジェクトがこれらの低レベルの最適化の多くを実装するという追加のボーナスも提供します。そうは言っても、いくつかの点で、LLVM IRは実際にはCよりも高いレベルと見なすことができます。たとえば、LLVM IRにはさまざまなタイプがあり、Cの場合と同様にすべてがビットベクトルです。

于 2014-12-02T05:48:00.147 に答える