現代の高級言語には、一般的に3つの実行モードがあります:
Interpreted ある言語で書かれたコードが解釈されると、その構文が読み込まれた後、コンパイルの段階を経ずに直接実行されます。 インタープリターと呼ばれるプログラムが、プログラムの流れに沿って各プログラム文を読み、何をすべきかを判断して実行します。 インタープリタとコンパイラのハイブリッドは、ステートメントをマシンコードにコンパイルして実行し、マシンコードは破棄され、その行が再び実行されるときに新たに解釈される。 インタープリタは、ここに挙げた他の2つの種類に比べて、言語の動作を最もシンプルに実装したものである。 コンパイル ある言語で書かれたコードがコンパイルされると、その構文は実行前に実行可能な形式に変換される。 コンパイルには2つの種類がある。 機械語生成 一部のコンパイラは、ソースコードを直接機械語にコンパイルする。 これが本来のコンパイル方法であり、このように直接かつ完全にマシンネイティブなコードに変換された言語を真のコンパイル言語と呼ぶことがある。 アセンブリ言語を参照。 中間表現 ある言語で書かれたコードを中間表現にコンパイルすると、その表現を最適化したり、保存したりすることで、ソースファイルを読み直すことなく実行することができる。 中間表現を保存する際には、バイトコードなどの形式で保存されることがある。 中間表現を実行するためには、その中間表現を解釈したり、さらにコンパイルしたりする必要があります。 バイトコードを直接実行したり、機械語に変換したりする仮想マシンによって、かつては明確だった中間表現と真の意味でのコンパイル言語との区別が曖昧になっている。 ソースからソースへの翻訳またはトランスコンパイル ある言語で書かれたコードを、ネイティブコードのコンパイラがすでに普及している低レベルの言語の用語に翻訳することがある。 JavaScriptやC言語は、このようなトランスレータの一般的なターゲットです。 CoffeeScript、Chicken Scheme、Eiffelなどもその例です。 具体的には、生成されたCやC++のコードは、コンパイルされたEiffelプロジェクトのEIFGENsディレクトリで見ることができます(EiffelStudio IDEを使用している場合は、Eiffel言語から生成されています)。 Eiffelでは、翻訳されたプロセスをトランスコンパイルまたはトランスコンパイルと呼び、Eiffelコンパイラをトランスコンパイラまたはソースツーソースコンパイラと呼んでいます。
なお、言語は厳密にはインタプリタ言語やコンパイル言語ではありません。 むしろ、言語の動作の実装には、インタプリタやコンパイルが使われています。 例えば、ALGOL 60とFortranは、どちらも(より一般的にはコンパイルされていたにもかかわらず)解釈されています。 Javaはバイトコードにコンパイルされ、解釈(Java仮想マシン(JVM)内)またはコンパイル(通常、HotSpotのようなジャストインタイム・コンパイラを使用し、やはりJVM内)によって実行されます。
高レベル言語のコンピュータ アーキテクチャ
逆に、高レベル言語をコンピュータに直接実装することも可能です。 これは、高レベル言語コンピュータ・アーキテクチャと呼ばれ、コンピュータ・アーキテクチャ自体が特定の高レベル言語をターゲットとして設計されています。 例えば、バローズの大型システムは、ALGOL 60のターゲットマシンでした。