プログラムのライフサイクルフェーズとは、コンピュータプログラムが開発段階から実行段階へと移行する際に、その動作に関連する特定の期間のことです。プログラムのライフサイクルにおいて、プログラムの動作状態が変化する特定の期間は、いずれもフェーズとして識別できます。例えば、コンパイル時間はプログラムがコンパイルされる時点であり、リンク時間はプログラムがリンクされる時点です。また、フェーズは多くの場合、構成要素となるフェーズに分割できます。例えば、ビルド時間はコンパイル時間とリンク時間に、コンパイル時間は解析時間とコード生成時間に、実行時間は初期化時間と通常動作時間に分割できます。
プログラムは通常、段階的に移行しますが、必ずしも最初から最後まで順番に進むとは限らず、一部の段階がスキップされることもあります。例えば、プログラミングを行う際、開発者はプログラムを配布したりインストールしたりすることなく、繰り返し編集、ビルド、実行することがあります。プログラミングが完了した後、ユーザーに配布され、インストールされることがあります。
プログラムライフサイクルフェーズという用語はあまり知られていないものの、その時間(フェーズ)はよく知られており、一般的に使用され、重要な意味を持っています。この記事では、より適切な用語がないため、この総称を使用します。
プログラムの動作フェーズは、開発技術によって異なります。たとえば、コンパイル型プログラムにはコンパイルとリンクのフェーズがありますが、インタプリタ型プログラムにはそのようなフェーズはありません(つまり、ソースコードとして配布されます)。コンパイル型プログラムであっても、フェーズは様々です。たとえば、一部のランタイム(.NETやJavaなど)にはジャストインタイムコンパイルフェーズが含まれていますが、より伝統的なランタイム( Cなど)には含まれていません。
ホストネイティブ実行可能ファイルにコンパイルされるプログラムのフェーズは、通常以下のとおりです。
バインディングのタイミングとは、エンティティ間の関連付けがプログラムの実行開始前(早期)に確定されるか、実行開始後(後期)に確定されるかを示すものです。ここで説明するフェーズは、バインディングが発生するタイミングをより正確に記述する方法を提供します。例えば、早期バインディングは、設計時、コンパイル時、またはリンク時に行われる可能性があります。
並列コンピューティング開発の重要な機能の 1 つは、コードをホスト実行環境に合わせて特化することです。[ 9 ] [ 10 ]このような特化は、その環境が判明するまでは実行できません。同じコードをさまざまなハードウェア プラットフォームで実行したい場合、編集フェーズやコンパイル フェーズではこのような特化はできません。最も早いフェーズは配布フェーズになります。[ 11 ]ハードウェア情報を収集し、そのハードウェアまたは実質的に類似したハードウェアに既に特化されている実行可能ファイルを選択するか、実行時に特化されたバイナリを生成するシステムを導入すれば可能です。同様に、特化はロード時にも実行できます。[ 12 ]バイナリ書き換えツール[ 13 ]を、制御フロー構造を使用して特化された形式を生成するツールと組み合わせて呼び出すことで実現できます。