実行ファイル

実行ファイル（じっこうファイル、Executable、Executable file）とは、コンピュータがタスクを実行するための解釈可能な命令を含むファイルである。実行可能ファイル、実行可能プログラム、実行形式ファイル、あるいは単に実行形式とも呼ばれる。これと対になるのがデータファイルであり、これは実行ファイルにより解析されることで初めてコンピュータにとって意味があるものとなる。
実行ファイルかどうかの厳密な定義は文脈によるところがある。"命令" とは多くの場合、特定のCPUの機械語を格納したバイナリのことを指す（この形式の実行ファイルを単に「バイナリ（ファイル）」と呼ぶこともある）。場合によっては、インタプリタに解釈させる中間コードやスクリプト言語（シェルスクリプトやバッチファイルを含む）も実行ファイルと呼ばれることがある。また、オペレーティングシステムによっては実行ファイルであることを示すファイル名の規約が存在する（拡張子 ".bin" ".exe"など）。あるいはファイルのメタデータで実行ファイルかどうかを示す（例えばUNIX系オペレーティングシステムのファイルパーミッションビット）。
実行ファイルの生成.
実行ファイルは人間が理解しやすい高水準言語のソースコードとしてソフトウェアを開発する方が格段に楽であるが、機械語を手組みすることも可能である。場合によっては、人間が解読可能であるものの機械語の命令セットと密に関連しているアセンブリ言語をソースコードとして使うこともある。高水準言語は実行可能な機械語ファイルか実行可能ではないオブジェクトファイルにコンパイルされる。アセンブリ言語の場合はこの過程を"アセンブル"と呼ぶ。オブジェクトファイルをいくつかリンクして実行ファイルを作成する。オブジェクトファイルは実行可能かにかかわらず、一般にELF等のコンテナフォーマットに保存され、生成された機械語は.text (実行コード)セクション、.data (静的変数)セクション、.rodata (静的定数)セクション等に分割され構造化される。
オペレーティングシステム、ファームウェア、ブートローダ等のシステムによって実行されるには、実行ファイルはシステムのABIに従う必要がある。もっとも単純な形としては、ファイルをメモリに読み込みアドレス空間の最初に移動してそこから実行することであるが、より複雑な場合は実行ファイルには別々のエントリーポイントを指定する追加のメタデータが付属する。例えば、ELFではエントリーポイントはヘッダーのcodice_1フィールドに格納されており、実行を開始する(仮想)メモリアドレスを指定している。GCC (GNUコンパイラコレクション) では、このフィールドはcodice_2シンボルによりリンカによって指定される。
実行ファイルには通常ランタイムシステムも含まれており、ランタイム言語機能 (タスクスケジュール、例外処理のハンドル、静的コンストラクタやデストラクタの呼び出し等)や特定のオペレーティングシステムのシステムコールを呼び出し、引数や環境変数を渡し戻り値を得る命令セット、そしてファイルハンドル等のリソースを解放して開始/終了処理を行う機能が含まれる。C では、実際のエントリーポイントを含みランタイムライブラリを呼び出し開始/終了処理を行う crt0 オブジェクトをリンクすることで実現している。
実行ファイルには実行に必要な環境についての情報、デバッグ情報、シンボル情報など、ソースコードから生成される機械語プログラム自体に含まれない情報も多く格納されることがある。場合によっては、例えば組込みシステムの開発やコンパイル、リンク、ローダの動作を単純に学習したい場合等、これを省略したい場合がある。C では、通常のラインタイムを省略することができ、その代わりに明示的にリンカスクリプトを指定し、エントリーポイントを生成してcodice_3を呼び出したりカーネルに終了コードを返すといった開始/終了処理を行う。
実行ファイルはプロセッサ固有であるだけでなくオペレーティングシステム固有でもある。
実行ファイル形式.
実行ファイル形式は実行ファイルのためのファイル形式、すなわちプログラムを実行ファイルとして収納する形式である。コンテナフォーマットの一種。
一定の規格に沿ってプログラムがファイル内に配置されることで、プロセッサ・OSが実行ファイルをロードできる。ゆえに各実行プラットフォームは対応する実行ファイル形式を定めている。以下はその一例である。