7

みなさん、こんにちは。現在、学習体験のための簡単なプログラミング言語を実装していますが、アドバイスが必要です。現在、通訳者を設計していますが、問題が発生しました。

私の言語はCのサブセットであり、スタックインタープリターの実装に関して問題があります。この言語では、以下がコンパイルされます。

somefunc ()
{
    1 + 2;
}

main ()
{
    somefunc ();
}

これで問題ありませんが、「1 + 2」が計算されると、結果がスタックにプッシュされ、関数が返されますが、スタックにはまだ数値があり、存在しないはずです。この問題を回避するにはどうすればよいですか?

関数呼び出しの前にスタックの「状態」を保存し、関数呼び出しの後に「状態」を復元することを考えました。たとえば、スタック上の要素の数を保存し、関数コードを実行して戻り、以前と同じ要素数になるまでスタックからポップします(または、関数が何かを返した場合は+1になる可能性があります)。

何か案は?ヒントをありがとう!

4

3 に答える 3

9

素晴らしい質問です!私の趣味の1つは、おもちゃの言語用のコンパイラーを作成することです。そのため、優れたプログラミングの好みに敬意を表します。

式ステートメントは、ステートメント内のコードが単なる式であるステートメントです。<expression> ;これは、割り当てや関数呼び出しなどを含むが、ifs、whiles、またはsを含まない形式のすべてを意味しreturnます。すべての式ステートメントは、最後にスタックに残った値を持ちますが、これは破棄する必要があります。

1 + 2は式ステートメントですが、これらも同様です。

  • x = 5;
    代入の結果は左側のオペランドの値であるため、 代入式は値5をスタックに残します。ステートメントが終了したら、未使用の値5をポップオフします。

  • printf("hello world!\n");
    printf()は、出力された文字数を返します。この値はスタックに残っているので、ステートメントが終了したらポップします。

事実上、式の型が。でない限り、すべての式ステートメントはスタックに値を残しますvoid。その場合、特殊なケースのvoidステートメントを使用して後で何もポップしないか、または「void」のふりをスタックにプッシュして、いつでも値をポップできるようにします。

于 2010-07-21T01:53:18.623 に答える
2

よりスマートなパーサーが必要になります。値が使用されていない式を見つけたら、POPを発行する必要があります。

于 2010-07-21T01:52:14.943 に答える
0

これは、最適化を学ぶ上で重要な機会です。あなたは数をするが整数の数学をする関数を持っています、intの数学の結果はいかなる方法、形、または形式でも使われません。

コンパイラに関数を最適化させることで、大量のバイトコードが生成され、無料で実行されるのを減らすことができます。

于 2017-06-27T22:26:43.117 に答える