デジタル・コンピュータは、人間が話す言語を理解しない。 マシン・コードは、各命令が2進数またはビット(すなわち1と0)の文字列として表現された、単純なコンピュータ命令のシーケンスで構成されています。 異なるコンピュータは、通常、異なる機械語を「話す」または「理解する」。 例えば、あるコンピュータはADD演算を10011111
と表現し、別のコンピュータは同じ演算を000110
と表現することがある。 さらに、プログラムが実行されると、オペレーティング システム(Windows、Linux、OS X など)がホスト環境として機能し、プログラムにサービスを提供します。 残念ながら、プログラムがこれらのサービスにアクセスする方法も、オペレーティングシステムごとに異なっています。 機械語とオペレーティングシステムの要件が異なるため、機械語で書かれたプログラムは、プログラムがどのように問題を解決するかよりも、プログラムを実行するシステムに重点を置いています。 さらに、何らかの翻訳サービス(通常は仮想マシンの形で)を提供しなければ、異なるコンピュータ間でマシン・コードを移動させることは不可能であることも意味している。 その解決策として、問題をより重視し、プログラムを実行するシステム(ハードウェアとオペレーティング システム)をあまり重視しない、より高度なプログラミング言語を開発した(図 2 参照)。 しかし、コンピュータは通常、高級言語で書かれたプログラムを実行しないので、高級言語で書かれたプログラムを機械語に翻訳する何らかの方法が必要である。 コンパイラは、CやC++などの高級プログラミング言語で書かれた他のプログラムを、機械語やマシン語に翻訳するプログラムである。JavaやC#などの他の言語は、別のルートをとる。 JavaやC#のような他の言語は、別の方法でプログラムをコンパイルし、仮想マシンコードと呼ばれる中間表現(高級言語と機械語の中間の表現)を作成する。 仮想マシンコードは、インタープリターや仮想マシン(VM、ハードウェアCPUをシミュレートするプログラム)と呼ばれる別のプログラムの入力となる。
高レベル プログラミング言語で書かれたプログラムを実行する各アプローチには、利点と欠点があります。 完全にコンパイルされた言語 (例: C および C++) で書かれたプログラムは、部分的にコンパイルされた言語 (例: Java および C#) で書かれたプログラムよりも速く実行され、完全に解釈された言語 (例: Javascript および Perl) で書かれたプログラムよりもはるかに速く実行されます。 例えば、C++のプログラムがコンパイルされると、実行時間は1.0になる。 コンパイルしてからインタプリタする言語で書かれた同等のプログラムは、一般に時間3〜10で実行される。 純粋なインタプリタ言語として実行される同じプログラムは、約100の時間で実行される。 JavaやC#のVMの現代的な実装では、仮想コードの一部を処理しながら機械語にコンパイルするジャストインタイム(JIT)インタプリタが使用されています。 JIT処理系は、純粋なコンパイル言語系に比べて実行時間を約1.5倍に短縮する。 プログラミング言語Pythonは少し異なり、Pythonプログラムの主要部分はインタプリタ化されているが、比較的小さいため、全体の実行時間に与える影響は小さい。 プログラムがほとんどの時間を費やす Python ライブラリのほとんどは C で書かれているため、Python プログラムは同等の C プログラムとほぼ同じ速度で動作します。
一方で、純粋なコンパイラーによって生成された実行可能プログラムは、異種プラットフォーム間で転送することはできませんが(たとえば、Windows プログラムを Apple コンピューターで実行できません)、インタプリタ言語で書かれたプログラムは異なるコンピューター間でより簡単に移動することが可能です。 この移植性は、プラットフォーム(ハードウェアとオペレーティングシステムの組み合わせ)ごとにVMやインタープリターを提供することで実現されています。 インタープリタやVMは純粋にコンパイルされた言語で書かれたプログラムなので、移植性はないが、処理するプログラムは移植性がある
。