中間表現( IR )は、コンパイラまたは仮想マシンがソース コードを表すために内部的に使用するデータ構造またはコードです。IR は、最適化や翻訳などの追加処理に役立つように設計されています。[1]「優れた」IR は正確でなければなりません。つまり、情報を失うことなくソース コードを表現でき[2]、特定のソース言語やターゲット言語に依存しません。 [1] IR は、メモリ内データ構造、またはプログラムが読み取り可能な特別なタプルまたはスタックベースのコードなど、いくつかの形式のいずれかになります。 [3]後者の場合、中間言語とも呼ばれます。
標準的な例は、ほとんどの最新のコンパイラに見られます。たとえば、CPython インタープリタは、プログラムを表す線形の人間が読めるテキストを、実行前にフロー分析と再配置を可能にする中間グラフ構造に変換します。このような中間表現を使用すると、GNU コンパイラ コレクションやLLVMなどのコンパイラ システムをさまざまなソース言語で使用して、さまざまなターゲットアーキテクチャ用のコードを生成できます。
中間言語
中間言語は、コンピュータ プログラムの分析を支援するために設計された抽象マシンの言語です。この用語は、コンパイラで使用されることに由来しています。コンパイラでは、プログラムのソース コードを、ターゲット マシンのオブジェクト コードまたはマシンコードを生成する前に、コードを改善する変換に適した形式に変換します。中間言語の設計は、通常、実用的なマシン言語の設計とは 3 つの基本的な点で異なります。
- 各命令は正確に 1 つの基本操作を表します。たとえば、マイクロプロセッサで一般的な「シフト加算」アドレッシング モードは存在しません。
- 制御フロー情報は命令セットに含まれない場合があります。
- 利用可能なプロセッサ レジスタの数は膨大で、無制限になることもあります。
中間言語の一般的な形式は3 アドレス コードです。
この用語は、オブジェクト コードやマシン コード自体は出力せず、中間言語のみを出力する一部の高水準プログラミング言語によって中間言語として使用される言語を指す場合にも使用されます。この中間言語はそのような言語のコンパイラに送信され、コンパイラは完成したオブジェクト コードまたはマシン コードを出力します。これは通常、 Cなどの多くのプロセッサやオペレーティング システム用のコンパイラがある中間言語を使用することで、最適化のプロセスを容易にしたり移植性を高めたりするために行われます。このために使用される言語は、高水準言語とアセンブリ言語などの低水準言語の中間の複雑さになります。
言語
Cは中間言語として明示的に設計されたわけではありませんが、アセンブリ言語の抽象化としての性質と、 Unix 系およびその他のオペレーティング システムにおける事実上の システム言語としての遍在性により、人気のある中間言語となっています。Eiffel 、Sather、Esterel、Lispの一部の方言(Lush、Gambit )、Squeakの Smalltalk サブセット Slang、Nim、Cython、Seed7、SystemTap、Vala 、V などが中間言語として Cを使用しています。C の派生版は、C の機能をポータブルなアセンブリ言語として提供するために設計されており、C--やC 中間言語などがあります。
仮想マシンまたはP コード マシンをターゲットとする言語はすべて中間言語と見なすことができます。
- Java バイトコード
- Microsoft の共通中間言語は、マシン コードへの静的または動的コンパイルの前に、.NET Frameworkのすべてのコンパイラで共有されるように設計された中間言語です。
- ほとんどの中間言語は静的に型付けされた言語をサポートするように設計されていますが、Parrot 中間表現は動的に型付けされた言語 (当初は Perl と Python) をサポートするように設計されています。
- TIMI は、 IBM iプラットフォーム上のコンパイラーによって使用されます。
- BCPLのO コード
- MATLABプリコンパイル済みコード
- Microsoft P コード
- パスカル pコード
GNUコンパイラコレクション(GCC)は、移植性とクロスコンパイルを簡素化するために、内部的にいくつかの中間言語を使用しています。これらの言語には、
GCC は、最終ターゲットとして、これらの IR の生成をサポートしています。
LLVMコンパイラフレームワークはLLVM IR中間言語に基づいており、そのコンパクトなバイナリシリアル化表現は「ビットコード」とも呼ばれ、Apple によって製品化されています。[4] [ 5] GIMPLE バイトコードと同様に、LLVM ビットコードはリンク時の最適化に役立ちます。GCC と同様に、LLVM は Google のPNaCl IR やSPIRなど、直接配布を目的としたいくつかの IR もターゲットにしています。LLVM 内のさらなる開発は、異なる異種ターゲット用のコードを生成し、異なるコンパイラの出力を組み合わせる可能性のあるマルチレベル中間表現( MLIR ) の使用です。[6]
ILOC中間言語[7]は、コンパイラ設計の授業で単純なターゲット言語として使用されます。[8]
他の
静的解析ツールは中間表現を使用することが多い。例えば、Radare2はバイナリファイルの解析とリバースエンジニアリングのためのツールボックスである。バイナリファイルの解析には中間言語ESIL [9]とREIL [10]を使用する。
参照
参考文献
- ^ ab Walker, David. 「CS320: コンパイラ: 中間表現」(講義スライド) . 2016 年2 月 12 日閲覧。
- ^ Chow, Fred (2013年11月22日). 「言語間相互運用性の課題」ACM Queue . 11 (10) . 2016年2月12日閲覧。
- ^ Toal, Ray. 「中間表現」 。 2016年2月12日閲覧。
- ^ 「Bitcode (iOS、watchOS)」。Hacker News。2015年6月10日。 2015年6月17日閲覧。
- ^ 「LLVM ビットコード ファイル形式」。llvm.org。2015年6 月 17 日閲覧。
- ^ 「MLIR」.
- ^ 「An ILOC Simulator」Wayback Machineに 2009-05-07 にアーカイブされた WA Barrett 2007、Keith Cooper と Linda Torczon の「Engineering a Compiler」、Morgan Kaufmann、2004 年を要約。ISBN 1-55860-698 -X。
- ^ 「CISC 471 コンパイラ設計」Uli Kremer 著
- ^ Radare2 貢献者。「ESIL」。Radare2 プロジェクト。2015 年 8 月 18 日時点のオリジナルよりアーカイブ。2015年6 月 17 日閲覧。
- ^ Sebastian Porst (2010 年 3 月 7 日). 「REIL 言語 - パート I」. zynamics.com . 2015 年6 月 17 日閲覧。
外部リンク
- スタンフォードSUIFグループ
