LLVM

ウィキペディアから、無料の百科事典
ナビゲーションにジャンプ 検索にジャンプ
LLVM
原作者Vikram AdveChris Lattner
開発者LLVM開発者グループ
初回リリース2003 ; 19年前 (2003
安定リリース
13.0.1 [1] ウィキデータでこれを編集する / 2022年2月2日
プレビューリリース
13.0.1-rc3 [2] ウィキデータでこれを編集する / 2022年1月21日
リポジトリ
で書かれているC ++
オペレーティング・システムクロスプラットフォーム
タイプコンパイラ
ライセンスUIUCBSDスタイル) LLVM例外を伴う
Apacheライセンス2.0(v9.0.0以降)[3]
Webサイトwww .llvm .org

LLVMは、コンパイラツールチェーンテクノロジのセットであり[5]、任意のプログラミング言語のフロントエンドと任意の命令セットアーキテクチャバックエンドを開発するために使用できますLLVMは、言語に依存しない中間表現(IR)を中心に設計されており、複数のパスにわたるさまざまな変換で最適化できる、ポータブルで高レベルのアセンブリ言語として機能します。[6]

LLVMはC ++で記述されており、コンパイル時リンク時実行時、および「アイドル時」の最適化用に設計されています。もともとCおよびC ++用に実装されていた、言語に依存しないLLVMの設計により、さまざまなフロントエンドが生まれました。LLVMを使用する(またはLLVMを直接使用しないが、コンパイル済みプログラムをLLVM IRとして生成できる)コンパイラーを備えた言語には、ActionScriptが含まれます。AdaC#[7] [8] [9] Common LispPicoLispCrystalCUDADDelphiDylanForth[10] FortranFree BasicFree PascalGraphical G[11] HalideHaskellJavaバイトコードJuliaKotlinLuaObjective-COpenCL[12] PostgreSQLのSQLおよびPLpgSQL、[13] Ruby[14] RustScala[15] Swift、XC、[16] XojoZig

歴史

LLVMプロジェクトは、2000年にイリノイ大学アーバナシャンペーン校で、 VikramAdveChrisLattnerの指導の下で開始されましたLLVMという名前は、もともと低レベル仮想マシンの頭文字でした。LLVMは元々、静的および動的プログラミング言語の動的コンパイル手法を調査するための研究インフラストラクチャとして開発されました。LLVMは、イリノイ大学/ NCSAオープンソースライセンス[3]、パーミッシブフリーソフトウェアライセンスの下でリリースされました2005年、Apple Inc.Lattnerを雇い、Appleの開発システム内でさまざまな用途のためにLLVMシステムに取り組むチームを結成しました。[17] LLVMは、Xcode 4以降、 macOSおよびiOS向けのAppleのXcode開発ツールの不可欠な部分です。 [18]

LLVMは、現在の開発者が(より具体的には)仮想マシンを処理すると考えるものとはほとんど関係のない包括的なプロジェクトに進化したため、混乱を避けるためにLLVMの略語は正式に削除されました[説明が必要][19]現在、LLVMは、LLVMアンブレラプロジェクト、LLVM中間表現(IR)、LLVMデバッガーC ++標準ライブラリのLLVM実装( C ++ 11およびC ++を完全にサポート)に適用されるブランドです。 14 [20])など。LLVMはLLVMFoundationによって管理されています。その社長はコンパイラエンジニアのTanyaLattnerです。[21]

「LLVMの設計と実装について」Association for Computing Machineryは、Vikram Adve、Chris Lattner、およびEvanChengに2012ACM Software SystemAwardを授与ました。[22]

v9.0.0 [説明が必要]以降、LLVM例外を使用してApache License2.0に再ライセンスされました。[3]

機能

LLVMは、完全なコンパイラシステムの中間層を提供し、コンパイラから中間表現(IR)コードを取得して、最適化されたIRを発行します。次に、この新しいIRを変換して、ターゲットプラットフォーム用のマシン依存のアセンブリ言語コードにリンクできます。LLVMは、 GNUコンパイラコレクション(GCC)ツールチェーンからIRを受け入れることができるため、そのプロジェクト用に作成されたさまざまな既存のコンパイラフロントエンドで使用できます。

LLVMは、コンパイル時またはリンク時に 再配置可能なマシンコードを生成することも、実行時にバイナリマシンコードを生成することもできます。

