Forth
1970年に Charles Moore が開発したスタック指向プログラミング言語。
プログラマ向けの一言
自分自身のコンパイラを数KBで書ける言語。 変数なし、構文なし、スタックとワード(関数)定義だけ。極限までミニマル。
コードで理解する
\ 数値をスタックに積む
3 4 + \ → 7 がスタックに残る
\ ワード(= 関数)を定義
: square ( n -- n^2 ) dup * ;
5 square \ → 25
\ フィボナッチ
: fib ( n -- fib(n) )
0 1 rot 0 do
over + swap
loop drop ;
10 fib \ → 55
\ 条件分岐
: abs ( n -- |n| )
dup 0 < if negate then ;
-5 abs \ → 5
// 上の square を TypeScript のスタックマシンで表現すると:
// "5 dup *"
// ステップ1: push(5) → [5]
// ステップ2: dup → [5, 5]
// ステップ3: * → [25]
なぜ重要か
// 1. 究極のミニマリズム
// Forth のコンパイラ全体が数KB〜数十KBに収まる
// → 組み込みシステム、宇宙探査機(Philae 着陸機)で使われた
// 2. 拡張 = 言語そのものを作ること
// 新しいワードを定義 = 言語を拡張
// if/then/else すら Forth のワードとして定義されている
// → メタプログラミングの極致
// 3. 教育的価値
// スタック、辞書、インタプリタ/コンパイラの仕組みを
// 最小限の複雑さで理解できる
構造
入力 → 字句解析(スペースで分割するだけ) → 辞書検索
↓ ↓
数値なら push ワードなら実行
- 辞書: ワード名 → 実行コードの連想リスト
- データスタック: 計算用
- リターンスタック: ワード呼び出しの戻りアドレス
関連
- スタック指向プログラミング — Forth が体現するパラダイム
- LISP — 同じく「言語自体を拡張する言語」だが、リスト vs スタックで対照的
- プログラミング言語