コンピュータにおいて、コード生成はコンパイラの処理チェーンの一部であり、ソースコードの中間表現を、ターゲットシステムが容易に実行できる形式(例えば、マシンコード)に変換するプロセスである。
高度なコンパイラは通常、さまざまな中間形式に対して複数回の処理を実行します。このような多段階処理が用いられるのは、コード最適化のための多くのアルゴリズムは一度に1つずつ適用する方が容易であるため、あるいはある最適化への入力が別の最適化によって完了した処理に依存しているためです。また、この構成により、コード生成の最終段階(バックエンド)のみをターゲットごとに変更すれば済むため、複数のアーキテクチャをターゲットとする単一のコンパイラの作成が容易になります。(コンパイラ設計の詳細については、「コンパイラ」を参照してください。)
コードジェネレータへの入力は、通常、構文解析ツリーまたは抽象構文ツリーで構成されます。[ 1 ]このツリーは、通常、 3アドレスコードなどの中間言語で記述された、命令の線形シーケンスに変換されます。コンパイルのさらなる段階は、プログラムの表現に大きな変更を伴うかどうかによって、「コード生成」と呼ばれる場合とそうでない場合があります。(例えば、コードジェネレータがピーホール最適化パスを組み込んでいる場合でも、ピーホール最適化パスは「コード生成」とは呼ばれないでしょう。)
一般的なコードジェネレータは、中間表現を機械語命令の線形シーケンスに変換するだけでなく、生成されたコードを最適化しようと試みる。
高度なコンパイラの「コード生成」フェーズに含まれる典型的なタスクには、以下のようなものがあります。
命令の選択は通常、抽象構文木に対して再帰的な後順走査を行い、特定の木の構成をテンプレートと照合することによって行われます。たとえば、木は、およびのシーケンスを再帰的に生成し、命令を出力することによって、命令の線形シーケンスに変換される可能性があります。W := ADD(X,MUL(Y,Z))t1 := Xt2 := MUL(Y,Z)ADD W, t1, t2
中間言語を使用するコンパイラでは、命令選択の段階が2つある場合があります。1つは構文解析ツリーを中間コードに変換する段階、もう1つは、ずっと後の段階で、中間コードをターゲットマシンの命令セットの命令に変換する段階です。この2番目の段階ではツリーの走査は必要なく、線形に実行でき、通常は中間言語の操作を対応するオペコードに単純に置き換えるだけです。ただし、コンパイラが言語トランスレータ(たとえば、JavaをC++に変換するもの)である場合を考えてみましょう。その場合、2番目のコード生成段階では、線形中間コードからツリーを構築することが含まれる場合があります。
実行時にコード生成が行われる場合(例えば、ジャストインタイムコンパイル(JIT)など)、プロセス全体は空間と時間の両面で効率的でなければなりません。例えば、正規表現を解釈して実行時にコードを生成する場合、非決定的な有限状態機械が決定的な有限状態機械よりも生成されることがよくあります。これは、非決定的な有限状態機械の方が一般的に生成が速く、メモリ使用量も少ないためです。JITコード生成は、一般的に効率の低いコードを生成するものの、実行時にのみ利用可能なプロファイリング情報を活用できるという利点があります。
ある言語で入力を受け取り、それとは全く異なる言語で出力を生成するという基本的なタスクは、形式言語理論の中核となる変換操作の観点から理解できます。その結果、当初コンパイラで使用するために開発されたいくつかの技術は、他の方法でも使用されるようになりました。たとえば、YACC(Yet Another Compiler-Compiler )は、バッカス・ナウア記法で入力を受け取り、それをC言語のパーサーに変換します。YACCは当初、コンパイラ用のパーサーを自動生成するために作成されましたが、仕様が変更されるたびに修正が必要なコードの記述を自動化するためにもよく使用されます。[ 3 ]
多くの統合開発環境(IDE)は、何らかの形でソースコードの自動生成をサポートしており、多くの場合、コンパイラのコード生成器と共通のアルゴリズムを使用していますが、一般的にはより簡素です。(プログラム変換およびデータ変換も参照してください。)
一般的に、構文解析器と意味解析器はソースコードからプログラムの構造を取得しようとし、コード生成器はこの構造情報(データ型など)を用いてコードを生成します。言い換えれば、前者は情報を追加するのに対し、後者は情報の一部を失います。この情報損失の結果、リフレクションが困難、あるいは不可能になることがあります。この問題を解決するために、コード生成器は構文情報と意味情報、そして実行に必要なコードを埋め込むことがよくあります。
生成。