中間表現

ウィキペディアから、無料の百科事典
ナビゲーションにジャンプ 検索にジャンプ

中間表現IR)は、ソースコードを表すためにコンパイラまたは仮想マシンによって内部的に使用されるデータ構造またはコードですIRは、最適化変換などのさらなる処理に役立つように設計されています[1]「優れた」IRは正確であり、情報を失うことなくソースコードを表現でき[2]、特定のソースまたはターゲット言語依存しない必要があります。[1] IRは、いくつかの形式のいずれかを取ることができます。メモリ内データ構造、またはプログラムで読み取り可能な特殊なタプルまたはスタックベースのコード。[3]後者の場合、それは中間言語とも呼ばれます。

正規の例は、ほとんどの最新のコンパイラに見られます。たとえば、CPythonインタープリターは、プログラムを表す人間が読める形式の線形テキストを、実行前にフロー分析と再配置を可能にする中間グラフ構造に変換します。このような中間表現を使用すると、GNUコンパイラコレクションLLVMなどのコンパイラシステムをさまざまなソース言語で使用して、さまざまなターゲットアーキテクチャのコードを生成できます

中間言語

中間言語は、コンピュータプログラムの分析を支援するために設計された抽象マシンの言語ですこの用語は、プログラムのソースコードが、ターゲットマシンのオブジェクトまたはマシンコードを生成するために使用される前に、コードを改善する変換により適した形式に変換されるコンパイラでの使用に由来します。中間言語の設計は、通常、次の3つの基本的な点で 実際の機械語の設計とは異なります。

中間言語の一般的な形式は、3番地コードです。

この用語は、オブジェクトまたはマシンコード自体を出力せず、中間言語のみを出力する一部の高級プログラミング言語によって中間として使用される言語を指すためにも使用されます。この中間言語は、そのような言語のコンパイラーに送信され、コンパイラーは完成したオブジェクトまたはマシンコードを出力します。これは通常、最適化のプロセスを容易にするため、またはCなどの多くのプロセッサオペレーティングシステム用のコンパイラを備えた中間言語を使用して移植性を高めるために行われますこのために使用される言語は、高水準言語と低水準言語(アセンブリ言語など)の間で複雑になります

言語

中間言語として明示的に設計されていませんが、アセンブリの抽象化としてのCの性質と、 Unixのような他のオペレーティングシステムにおける事実上のシステム言語としてのその遍在性により、Cは人気のある中間言語になっています:EiffelSatherEsterelLispLushGambit)、HaskellGlasgow Haskellコンパイラ)、SqueakのSmalltalkサブセットSlang CythonSeed7SystemTap方言Vala、V、およびその他は、中間言語としてCを使用します。Cのバリアントは、 C--およびC中間言語を含むポータブルアセンブリ言語としてCの機能を提供するように設計されています

仮想マシンまたはpコードマシンを対象とする言語は、中間言語と見なすことができます。

GNUコンパイラコレクション(GCC)は、移植性とクロスコンパイルを簡素化するために、内部でいくつかの中間言語を使用しています。これらの言語の中には

  • 歴史的なレジスタ転送言語(RTL)
  • ツリー言語GENERIC
  • SSAベースのGIMPLE。(GENERICよりも低レベル。ほとんどのオプティマイザーの入力。コンパクトな「バイトコード」表記があります。)

GCCは、最終的なターゲットとして、これらのIRの生成をサポートしています。

  • HSA中間層
  • LLVM中間表現(LLVMオプティマイザーとcodegenを使用する現在は廃止されたllvm-gccのGIMPLEから変換)

LLVMコンパイラフレームワークはLLVMIR中間言語に基づいており、そのコンパクトなバイナリシリアル化表現は「ビットコード」とも呼ばれ、Appleによって製品化されています。[4] [5] GIMPLEバイトコードと同様に、LLVMビットコードはリンク時の最適化に役立ちます。GCCと同様に、LLVMも、GoogleのPNaCl IRやSPIRなど、直接配布を目的とした一部のIRを対象としています。LLVM内でのさらなる開発は、マルチレベル中間表現(MLIR)の使用であり、さまざまな異種ターゲットのコードを生成し、さまざまなコンパイラーの出力を組み合わせる可能性があります。[6]

ILOC中間言語[7]は、コンパイラー設計のクラスで単純なターゲット言語として使用されます。[8]

その他

静的分析ツールは、多くの場合、中間表現を使用します。たとえば、radare2は、バイナリファイルの分析とリバースエンジニアリングのためのツールボックスです。中間言語ESIL [9]およびREIL [10]を使用してバイナリファイルを分析します。

も参照してください

参考文献

  1. ^ a b ウォーカー、デビッド。「CS320:コンパイラ:中間表現」 (講義スライド)2016年2月12日取得
  2. ^ チョウ、フレッド(2013年11月22日)。「言語間の相互運用性への挑戦」ACMキュー11(10)2016年2月12日取得
  3. ^ トール、レイ。「中間表現」2016年2月12日取得
  4. ^ 「ビットコード(iOS、watchOS)」ハッカーニュース。2015年6月10日2015年6月17日取得
  5. ^ 「LLVMビットコードファイル形式」llvm.org 2015年6月17日取得
  6. ^ 「MLIR」
  7. ^ 「ILOCシミュレーター」は2009年5月7日にWABarrett 2007によってウェイバックマシンでアーカイブされ、 KeithCooperとLindaTorczonを言い換え、「Engineering aCompiler」、 Morgan Kaufmann、2004年。ISBN1-55860-698 -X  
  8. ^ UliKremerによる「CISC471コンパイラ設計
  9. ^ radare2の貢献者。「ESIL」レーダー2プロジェクト。2015年8月18日にオリジナルからアーカイブされました2015年6月17日取得 {{cite web}}|author=一般名があります(ヘルプ
  10. ^ セバスチャンポルスト(2010年3月7日)。「REIL言語–パートI」zynamics.com 2015年6月17日取得

外部リンク