コンピュータにおいて、実行とは、コンピュータプログラムが処理されて、プログラムに記述された動作を実行する過程のことです。プロセッサがプログラムの命令に従うにつれて、それらの命令の意味に従って効果が生じます。一般的に「実行」という用語は同義です。実行を開始する行為は、「実行」や「実行中」に加えて、「起動」や「呼び出し」と呼ばれることもよくあります。
実行プロセッサには様々な形態がある。マシンコードプログラムは、コンピュータのプログラマブルインターフェースを介して実行される場合があり、その実行では、制御装置によって実行される各プログラム命令に対して、フェッチ、デコード、実行のサイクルが繰り返し行われる。ソースコードは、インタプリタソフトウェアによって実行される場合もある。プログラムは、人間の介入なしにバッチ処理で実行される場合もあれば、ユーザーが対話型セッションでコマンドを入力する場合もある。
実行面はソフトウェア開発に影響を与え、また開発を推進する。
ソフトウェアは多くの場合、実行環境やホスト環境に合わせて調整された実行ライブラリなどの外部サービスに依存しており、実行ファイルをコンピュータとその周辺機器の直接操作から切り離し、よりプラットフォームに依存しないソリューションを提供する。
実行時エラーは、プログラムの実行後または実行中(実行状態)に検出されますが、コンパイル時エラーは、プログラムが実行される前にコンパイラによって検出されます。型チェック、レジスタ割り当て、コード生成、コード最適化は通常コンパイル時に行われますが、使用する言語やコンパイラによっては実行時に行われる場合もあります。他にも多くの実行時エラーが存在し、プログラミング言語によって処理方法が異なります。例えば、ゼロ除算エラー、ドメインエラー、配列の添え字範囲外エラー、算術アンダーフローエラー、数種類のアンダーフローエラーやオーバーフローエラー、その他多くの実行時エラーは、一般的にソフトウェアのバグとみなされ、特定のプログラミング言語で検出・処理される場合とされない場合があります。
例外処理は実行時エラーの処理をサポートし、予期せぬ状況や予測可能なエラー、異常な結果を、例外処理のない言語で必要とされるような大量のインラインエラーチェックを必要とせずに、構造化された方法で捕捉します。最近のランタイムエンジンの進歩により、自動例外処理が可能になり、関心のあるすべての例外について「根本原因」デバッグ情報を提供するようになりました。これは、特別なソフトウェア製品をランタイムエンジンに添付することで、ソースコードとは独立して実装されます。
デバッグの中には、実行時にしか実行できないもの(あるいは、実行時に実行する方が効率的または正確であるもの)があります。論理エラーや配列の境界チェックなどがその例です。そのため、高度なコンパイル時チェックやリリース前テストを実施しても、実際のデータを用いた本番環境でのテストが行われるまで、プログラミング上のバグが発見されない場合があります。このような場合、エンドユーザーは「実行時エラー」メッセージに遭遇する可能性があります。
実行環境とは、プログラムが実行されるコンテキストのことです。以下に、一般的に使用される環境属性を示します。これらの属性は厳密に区別されるものではなく、環境は複数の属性で記述される場合もあります。
ホストネイティブ方式は、特に歴史的に見て、一般的な実行シナリオです。これは、中央処理装置(CPU)の命令を介してコンピュータを制御する方式です。CPUは、機械語命令レベルでプログラムを解釈します。
コンテキスト切り替えは、マルチタスクオペレーティングシステム(OS)の機能であり、複数のホストネイティブ実行可能ファイルの同時実行をサポートします。実行可能ファイル(プロセスコンテキスト識別子で識別される)を実行環境からスワップアウトするために、OS はメモリページアドレスやレジスタ値などの実行コンテキストデータを保存します。スワップインに戻すには、OS はそのデータを復元します。[ 1 ] : 3.3 [ 2 ]
LinuxベースのOSでは、通常、レジスタに格納された一連のデータがメモリ内のプロセス記述子に保存され、コンテキストスイッチが実装されます。[ 1 ] PCIDも使用されます。
プログラムが起動されると、ローダーがメモリ設定を行い、必要な動的リンクライブラリとプログラムをリンクした後、プログラムのエントリポイントから実行が開始されます。言語や実装によっては、これらのタスクを言語ランタイムが実行する場合もありますが、これは一般的なコンシューマー向けオペレーティングシステム上の主流言語では稀です。
ランタイムシステムとは、実行可能ファイルにサービスを提供するソフトウェア層であり、実行モデルの一部です。関連して、ランタイム環境(RTE)とは、ランタイムシステムを含め、プログラムがやり取りできるすべてのものを指します。
ほとんどのプログラミング言語にはランタイムシステムが含まれています。ランタイムシステムは、メモリ管理、変数アクセス、パラメータ渡しメカニズム、オペレーティングシステムへのアクセスなど、さまざまな問題に対処する場合があります。コンパイラは、特定のランタイムシステムに応じて仮定を行い、コードを生成します。通常、ランタイムシステムはスタックとヒープの設定と管理に責任を持ち、ガベージコレクション、スレッド処理、その他の言語の動的機能などの機能が含まれる場合があります。 [ 3 ]
命令サイクルとは、CPUが起動時からコンピュータのシャットダウン時まで命令を処理するために実行する一連の動作のことです。命令サイクルは、フェッチ段階、デコード段階、実行段階という3つの主要な段階から構成されます。

