2009-05-03 7 views
24

私はLLVMがどんなシステムでもモデル化するのに十分に低いことに興奮しており、 とAppleがそれを採用していたことを約束していました。しかし、その後、Appleは特にHaskellをサポートしていません。LLVM vs. C--;どのようにLLVMは基本的にハスケルにとってCよりも良くないでしょうか?

そして、いくつかは、HaskellはC--とオフの方が良いだろうと思う:

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

からLHC won't be using LLVM.

+10

あなたはブログを入手する必要があります –

+1

そのような長い引用符の場合は、引用オプションを使用する必要があります。 – Unknown

+0

編集はブログからペーストされたことを示すようです。 – ShreevatsaR

答えて

21

まあ、LLVMにGHCコアを翻訳するUNSWでのプロジェクトがあり

覚えている:それはLLVMは、すべてのインフラストラクチャCを構築することを10年前に明確ではありませんでした - できなかった。残念なことに、LLVMにはポータブルで最適化されたコード用のインフラストラクチャがありますが、高レベルの言語サポートのためのインフラストラクチャではなく、C-- ha(s)です。

興味深いプロジェクトが... C--からLLVM をターゲットにするだろうGHC 7、GHC uses LLVM for code generationのよう


更新、。 -fllvmフラグを使用します。これにより、いくつかの低レベルプログラムの数値パフォーマンスが向上しました。それ以外の場合、パフォーマンスは古いGCCバックエンドと似ています。

+0

。素晴らしい答え。 私は探していた盲点でした。 。 llvm'ersは並行性サポートの欠如に似た応答を持っていました: これはアドオンライブラリのものです。 。 c--はllvmに移植できます。 llvmのgcは単純に使用されません。 –

+1

リンクはもはや動作していません:(最後の更新以来状況が全く変わっていませんか? –

25

C--を操作する新しいコード生成バックエンドでちょっとした作業をしたところ、C--がLLVMよりも優れている理由は何か、そしてなぜそれらが本当に同じこと。

  1. C--はLLVMよりも高い抽象度で動作します。たとえば、スタックポインターが完全に暗黙のうちにC言語でコードを生成し、後でコンパイルプロセス中にマニフェストすることができます。これにより、ある種の最適化をより簡単に適用できるようになります。これは、より高いレベルの表現がより少ない不変量でより多くのコードの動きを可能にするからです。

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

  3. CおよびLLVMは、データフローの最適化に異なる手法を採用しています。LLVMは、従来のSSAスタイルのphi-nodeを使用しています。C--は、SSAの不変量を維持する必要のない、Hooplというクールなフレームワークを使用しています。私は確認することができます:Hooplのプログラミング最適化は楽しいですが、特定のタイプの最適化(1回限りの変数のインライン展開を心がけています)は、このデータフロー設定で最も自然なものではありません。

+0

C--と言うとき、あなたはメインのC実装またはGHCのCmm変種を指していますか? – refi64

2

LLVMは、はるかに動いているターゲットです。

GHCは、複数のバージョンのLLVMをサポートしようとするといくつかの問題を抱えています。 これについてのghc-devメーリングリストにはアクティブなdiscussionがあります。

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

また、現在のAFAIKでは、LLVMプロジェクトではポータブルプラットフォームの優先付けが優先されず、一部の開発者はそれを明確に表現しています。is a compiler IR and not a form of portable assembly language

あなたが1つの意図目標のために書くLLVM IRは、別の意図された目標に対して全く役に立たないかもしれません。比較のために、C--ウェブサイトは実際にポータブルアセンブリとしてそれを参照します。 「携帯可能なアセンブリ言語であればもっと幸せになれます...」という言葉はtheir websiteです。このWebサイトには、ポータブルのインプリメンテーションのガベージコレクションと例外処理を容易にするランタイムインターフェイスも含まれています。

C-とJavaバイトコード、そしてLLVM IRとバックエンドの共通の共通点として共通している、すべてのフロントエンドの移植可能な共通基盤と考えることができます複数のターゲットに共通する低レベルの最適化の統合を容易にします。 LLVM IRはまた、LLVMプロジェクトがこれらの低レベルの最適化を多く実装するという追加のボーナスを提供します。言い換えれば、LLVM IRは実際にはC--より高いレベルと見なすことができます。たとえば、LLVM IRはC--のように異なるものがあります。すべてがちょうどビットベクトルです。

関連する問題