
2026/02/21 23:14
自分で Forth インタプリタを構築する
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
本稿では、最小限の Forth スタイルインタープリターを構築する方法について説明しています。
主な機能: 各プロンプト前にスタックを表示し、をプロンプトとして使用し、ok>で終了する REPL が提供されます。整数入力と基本的な算術演算(bye、+、-、*、/)をサポートします。スタック操作語にはmod、dup、drop、rot、overがあり、いずれも古典的な Forth と同じ動作をします。出力語としてswap,.,emit, そして数値・文字・改行・文字列を印刷するためのcrが含まれます。." "
言語構文: 単語定義は…:形式で記述され、コメントは;内に書かれます。未定義の単語が呼び出された場合、その単語名と疑問符(?)を表示します。( … )
制御フロー: 真偽比較演算子(,<,>,=)および論理演算子(<>,and,or)により、条件ブロック(invert/if…then)が可能です。ループはif…else…thenで実装されます。do … loop
スクリプト実行: インタープリターはファイル引数として渡されたスクリプトを実行でき、フィボナッチや FizzBuzz のような完全なプログラムを書くことができます。例として,fib,fizz,buzz,fizz-buzzなどの関数が挙げられます。do-fizz-buzz
学習リソース: 本文は Leo Brodie の「Starting FORTH」、Easy Forth、および Forth 学習に関する Coding Challenges ブログ投稿を参照しています。
コミュニティとアウトリーチ: 読者には GitHub、GitLab、Discord、Twitter、LinkedIn、または Shared Solutions リポジトリで解決策を共有するよう促されます。学習者の関心を維持するために SubStack を通じて毎週のコーディングチャレンジニュースレターも提供されています。
この改訂された要約は、主要なポイントすべてを網羅し、推測を避け、読者に対して明確かつ簡潔な概要を提示しています。
本文
Forth風インタープリタの構築
Forth インタープリタはスタック指向言語で、逆ポーランド記法(RPN)を使って Fibonacci や FizzBuzz などを書けます。
以下では自分で作るためのステップ・バイ・ステップガイドを紹介します。
ステップ 0 – プラットフォームを決める
| 質問 | 選択肢 |
|---|---|
| 解決策のタイプ | • Web‑ベース(フロントエンドのみ/フルスタック) • デスクトップまたはモバイル GUI • CLI ツール(推奨) |
| 言語 | 自分が得意な言語を選ぶ(例:Python、Go、Rust など)。 |
簡単に Forth を学びたい方は次の資料も読むと良いでしょう:
- Starting FORTH – Leo Brodie 著
- Easy Forth – オンライン e‑book と統合インタープリタ付き
ステップ 1 – 基本的な REPL
ok> というプロンプトを表示し、ユーザーが bye を入力すると終了する Read–Eval–Print Loop(REPL)を実装します。
例:
% ./ccforthok> 1 2 + . cr 3 ok>
ステップ 2 – 数値と算術
整数トークンが読み込まれたら、データスタックに積みます。
以下の演算子をサポートします(各々 2 つの数値を取り出し、結果をプッシュ):
| ワード | 説明 |
|---|---|
| |
| |
| |
| |
| |
各プロンプトの前にスタック内容(下から上)を表示します。
ステップ 3 – スタック操作
以下のワードを追加します:
| ワード | 説明 |
|---|---|
| |
| |
| |
| |
| |
ステップ 4 – 入出力ワード
実装すべきワードは次の通りです:
| ワード | 説明 |
|---|---|
| → 先頭要素を表示してポップ |
| → ASCII 文字として出力し、ポップ |
| → 改行 |
| 引用符付き文字列を表示(前の空白は無視) |
例:
ok> 5 . cr 78 72 79 74 emit emit emit emit cr JOHN ok>
ステップ 5 – 単語定義とコメント
- 単語定義:
: name … ;
例:: say-hi ." Hi, John" cr ; - 未定義ワード: 未定義の単語が現れたら、その単語に
を付けて表示する。? - コメント: 括弧
内のテキストはすべて無視する。( … )
ステップ 6 – 条件分岐とループ
真偽を
-1(true)または 0(false)で表す比較ワードを追加します:
| ワード | 説明 |
|---|---|
| |
| |
| |
| |
| |
| |
| |
これらを使って次の構造を実装します:
- If‑then
: buzz 5 mod 0 = if ." Buzz" then ; - If‑else‑then
5 3 = if ." Equal" else ." Not Equal" then - Do‑loop
: loop5 5 0 do ." Test" cr loop ; loop5
ステップ 7 – スクリプトファイル
コマンドラインで指定したファイルを実行できるようにします。
上記機能が揃っていれば、次のようなスクリプトも走らせられます:
: fib over over + ; \ 次のフィボナッチ数を生成 : fibn 10 1 do fib dup . loop ; 0 dup . 1 dup . fibn cr \ 最初の10個のフィボナッチ数を出力 : fizz 3 mod 0 = dup if ." Fizz" then ; : buzz 5 mod 0 = dup if ." Buzz" then ; : fizz-buzz dup fizz swap buzz or invert ; : do-fizz-buzz 25 1 do cr i fizz-buzz if i . then loop ; do-fizz-buzz
さらに進めるには
- Forth 標準を詳しく学ぶ。
やvariable
など、より高度なワードを追加する。constant- ネイティブコードへのコンパイルや LLVM の利用を試す。
実装が完成したら GitHub、Discord、Twitter、LinkedIn 等で共有してみてください。ハッキングをお楽しみください!