LLVMは、言語に依存しない命令セット型システムをサポートしています。[6]各命令は静的単一代入形式(SSA)であり、各変数(型付きレジスタと呼ばれる)が一度割り当てられてからフリーズされることを意味します。これは、変数間の依存関係の分析を簡素化するのに役立ちます。LLVMを使用すると、コードを従来のGCCシステムで静的にコンパイルしたり、 Javaと同様にジャストインタイムコンパイル(JIT)を介してIRからマシンコードにレイトコンパイルしたりできます型システムは、整数浮動小数点数などの基本型と5つの派生型で構成されています。ポインタ配列ベクトル構造体、および関数具体的な言語の型構造は、LLVMでこれらの基本型を組み合わせることで表すことができます。たとえば、C ++のクラスは、構造体、関数、および関数ポインタの配列を組み合わせて表すことができます。

LLVM JITコンパイラーは、実行時にプログラムから不要な静的ブランチを最適化できるため、プログラムに多くのオプションがあり、そのほとんどが特定の環境で不要に簡単に判別できる場合の部分評価に役立ちます。この機能は、 Mac OS X Leopard (v10.5)のOpenGLパイプラインで使用され、不足しているハードウェア機能のサポートを提供します。[23]

OpenGLスタック内のグラフィックコードは、中間表現のままにして、ターゲットマシンで実行するときにコンパイルできます。ハイエンドのグラフィックスプロセッシングユニット(GPU)を備えたシステムでは、結果のコードは非常に薄いままであり、最小限の変更で命令をGPUに渡します。ローエンドGPUを搭載したシステムでは、LLVMは、GPUが内部で実行できない命令をエミュレートするローカル中央処理装置(CPU)で実行されるオプションのプロシージャをコンパイルします。LLVMは、 IntelGMAチップセットを使用するローエンドマシンのパフォーマンスを改善しました。同様のシステムがGallium3DLLVMpipeの下で開発され、適切な3Dハードウェアドライバーをロードせずに実行できるようにGNOMEシェルに組み込まれました。[24]

コンパイルされたプログラムの実行時パフォーマンスについては、GCCは以前は2011年にLLVMを平均10%上回っていました。[25] [26] 2013年の新しい結果は、LLVMがこの分野でGCCに追いつき、現在バイナリをコンパイルしていることを示しています。ほぼ同等のパフォーマンス。[27]

コンポーネント

LLVMは、複数のコンポーネントを含む包括的なプロジェクトになりました。

フロントエンド

LLVMは元々GCCスタック内の既存のコードジェネレーターの代わりとして作成され[28]、GCCフロントエンドの多くはそれと連動するように変更され、現在は廃止されたLLVM-GCCスイートになっています。変更には通常、GIMPLEからLLVMへのIRステップが含まれるため、GCCのGIMPLEシステムの代わりにLLVMオプティマイザーとcodegenを使用できます。Appleは、 Xcode 4.x(2013)を通じてLLVM-GCCの重要なユーザーでした。[29] [30] GCCフロントエンドのこの使用は、ほとんど一時的な手段と考えられていましたが、Clangの出現と、LLVMおよびClangの最新のモジュラーコードベース(およびコンパイル速度)の利点により、ほとんど廃止されました。

LLVMは現在、さまざまなフロントエンドを使用したAdaCC ++DDelphiFortranHaskellJuliaObjective-CRust、およびSwiftのコンパイルをサポートしています。

LLVMへの幅広い関心は、さまざまな言語の新しいフロントエンドを開発するためのいくつかの取り組みにつながりました。最も注目されているのは、C、C ++、Objective-Cをサポートする新しいコンパイラであるClangです。主にAppleによってサポートされているClangは、GCCシステムのC / Objective-Cコンパイラを、統合開発環境(IDE)とより簡単に統合でき、マルチスレッドをより幅広くサポートするシステムに置き換えることを目的としています。OpenMPディレクティブのサポートは、リリース3.8以降のClangに含まれています。[31]

Utrecht Haskellコンパイラは、LLVMのコードを生成できます。ジェネレーターは開発の初期段階にありますが、多くの場合、Cコードジェネレーターよりも効率的です。[32] LLVMを使用するGlasgowHaskellコンパイラ(GHC)バックエンドがあり、GHCまたはCコード生成によるネイティブコードコンパイルとそれに続くコンパイルと比較して、コンパイルされたコードの30%の高速化を実現し、多くの最適化手法の1つだけを欠いています。 GHCによって実装されます。[33]

