コンパイラ(コンピュータプログラム)
コンパイラは、あるプログラミング言語のソースコードを別の言語へ変換するソフトウェアです。多くは機械語または中間形式を出力します。本項では構成要素、歴史、種類、用途を解説します。
概要
コンパイラは、あるプログラミング言語で記述されたソースコードを、別の言語のコードへ変換するコンピュータプログラムである。元となる言語はソース言語、変換結果の言語はターゲット言語と呼ばれる。一般的には、ターゲットはプロセッサが直接実行できる機械語、または仮想マシン上で動作するバイトコードなどの中間形式である。簡潔な導入については、概要解説を参照。
画像ギャラリー
1 画像主要な構成要素と処理段階
多くのコンパイラはフロントエンドとバックエンドの段階で構成され、複数の異なる処理工程を実行する。これらの工程では、生の文字列から実行可能な命令へと、プログラムのテキストを段階的に変換し検査する。
- 字句解析 — 文字を、識別子、リテラル、演算子などのトークンにまとめる。
- 構文解析(パース) — プログラムの文法を表す木構造を構築する。
- 意味解析 — 型、シンボルの使用、その他の言語規則を検査し、木構造に意味情報を付加する。
- 中間表現と最適化 — プログラムを変換に適した形式へ変換し、性能またはサイズの改善を試みる。
- コード生成 — ターゲット言語のテキストまたは機械命令を出力する。
- リンクとアセンブル — 複数のコンパイル済み単位を結合し、参照を解決して最終的な実行可能ファイルを作成する。
パーサジェネレータやコンパイラコンパイラ・システムなどの専門的なツールは、新しい言語向けのフロントエンドの構築に役立つ。
歴史と発展
コンパイラは、プログラマが生の機械命令ではなく、より高水準の言語で記述しようとしたことから生まれた。初期の高水準言語とそのコンパイラにより、アルゴリズムをより明確に表現し、変換された出力を通じて異なるハードウェアを対象にすることが実用的になった。時代とともにこの分野には、形式文法やパーサの自動構築から高度な最適化戦略まで、多くの技法が加わった。これにより、コンパイラは非常に効率的なコードを生成し、大規模で複雑なソフトウェアシステムを支援できるようになった。背景については、歴史の要約を参照。
種類と主な区別
コンパイラは、その目的と出力によって異なる。主な区別には次のものがある。
- 事前コンパイル(AOT)コンパイラ — 実行前にソースをターゲットへ変換する。
- ジャストインタイム(JIT)コンパイラ — 実際の実行条件を活用するため、実行時にコードをコンパイルする。
- クロスコンパイラ — 自身が動作するマシンやオペレーティングシステムとは異なる環境向けの実行コードを生成する。
- トランスパイラ — 機械語ではなく、高水準言語間で変換を行う。
- 逆コンパイラ — コンパイル済みバイナリから可読性のあるソースコードを復元しようとする。
あるツールをコンパイラと呼ぶかインタプリタと呼ぶかは、独立した出力プログラムを生成するか、コードを直接実行するかによる。ただし、現代の多くのシステムは両方の方式を組み合わせている。例えば、バイトコードにコンパイルした後、そのバイトコードを解釈実行またはJITコンパイルする方式がある。
用途、例、重要性
コンパイラはソフトウェア開発の中核をなす。異なるプロセッサやオペレーティングシステムを対象にすることで移植性を実現し、最適化によって性能を向上させ、静的なエラー検査と解析を支援し、新しいプログラミングパラダイムを実用化する。よく知られたコンパイル言語には、システム向け言語や多くの汎用言語が含まれる。それらのコンパイラは、人間が読めるプログラムを、効率的な機械レベルの操作または移植可能なバイトコードへ変換する。実践的なチュートリアルとツールチェーンについては開発者向けリソースを、組込みシステム向けクロスコンパイルの実装についてはプラットフォームガイドを参照。
実行可能ファイルの生成にとどまらず、現代のコンパイラ基盤は、統合開発環境(IDE)、静的解析器、リファクタリングツールで使用されるライブラリやサービスを提供することが多い。この共有されたツール群は生産性を高め、大規模なソフトウェアの品質維持に役立つ。
関連項目
著者
AlegsaOnline.com コンパイラ(コンピュータプログラム) Leandro Alegsa
URL: https://ja.alegsaonline.com/art/22240