-4

最近、私は言語開発に非常に興味を持っており、複数のフロント エンドが動作し、コードを実行するためのさまざまなシステムを持っています。仮想マシン型システムの開発を試みたいと決めました。(JVMに似ていますが、もちろんもっと単純です)スタックとレジスタを備えた基本的な作業命令セットを作成できましたが、いくつかの実装方法に興味があります.

たとえば Java では、プログラムを作成した後、それを Java コンパイラでコンパイルすると、JVM が実行するバイナリ (.class) が作成されます。これがどのように行われるのか、JVM はこのバイナリをどのように解釈するのか、人間が読める命令からこのバイナリへの移行は何なのか、どうすれば同様のものを作成できるのかわかりません。

ヘルプ/提案をありがとう!

4

3 に答える 3

0

コンパイラが行うことは、ターゲットが実マシンであろうと仮想マシンであろうと、文字列を文字列に変換することだけです。独自のターゲット VM を構築しているため、既存の仮想マシンまたは物理マシンの命令セットとは異なるエンコード方法を使用する場合がありますが、それは実際には変わりません。すべての物理マシンの命令セットはソフトウェアでエミュレートでき、すべての仮想マシンの命令セットはハードウェアで実行できます (ただし、仮想マシン用に設計された命令セットはハードウェアの予算が許すよりもはるかに複雑になる可能性があるため、これは実際には少し難しくなる可能性があります)。結局のところ、CPU は命令セットのインタープリターにすぎません。

これについては、コンパイラの書籍で詳しく説明する必要がありますが、コンパイル プロセスは物理マシンでも仮想マシンでも同じです。一般に、ソース言語をソース コード抽象構文木 (AST) に解析することから始める必要があります。次に、このソース AST をターゲット AST に変換する翻訳が必要です(ただし、ターゲット言語は一般にソース言語よりもはるかにフラットですが、したがって、実際にはツリーは必要ないかもしれませんが、通常は配列で十分です)、コード生成が必要ですターゲット AST をバイトコードに変換します (これは通常、ターゲット AST ノードからバイトコードへの 1 対 1 の変換です)。複雑な構文を持つ言語の場合、ソース AST を形成する前に、具体的な構文ツリー (解析ツリー) を形成する中間解析ステージが必要になる場合があります。また、一部のコンパイラは複数の変換ステージを使用する場合があり、その間に最適化トランスレータが含まれる場合があります。それらは小さな違いです。

于 2013-09-11T23:40:41.573 に答える