コンパイラが行うことは、ターゲットが実マシンであろうと仮想マシンであろうと、文字列を文字列に変換することだけです。独自のターゲット VM を構築しているため、既存の仮想マシンまたは物理マシンの命令セットとは異なるエンコード方法を使用する場合がありますが、それは実際には変わりません。すべての物理マシンの命令セットはソフトウェアでエミュレートでき、すべての仮想マシンの命令セットはハードウェアで実行できます (ただし、仮想マシン用に設計された命令セットはハードウェアの予算が許すよりもはるかに複雑になる可能性があるため、これは実際には少し難しくなる可能性があります)。結局のところ、CPU は命令セットのインタープリターにすぎません。
これについては、コンパイラの書籍で詳しく説明する必要がありますが、コンパイル プロセスは物理マシンでも仮想マシンでも同じです。一般に、ソース言語をソース コード抽象構文木 (AST) に解析することから始める必要があります。次に、このソース AST をターゲット AST に変換する翻訳が必要です(ただし、ターゲット言語は一般にソース言語よりもはるかにフラットですが、したがって、実際にはツリーは必要ないかもしれませんが、通常は配列で十分です)、コード生成が必要ですターゲット AST をバイトコードに変換します (これは通常、ターゲット AST ノードからバイトコードへの 1 対 1 の変換です)。複雑な構文を持つ言語の場合、ソース AST を形成する前に、具体的な構文ツリー (解析ツリー) を形成する中間解析ステージが必要になる場合があります。また、一部のコンパイラは複数の変換ステージを使用する場合があり、その間に最適化トランスレータが含まれる場合があります。それらは小さな違いです。