Rustコンパイラ、Javaバイトコードフロントエンド、共通中間言語(CIL)フロントエンド、Ruby 1.9のMacRuby実装、 Standard MLのさまざまなフロントエンドなど、他の多くのコンポーネントが開発のさまざまな段階にあります。 、および新しいグラフカラーリングレジスタアロケータ。[要出典]

中間表現

LLVM IRは、たとえばradeonsiやllvmpipeによって使用されます。どちらもMesa3Dの一部です。

LLVMの中核は、アセンブリに似た低レベルのプログラミング言語である中間表現(IR)です。IRは、ターゲットのほとんどの詳細を抽象化する、強く型付けされた縮小命令セットコンピューティング(RISC)命令セットです。たとえば、呼び出し規約は、明示的な引数を使用したcallおよびret命令によって抽象化されます。また、レジスタの固定セットの代わりに、IRは%0、%1などの形式の一時的な無限のセットを使用します。LLVMは、人間が読める形式のアセンブリ形式、に適したメモリ内形式の3つの同等の形式のIRをサポートします。フロントエンド、およびシリアル化用の高密度ビットコード形式。シンプルな「Hello、world!」IR形式のプログラム: [34]

@ .str  = 内部 定数 [ 14x i8 ]  c  " hello world \ 0A \ 00" 

 i32  @printfを宣言しますi8 *、 ...)

define  i32  @main i32  %argc  i8 **  %argv  nounwind  { 
entry:
    %tmp1  =  getelementptr  [ 14  x  i8 ]、 [ 14  x  i8 ] *  @ .str  i32  0  i32  0 
    %tmp2  =  call  i32  i8 *、 ...) @ printf  i8 * tmp1 nounwind ret i32 0 }    
      

使用される多くの異なる規則と異なるターゲットによって提供される機能は、LLVMがターゲットに依存しないIRを実際に生成し、いくつかの確立されたルールに違反せずにそれを再ターゲットできないことを意味します。ドキュメントに明示的に記載されているものを超えるターゲット依存の例は、オンライン配布を目的としたLLVMIRの完全にターゲットに依存しないバリアントである「ワードコード」の2011年の提案に記載されています。[35]より実用的な例はPNaClです。[36]

バックエンド

バージョン13では、LLVMは、 IA-32x86-64ARMQualcomm HexagonMIPSNvidia Parallel Thread Execution(PTX 、LLVMドキュメントではNVPTXと呼ばれます)、 PowerPCAMD TeraScale[37]ほとんどのAMDを含む多くの命令セットをサポートします。 GPUの最近のもの( LLVMドキュメントではAMDGPUと呼ばれます)、[38] SPARCz / Architecture( LLVMドキュメントではSystemZと呼ばれます)、およびXCore 一部の機能は、一部のプラットフォームでは使用できません。ほとんどの機能は、IA-32、x86-64、z / Architecture、ARM、およびPowerPCに存在します。[39] RISC-Vはバージョン7でサポートされています。これまで、LLVMは、Cバックエンド、Cell SPUmblaze(MicroBlaze)[40] AMD R600、DEC / Compaq AlphaAlpha AXP )などの他のバックエンドも完全または部分的にサポートしていました。 )[41]およびNios2[42]ですが、このハードウェアのほとんどはほとんど時代遅れであり、LLVM開発者はサポートとメンテナンスのコストがもはや正当化されないと判断しました。[要出典]

LLVMはターゲットとしてWebAssemblyもサポートし、コンパイルされたプログラムをGoogle Chrome / ChromiumFirefoxMicrosoft EdgeApple SafariWAVMなどのWebAssembly対応環境で実行できるようにしますLLVM準拠のWebAssemblyコンパイラは通常、C、C ++、D、Rust、Nim、Kotlin、およびその他のいくつかの言語で記述された、ほとんど変更されていないソースコードをサポートします。

LLVMマシンコード(MC)サブプロジェクトは、テキスト形式とマシンコードの間でマシン命令を翻訳するためのLLVMのフレームワークです。以前は、LLVMは、アセンブリをマシンコードに変換するために、システムアセンブラーまたはツールチェーンによって提供されるアセンブラーに依存していました。LLVM MCの統合アセンブラは、IA-32、x86-64、ARM、およびARM64を含むほとんどのLLVMターゲットをサポートします。さまざまなMIPS命令セットを含む一部のターゲットでは、統合アセンブリサポートを使用できますが、まだベータ段階です。[要出典]

リンカー

