

コンピューティングにおいて、実行可能ファイルは、コンピュータがその動作を制御するために使用できるリソースです。コンピューティングにおけるすべての情報と同様に、実行可能ファイルはデータですが、制御の流れを意味しないデータとは異なります。[ 2 ]実行可能コード、実行可能ファイル、実行可能プログラム、実行可能イメージなどの用語は、情報が表現され格納される形式を表します。ネイティブ実行可能ファイルはマシンコードであり、 CPUの命令レベルで直接実行可能です。[ 3 ] [ 4 ]スクリプトも実行可能ですが、インタープリタを介して間接的に実行されます。中間実行可能コード(バイトコードなど) は、実行時にジャストインタイムコンパイルによって解釈またはネイティブコードに変換される場合があります。
技術的にはネイティブ実行可能ファイルを機械語で直接記述することは可能ですが、一般的には行われません。人間が読めるソースコードとしてソフトウェアを開発し、ビルドツールチェーンを介して機械語の生成を自動化する方がはるかに便利です。現在、ほとんどのソースコードは高級言語ですが、機械語命令と密接に関連するアセンブリ言語を使用することも可能です。多くのツールチェーンは、ネイティブコードをオブジェクトファイルのセットとして生成するコンパイラと、オブジェクトファイルやその他のファイルからネイティブ実行可能ファイルを生成するリンカで構成されています。アセンブリ言語の場合、通常、変換ツールはコンパイラではなくアセンブラと呼ばれます。
オブジェクトファイルは通常、コンピューティングのコンテキストに応じて、実行可能リンク可能フォーマット(ELF)やポータブル実行可能フォーマット(PE)など、マシンコードの構造をサポートするデジタルコンテナフォーマットに格納されます。 [ 5 ]このフォーマットは、 .text(実行可能コード)、. data(初期化されたグローバル変数と静的変数)、. rodata (定数や文字列などの読み取り専用データ)などのセクションにコードを分割することをサポートする場合があります。
実行可能ファイルには通常、ランタイム システムが含まれています。このランタイム システムでは、ランタイム言語の機能 (タスク スケジューリング、例外処理、静的コンストラクタとデストラクタの呼び出しなど) とオペレーティングシステムとのやり取り (特に引数、環境の受け渡し、終了ステータスの返却)、およびファイル ハンドルなどのリソースの解放などのその他の起動およびシャットダウン機能が実装されます。C 言語では、これは実際のエントリ ポイントを含むcrt0オブジェクトをリンクすることによって行われ、ランタイム ライブラリを呼び出すことによってセットアップとシャットダウンが行われます。[ 6 ]したがって、実行可能ファイルには、ソース コードから直接生成されたコード以外にも重要なコードが含まれる場合があります。組み込みシステムなど、場合によってはこれを省略することが望ましい場合があります。C 言語では、通常のランタイムを省略し、代わりにエントリ ポイントを生成し、起動とシャットダウンを処理するリンカ スクリプトを明示的に指定することによってこれを行うことができます。たとえば、mainstart 関数を呼び出し、最後にカーネルに終了ステータスを返します。[ 7 ]
実行可能ファイルであるためには、システムのアプリケーションバイナリインターフェイス(ABI)に準拠する必要があります。単純なインターフェイスでは、ファイルをメモリにロードし、アドレス空間の先頭にジャンプしてそこから実行することでファイルが実行されます。[ 8 ]より複雑なインターフェイスでは、実行可能ファイルには追加のメタデータがあり、プログラムのロード時に実行される再配置や、実行を開始するエントリポイントアドレスを指定できます。[ 9 ]