LLVM対C— ; LLVMは基本的にHaskellにとってCよりも優れていないのでしょうか?
-
03-07-2019 - |
解決
まあ、UNSWにはGHCコアをLLVMに変換するプロジェクトがあります
10残念ながら、LLVMには移植可能な最適化されたコード用のインフラストラクチャがありますが、C--ha(s)dという優れた高レベル言語サポート用のインフラストラクチャはありません。興味深いプロジェクトは、LLVMをターゲットにすることですから C-- ...
更新、GHC 7以降、 GHCはコード生成にLLVMを使用します。 -fllvm
フラグを使用します。これにより、一部の低レベルプログラムの数値パフォーマンスが向上しました。それ以外の場合、パフォーマンスは古いGCCバックエンドに似ています。
他のヒント
Cを操作する新しいコード生成バックエンドで少し動作しましたが、C--がLLVMよりも優れている理由がいくつかあると言えます。同じこと。
-
C-- LLVMよりも高い抽象化レベルで動作します。たとえば、Cでコードを生成できます。この場合、スタックポインターは完全に暗黙的であり、コンパイルプロセス中にのみ明示されます。これにより、特定のタイプの最適化を非常に簡単に適用できるようになります。高レベルの表現により、より少ない不変量でより多くのコードモーションが可能になるためです。
-
私たちは積極的にこれを修正しようとしていますが、LLVMにはvia-Cバックエンドと同じ問題があります。 procポイントを作成する必要があります。 procとはポイント?基本的に、Haskellは従来の呼び出し/再呼び出しの規則を使用しないため、サブプロシージャコールと同等の道徳を作成するときは常に、スタックに継続をプッシュしてからサブプロシージャにジャンプする必要があります。通常、この継続はローカルラベルですが、LLVMでは実際の手順である必要があるため、関数を小さな部分に分割する必要があります(各部分はprocポイントと呼ばれます)。これは、プロシージャレベルで機能する最適化にとって悪いニュースです。
-
C--とLLVMは、データフローの最適化に対して異なるアプローチを採用しています。 LLVMは、phi-nodesを使用した従来のSSAスタイルを使用します。C--Soopの不変条件を維持する必要のないHooplと呼ばれるクールなフレームワークを使用します。確認できます:Hooplでのプログラミングの最適化は非常に楽しいですが、特定の種類の最適化(一度使用された変数のインライン化が頭に浮かぶ)は、このデータフロー設定ではまったく自然ではありません。
GHCには正式にLLVMバックエンドがあり、 GCCおよびnative-codegenと競合し、場合によってはより高速になります。そして、LLVMプロジェクトは新しい呼び出し規約を受け入れました David TereiがHaskellのためにLLVMで作成したので、驚くべきことに、2つのプロジェクトは実際に一緒に動作しています。
実際の問題の1つは、LLVMがはるかに動くターゲットであるということです。
GHCは、LLVMの複数のバージョンをサポートしようとしていくつかの問題を抱えています。 ghc-devメーリングでアクティブなディスカッションがあります。これに関するリスト。
ところで、現在ghcのllvmバックエンドは、Haskellがcmm言語に翻訳された後です(ほとんどはC-- STG言語の特定のレジスタで拡張されていると思います)。困難に対処したため、コンパイルが遅くなる冗長な最適化が行われています。
また、歴史的にも現在も、LLVMプロジェクトはポータブルプラットフォームの提供を優先していません。一部の開発者は、はコンパイラIRであり、移植可能なアセンブリ言語の形式ではありません。
1つの意図されたターゲット用に作成したLLVM IRは、別の意図されたターゲットにはまったく役に立たない場合があります。比較のために、C-- Webサイトでは実際にポータブルアセンブリと呼んでいます。 "可能性のある1つの移植可能なアセンブリ言語を使用すると、より幸せになります... '' 彼らのウェブサイトからの引用です。このウェブサイトには、ガベージコレクションと例外処理の移植性のある実装を容易にするランタイムインターフェイスも記載されています。
したがって、C--は、すべてのフロントエンドの移植可能な共通基盤と考えることができます。これは、CILおよびJavaバイトコードとLLVM IRとの共通点が少しあり、LLVM IRは、すべてのバックエンド複数のターゲットに共通する低レベルの最適化の統合を促進します。 LLVM IRは、LLVMプロジェクトがこれらの低レベルの最適化の多くを実装するという追加のボーナスも提供します。そうは言っても、LLVM IRはいくつかの点で実際にはCよりも高いレベルと見なすことができます。たとえば、LLVM IRにはさまざまなタイプがあり、Cのようにすべてがビットベクトルです。