lldサブプロジェクトは、 LLVM用の組み込みのプラットフォームに依存しないリンカーを開発する試みです。[43] lldは、サードパーティのリンカーへの依存を取り除くことを目的としています。2017年5月の時点で、lldはELFPE / COFFMach-O、およびWebAssembly [44]を完全性の降順でサポートしています。lldは、GNUldの両方のフレーバーよりも高速です[要出典]

GNUリンカーとは異なり、lldにはリンク時最適化のサポートが組み込まれています。これにより、リンカープラグインの使用がバイパスされるため、コード生成が高速化されますが、一方で、他の種類のLTOとの相互運用性が妨げられます。[45]

C ++標準ライブラリ

LLVMプロジェクトには、 MITライセンスUIUCライセンスの下でデュアルライセンスされたlibc ++と呼ばれるC ++標準ライブラリの実装が含まれています。[46]

v9.0.0以降、LLVM例外を使用してApache License2.0に再ライセンスされました。[3]

ポリー

これにより、キャッシュの局所性の最適化のスイートと、多面体モデルを使用した自動並列処理およびベクトル化が実装されます。[47]

デバッガー

派生物

パーミッシブライセンスにより、多くのベンダーが独自に調整したLLVMのフォークをリリースしています。これはLLVMのドキュメントによって公式に認識されており、この理由から機能チェックでバージョン番号を使用しないことを提案しています。[48]ベンダーの一部は次のとおりです。

も参照してください

文学

  • Chris Lattner-オープンソースアプリケーションのアーキテクチャ-第11章LLVMISBN  978-1257638017、2012年にCC BY 3.0(オープンアクセス)でリリースされました。[55]
  • LLVM:生涯プログラム分析と変換のためのコンパイルフレームワーク、 Chris Lattner、VikramAdveによる公開論文

