プログラマの観点
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2022/03/10 20:29 UTC 版)
「逆ポーランド記法」も参照 Forthの後置記法は、データスタック(オペランドスタック、以下単にスタックと呼ぶ)を意識的に操作しなければならないというForthの特徴と密接に結びついている。すなわち、オペランドはそのままスタックに積まれ、後から現れる演算子などはスタックからそれを取り出して演算し、結果をスタックに積む、といったように動作する。多くの言語と違い、バッカス・ナウア記法で構文が定義されているわけでもなく、伝統的にはコンパイラは、スレッデッドコードと呼ばれるシンプルな構造の目的コードを直接生成するだけである。また、文法の修正のような、多くの言語では実装の内部に手を入れる変更が必要なことが、Forthではそのようなワードを定義することで可能である(これは、Lispのマクロに少し似ている)。なお、データスタックの他にリターンスタックがあり、そちらはワードの呼出しの後で手続きを再開するアドレス等が積まれるスタックである(CPUのいわゆるスタックに似ている)。 たとえば、25 * 10 + 50 は、次のように入力して計算する(「⏎」は、改行の入力。「ok」はForth処理系が結果の出力の後に付けるプロンプト)。 25 10 * 50 + . ⏎300 ok まず最初に数値 25 と 10 がこの順でスタックに積まれる。 ワード * がスタックの一番上にあるふたつの数を乗算し、その積に置き換える。 それから数値 50 をスタックに積む。 ワード + がこれに先ほどの積を加算する。最後に、. コマンドがスタックのトップを取り出して、それを、ユーザの端末に結果として出力する。 4 5 + . これは、スタックに4を積み、さらに5を積み、スタック上の2つの値を取り出して加算、その結果をスタックに戻し、スタックの値を表示する操作を示している。 上記のように入力してエンター(⏎:リターン)を打鍵すると、画面上には下記のように結果が表示される。 4 5 + . ⏎9 ok Forth の構造化機能でさえもスタックベースである。たとえば、 : FLOOR5 (n -- n') DUP 6 < IF DROP 5 ELSE 1 - THEN ; このコードは 次のコマンドを使うことによって FLOOR5 が呼ばれる新しいワード(繰り返すが、「ワード」という単語はサブルーチンとして使われている)を定義する。DUPはスタックの数値を複製する。6がスタックの一番上に 6 を配置する。ワード < はスタックの一番上の二つの数(6 と DUP で複製された入力の値)を比較し、真偽値で置き換える。IFは真偽値をとり、その直後のコマンドを実行するか、ELSEまでスキップするかを選択する。DROPはスタックの上の値を放棄する。そして、THENは条件分岐の終端である。括弧に囲まれたテキストは、このワードが期待するスタックの数と値を返すかどうかを説明するコメントである。ワード FLOOR5 はC言語で書かれた次の関数に相当する。 int floor5(int v) { return v < 6 ? 5 : v - 1; } この関数はより簡潔につぎのように書かれる。 : FLOOR5 (n -- n') 1- 5 MAX ; このワードは次のように実行できる。 1 FLOOR5 . ⏎5 ok8 FLOOR5 . ⏎7 ok 最初にインタプリタは数値 1(もしくは 8)をスタックにプッシュし、それからこの数値を再びポップし結果をプッシュする FLOOR5 を呼び出す。最後に、「.」の呼び出しは値をポップし、ユーザの端末にそれを表示する。
※この「プログラマの観点」の解説は、「Forth」の解説の一部です。
「プログラマの観点」を含む「Forth」の記事については、「Forth」の概要を参照ください。
- プログラマの観点のページへのリンク