すべての汎用 CPU には独自の命令セットがあります。つまり、特定のバイト シーケンスが実行されると、よく知られており、文書化されているように、レジスタとメモリに影響を及ぼします。アセンブリ言語は、これらの命令を書き留める便利な方法です。これにより、人間は命令を読み書きし、常にコマンドを検索しなくても命令の動作を理解できます。最新のすべてのCPU にアセンブリ言語が存在すると言っても過言ではありません。
さて、プログラムをアセンブリに変換するかどうかについて。CPU はアセンブリ コードを実行しないということから始めましょう。マシン コードを実行しますが、マシン コードのコマンドとアセンブリ ラインの間には 1 対 1 の対応があります。その区別を念頭に置いている限り、「CPU が MOV を実行し、次に ADD を実行する」などと言うことができます。もちろん、CPUはMOVコマンドに対応するマシンコードを実行します。
つまり、言語がネイティブ コードにコンパイルされる場合、実際には、プログラムは実行前にマシン コードに変換されます。一部のコンパイラ (すべてではありません) は、アセンブリ ソースを発行し、アセンブラに最終ステップを実行させることでこれを行います。このステップが存在する場合、通常は十分に隠されています。アセンブリ表現は、コンパイラにそのまま保持するように指示しない限り、コンパイル プロセス中に短時間だけ存在します。
他のコンパイラはアセンブリ ステップを使用しませんが、必要に応じてアセンブリを発行します。たとえば、Microsoft C++ はオプション /FA を使用して、アセンブリ リストをオブジェクト ファイルと共に出力します。
インタープリター言語の場合、機械への明示的な変換はありません。ソース行は、言語インタープリターによって実行されます。バイトコード指向の言語 (Java、Visual Basic) はその中間に位置します。それらは機械語と同じではないコードにコンパイルされますが、高レベルのソースよりも解釈がはるかに簡単です。それらについては、機械語に変換されていないと言っても過言ではありません。