参考文献

  1. ^ https://github.com/llvm/llvm-project/releases/tag/llvmorg-13.0.1
  2. ^ https://github.com/llvm/llvm-project/releases/tag/llvmorg-13.0.1-rc3
  3. ^ a b c d "LICENSE.TXT"llvm.org 2019年9月24日取得
  4. ^ 「LLVMロゴ」LLVMコンパイラインフラストラクチャプロジェクト
  5. ^ 「LLVMコンパイラインフラストラクチャプロジェクト」2016年3月11日取得
  6. ^ a b "LLVM言語リファレンスマニュアル" 2019年6月9日取得
  7. ^ 「LLILCの発表-.NET用の新しいLLVMベースのコンパイラ」dotnetfoundation.org 2020年9月12日取得
  8. ^ Mono LLVM 、 2013年3月10日取得
  9. ^ クリス・ラトナー(2011)。「LLVM」エイミーブラウンで; グレッグウィルソン(編)。オープンソースアプリケーションのアーキテクチャ
  10. ^ 「MovForth」GitHub2021年11月28日。
  11. ^ William Wong(2017年5月23日)。「LabVIEW2017とLabVIEWNXGの違いは何ですか?」電子設計
  12. ^ マイケル・ララベル(2018年4月11日)。「KhronosがLLVM / SPIR-Vトランスレーターを正式に発表しました」phoronix.com。
  13. ^ 「32.1。JITコンパイルとは何ですか?」PostgreSQLドキュメント2020年11月12日2021年1月25日取得
  14. ^ 「機能」RubyMotionスクラッチワーク開発LLC 2017年6月17日取得RubyMotionは、プロジェクトのRubyソースコードを、LLVMに基づく[n] ...事前(AOT)コンパイラーを使用して...マシンコードに変換します。
  15. ^ Reedy、Geoff(2012年9月24日)。「ScalaをLLVMにコンパイルする」セントルイス、ミズーリ州、アメリカ合衆国2013年2月19日取得 {{cite journal}}引用ジャーナルには|journal=ヘルプ)が必要です
  16. ^ 「xCORE:マルチコア理論、ハードウェアおよびプログラミング(2014-12-01)」開発者ツールxTIMEcomposer、XMOS、2014年12月、 2021年3月27日取得
  17. ^ Adam Treat(2005年2月19日)、2011年10月4日にオリジナルからアーカイブされ、 2012年1月27日に取得されたQt4のLLVMコンパイル用のmkspecsとパッチ
  18. ^ 「開発者ツールの概要」AppleDeveloperりんご。2011年4月23日にオリジナルからアーカイブされました。
  19. ^ ラトナー、クリス(2011年12月21日)。「LLVMの名前」llvm-dev(メーリングリスト)2016年3月2日取得「LLVM」は正式には頭字語ではなくなりました。かつて拡張された頭字語も混乱を招き、ほぼ1日目から不適切でした。:) LLVMが他のサブプロジェクトを包含するように成長するにつれて、それはさらに有用性が低くなり、意味がなくなりました。
  20. ^ ""libc ++" C ++標準ライブラリ "
  21. ^ クリス・ラトナー(2014年4月3日)。「LLVM財団」LLVMプロジェクトブログ
  22. ^ 「ACMソフトウェアシステム賞」ACM。
  23. ^ クリス・ラトナー(2006年8月15日)。「AppleでのLLVMのクールな使用法:OpenGLスタック」llvm-dev(メーリングリスト)2016年3月1日取得
  24. ^ Michael Larabel、「GNOME ShellはGPUドライバーのサポートなしで動作する」 phoronix、2011年11月6日
  25. ^ V。マカロフ。「SPEC2000:x86でのLLVM-2.9とGCC4.6.1の比較」2011年10月3日取得
  26. ^ V。マカロフ。「SPEC2000:x86_64でのLLVM-2.9とGCC4.6.1の比較」2011年10月3日取得
  27. ^ Michael Larabel(2012年12月27日)。「GCCと競合するLLVM / Clang3.2コンパイラ」2013年3月31日取得
  28. ^ ラトナー、クリス; Vikram Adve(2003年5月)。次世代GCCのアーキテクチャ最初の年次GCC開発者サミット2009年9月6日取得
  29. ^ 「LLVMコンパイラの概要」developer.apple.com
  30. ^ 「Xcode5リリースノート」AppleInc
  31. ^ 「Clang3.8リリースノート」2016年8月24日取得
  32. ^ 「HaskellをLLVMにコンパイルする」2009年2月22日取得
  33. ^ 「LLVMプロジェクトブログ:GlasgowHaskellコンパイラとLLVM」2010年5月17日2010年8月13日取得
  34. ^ 完全なドキュメントについては、 llvm .org / docs / LangRef.htmlを参照してください
  35. ^ カン、ジング。「ワードコード:よりターゲットに依存しないLLVMビットコード」(PDF)2019年12月1日取得
  36. ^ 「PNaCl:ポータブルネイティブクライアント実行可能ファイル」(PDF)2012年5月2日にオリジナル(PDF)からアーカイブされました2012年4月25日取得
  37. ^ Stellard、Tom(2012年3月26日)。「[LLVMdev] RFC:R600、AMDGPUの新しいバックエンド」llvm-dev(メーリングリスト)。
  38. ^ https://llvm.org/docs/AMDGPUUsage.html
  39. ^ ターゲット固有の実装ノート:ターゲット機能マトリックス// LLVMターゲットに依存しないコードジェネレーター、LLVMサイト。
  40. ^ 「llvmからmblazeバックエンドを削除してください」GitHub2013年7月25日2020年1月26日取得
  41. ^ 「Alphaバックエンドを削除する」GitHub2011年10月27日2020年1月26日取得
  42. ^ "[Nios2] Nios2バックエンドを削除します"GitHub2019年1月15日2020年1月26日取得
  43. ^ "lld-LLVMリンカー"LLVMプロジェクト2017年5月10日取得
  44. ^ 「WebAssemblylldポート」
  45. ^ 「42446–lldはgccLTOファイルを処理できません」bugs.llvm.org
  46. ^ ""libc ++" C ++標準ライブラリ "
  47. ^ 「ポリー-LLVMの多面体最適化」
  48. ^ 「Clang言語拡張」Clang12のドキュメントベンダーが異なれば使用する番号付けスキームも異なるため、言語機能の確認にマーケティングバージョン番号を使用しないでください。代わりに、機能チェックマクロを使用してください。
  49. ^ "apple / llvm-project"りんご。2020年9月5日。
  50. ^ 「IntelC / C ++コンパイラはLLVMの完全な採用」インテル2021年8月17日取得
  51. ^ 「lanl / kitsune」ロスアラモス国立研究所。2020年2月27日。
  52. ^ ps4用の開発者ツールチェーン(PDF) 、 2015年2月24日取得
  53. ^ 「NVVMIR仕様1.5」現在のNVVMIRはLLVM5.0に基づいています
  54. ^ 「LLVMオープンソースインフラストラクチャを採用するIBMC / C ++およびFortranコンパイラ」
  55. ^ クリス・ラトナー(2012年3月15日)。「第11章」オープンソースアプリケーションのアーキテクチャエイミー・ブラウン、グレッグ・ウィルソン。ISBN 978-1257638017

外部リンク