より単純なCPUでは、命令サイクルは順次実行され、各命令は処理されてから次の命令が開始されます。ほとんどの最新のCPUでは、命令サイクルは命令パイプラインを介して並行して、多くの場合並列に実行されます。つまり、前の命令の処理が完了する前に次の命令の処理が開始されます。これは、サイクルが個別のステップに分割されているため可能です。[ 4 ]
仮想マシン(VM)は、物理コンピュータの機能の一部または全部をソフトウェア層として実装することで、ホストシステムに直接アクセスするのではなく、物理コンピュータの機能を提供します。仮想化によって、VMはホストコンピュータやホスト上の他のVMから論理的に独立したコンピュータシステムを提供します。これは、比較的薄いソフトウェア層を介して実現され、ホストの技術に制約されるという代償を伴いますが、比較的高いパフォーマンスを可能にします。エミュレーションによって、VMはホストコンピュータシステムの技術とは大きく異なる独自のコンピュータを提供しますが、一般的には、比較的厚いソフトウェア層のためにパフォーマンスが比較的遅くなるという代償を伴います。
VM技術は、その範囲によって異なる。システムVM(完全仮想化VMとも呼ばれる)は、独立したオペレーティングシステムを実行するために必要な機能を提供する。ハイパーバイザはネイティブ実行を使用してハードウェアを共有および管理し、互いに分離された複数の環境を同じ物理マシン上に存在させる。最新のハイパーバイザは、主にホストCPUからの仮想化専用ハードウェアであるハードウェア支援仮想化を使用する。これに対し、プロセスVM( .NET、Java、Pythonランタイムなど)は、プラットフォームに依存しない環境でコンピュータプログラムを実行する。
QEMUやビデオゲーム機エミュレータなど、一部のエミュレータは、異なるシステムアーキテクチャをエミュレート(または「仮想的に模倣」)するように設計されており、別のCPUやアーキテクチャ向けに作成されたソフトウェアアプリケーションやオペレーティングシステムを実行できます。OSレベルの仮想化により、カーネルを介してコンピュータのリソースを分割できます。これらの用語は必ずしも互換性があるわけではありません。
インタプリタは、直接実行可能な形式のコードを実行します。環境に必要な準備手順は既に完了しています。実行可能ファイルは、CPU(仮想CPUを含む)によって直接実行可能です。ソースコードは、それをサポートする環境で実行できます。例えば、JavaScriptやPythonは、コンパイル操作を必要としないインタプリタソフトウェアによって実行されます。