3

割り当ての目的が、C言語のサブセットで動作するコンパイラーを作成することであるとします(オブジェクトとして複雑なものを持たずに、基本的なスクリプト表現力をサポートするだけで、任意の言語のサブセットを想定できます)。

コンパイラの正しさを検証するために、どのような種類の中間コードを使用できますか?私は教授と話していましたが、彼は「コンパイルされたコード」に使用されるVMとして学生に何を与えるべきかわからなかったという事実について話しました。そのため、どちらが良い解決策になるのか疑問に思いました。

Subset of C -> Compiler -> Code? -> VM

このコードは、バイナリ形式またはASCII形式(疑似asmなど)のいずれかである可能性があります。

この中間コードとVMを構造化する方法ではなく、コンパイル済みプログラムのテストに使用できる簡単でシンプルなものを探しています。

4

5 に答える 5

2

いくつかの抽象マシン設計を記述してから、リスト形式の命令セットを提供することができます。私の小さなLISPパーサーは、パーサーでは簡単です。

(label add-two)
(init-stack-frame 2)
(load r1 0)
(load r2 1)
(add val r1 r2)
(goto cont)

また、これを読み込むためのlispインタプリタを書くのは簡単です。

load_labels (index, expr, env)
    if expr.first == 'label'
        env.set(expr.second, index)

interpret (machine, expr, env)
    return env.lookup(expr.first).eval(machine, expr.tail)
于 2010-07-19T15:37:39.570 に答える
1

既存のVMに中間コード/バイトコードの多くの例があります。定義に応じて、単純な場合とそうでない場合があります。例:

于 2010-07-19T15:52:48.480 に答える
0

スクリプト言語(JavaScriptなど)にコンパイルするのはどうですか?人間が読める形式で、すでに作成されています。

于 2010-07-19T15:18:47.867 に答える
0

Java仮想マシンをターゲットにするのはどうですか?どれほど単純かはわかりませんが、十分に文書化されているため、興味のある学生は、amazon.comにアクセスして、中間コードの実際の意味とvmの動作についての本を入手できます。

また、実際の80x86または68000アセンブリを作成し、アセンブラーを使用してマシンコードを取得し、エミュレーターを使用して実行することもできます。実際のハードウェアは、コンパイラの作成をすでに完了していて、すでに多数のデバッガやその他のユーティリティが利用可能である場合、いくつかの構成されたVMほど複雑ではありません。

しかし、私はLISPの提案が好きです:-)

于 2010-07-19T15:38:07.630 に答える
0

llvmはどうですか?

于 2010-07-19T15:43:41.777 に答える