世界を動かす技術を、日本語で。

フォース: 自己生成するプログラミング言語

2025年10月20日原文(ratfactor.com)

概要

  • 本記事は Forth言語 の発見と、その歴史的文脈についての 筆者自身の体験記
  • Charles H. Moore によるForthの「シンプルさ」への追求を中心テーマとする
  • Forthの特徴的な RPN記法スタックベース設計 について解説
  • Forthの誤解や魅力、他言語との比較を通じて プログラミング思考の変化 を語る
  • Concatenative programming など高度な概念にも触れる

Charles H. Mooreとシンプルさの追求

  • 筆者が Forth に興味を持ったきっかけは、 Usenet 時代の伝説や逸話との出会い
  • 1990年代の comp.lang. *グループでの議論や、Perlの流行の記憶
  • 本やネットの情報だけでなく、 コミュニティのフォークロア が学びの中心だった時代背景
  • Forthは「整数の値さえ自由に変えられる」という 柔軟性 を持つ言語として語られていた
  • ゲーム開発者James Hagueのブログ「programming in the twenty-first century」がForth再挑戦の後押しに

Forthの伝説とRPN記法

  • Forthの 最大の特徴 は、 後置記法(RPN: Reverse Polish Notation) の採用
  • RPNは「3 4 +」のように、 演算子を後ろに書く ことでカッコなしで計算式を記述可能
  • HP-35電卓のような RPN電卓 が一時代を築き、RPNの知名度を高めた
  • Unixの dcbc プログラムもRPNやインフィックス記法の例として紹介
  • RPNは 計算の順序や入れ子構造をシンプルに表現 できる利点を持つ

スタックベース設計

  • Forthは データスタック を中心に設計された スタックベース言語

  • 「PUSH」「POP」「SWAP」「DUP」などの スタック操作命令 が基本

  • スタックを使うことで 中間値に名前を付けずに処理を進められる

  • 例:「3 4 * 5 6 * + .」のようなコードで、 逐次的にスタックを操作し計算

  • スタック利用により 冗長な変数名や一時変数が不要 となり、コードの簡潔さを実現

    • 体言止め例:
      • スタック操作による計算過程の明示
      • 命名不要な中間値の処理
      • スタックの状態遷移

Forthのユーモアと表現力

  • Forthでは「CAKE DUP HAVE EAT」のような 英語的表現 も可能
  • 適切な単語選択 で、詩的またはユーモラスなコード表現が可能
  • スタック利用 により、 暗黙的処理 (implicit programming)が自然に実現
  • 名前付けの煩雑さからの解放と コードの簡潔化
  • 命名不要な処理の快適さと、 point-freeプログラミング との親和性

Forthの本質と誤解

  • Forthは RPN記法スタックベース だけでは語り尽くせない
  • Concatenative programming という新たな概念への到達
  • Forthの学びは「見た目」や「構文」以上に 歴史的文脈や設計思想 の理解が重要
  • シンプルさと柔軟性 の追求がForthの真髄
  • Charles H. Moore の思想に触れることで、 プログラミング観の転換 を体験

このように、ForthやCharles H. Mooreの「シンプルさ」へのこだわりは、単なる言語仕様を超えた 思想的・歴史的意義 を持つ。 RPN記法スタックベース の背後にある「なぜそうなったのか」、 Concatenative programming 的な発想が、現代のプログラミングにも新たな視点を与えている。

Hackerたちの意見

なんでこんな言語は広がらないんだろう? 忘れられた強力な言語って、これが初めてじゃないよね。他にもSmallTalkやCommon Lisp(コミュニティが小さい)なんかがある。もしかして、ある言語は「強すぎる」から? それって、私たちの業界についてどういうことを示してるんだろう? まだそんなに進化してないってこと? そう思うのは、簡単な言語(Python、Ruby、JSとか)が圧倒的に主流になってるから。

よりシンプルな説明をすると、Forthではスタックを維持しなきゃいけなくて、そのスタックの変更を短期記憶に留める必要があるんだ。大体、3つの数字だけだけどね。一方でCとかだと、ページの下を見れば変数があるから、短期記憶への負担がずっと少ない。よく書かれた高レベルのForthの単語は、その制約を超えて、Cではなかなか見られないほど読みやすいことが多い。ただ、他のプログラマーが元の問題解決者と同じように問題を見えるべきだとは期待されるべきじゃないっていう議論もあるよね。

聞いた話だと、Forthでは基本的に環境がそれぞれ違って、すごくカスタマイズされてるから、結局は各Forthプログラマーが自分のニーズに合わせた言語を作ることになるんだ。だから、こういうのはコラボレーションがちょっと難しい。僕が知ってる唯一の真剣なForthプログラマーは、森の中で一人でやってる人なんだ。美的な観点からは、この言語がすごく好きだけど、特に協力して物事を進めるのにはどうかな? でも、もしかしたら誰かがその状況を変えるためのツールを作るかもしれないね。

プログラミング言語の有用性を測るのに「力」ってあんまり役に立たないと思う。プログラムを指定する観点から考えると、プログラミング言語ができる最も役立つことの一つは、書けないプログラムを排除することなんだ。そういう意味では、制約は欠点じゃなくて、むしろ特徴なんだよね。

僕が働いてたところには、大きなForthのコードベースがあって、ミッションクリティカルなことをやってたんだ。それを理解するまでが大変だったけど、すごく面白かったし、何百人、何千人もの人が触れたり、作業したり、学んだりしてた。でも、平均的な開発者にはかなり厳しい道のりだったから、結局、同じものをクソみたいなほぼCの解釈言語で作り直すことにしたんだ。確かに、そうすることで多くの人が理解しやすくなったけど、解決策はあまりエレガントじゃなかった。

残念ながら、私たちの業界は主にレンガ職人のようなもので、低賃金で使い捨ての従業員を扱う技術に走りがちなんだ。SVスタイルの大規模な給与は、世界中どこでも見られるわけじゃない。多くの国では、GitやOfficeを使っているかどうかに関わらず、オフィスワーカーの給料は似たり寄ったりだよ。

キャリアの初期に、たくさんのPerlを使っている職場で働けたのはラッキーだったし、Damian Conwayの『Object Oriented Perl』を読めたのも良かった。あの本は本当に素晴らしくて、私の考えを広げてくれた。オブジェクト指向プログラミングのさまざまなアプローチの例がたくさん載っていて、私が夢にも思わなかったほどの内容だった。そして、それらをすべてPerlで実装する方法も示してくれた。すごい力だよ! Perlのモットー「やり方はいくつもある」にぴったり合ってた。でも、私たちのコードベースにはやり方がいくつもあって、異なる部分が互換性のないオブジェクトシステムを使ってたから、全部を学んで互いに動かすのは大変だった。後に、オブジェクト指向プログラミングの一つのスタイルだけをサポートする言語に移れたのはホッとしたよ。

強力な言語は人々に不必要に複雑なことをさせるんだ。不必要に複雑なことは理解しにくい。理解しにくいのは良くない。重要なコードは、書かれるよりもずっと多くの回数読まれたり拡張されたりするから、シンプルさが実際には他の多くのことよりも優れているよ。

それは別の時代のための別の解決策だね。Forthは、最小限のアセンブリ言語で自己ホストできる強力で表現力豊かなプログラミング言語を書くための素晴らしい方法だった。Forthが最初に開発された冷蔵庫サイズのコンピュータは、メモリが二桁キロバイト(たぶん8192kワード、16ビットワード)で、指示を300kHzくらいで処理してた。今のキーボードのCaps Lock LEDを動かすマイクロコントローラーは、100倍速くて100倍のメモリを持ってる。今は、エディタ、コンパイラ、ターゲットバイナリをそんな小さなマシンに詰め込む必要はないんだ。マイクロコントローラー用に開発するなら、単に「大きな」コンピュータでCを使えばいいし、想像を超えるほど強力だよ。1990年代の昔、私はZ80でForthをターゲットにした組み込みシステムの開発環境を使ってたけど、それは少なくとも10年前のもので、当時は5年も古かった。今、あなたが私の言葉を半分のサンドイッチのサイズのガラスのスライスで読んでいるなら、それはForthが最初に書かれた時の世界中のコンピューティングパワーよりも遥かに多いんだ。Forthのようなものをゼロから書くのは素晴らしい経験で、(レジスタをロードしてACIAを始動させて端末にテキストを送信するためのアセンブリコードのことね)エミュレートされた80年代初期のホームコンピュータでやるのは、背後にあるチップが何をしているのかを理解するのに良い方法だと思うし、それが「本物」の言語、例えばGoやPythonやCのプログラマーとしてのスキルを向上させると思う。

どうしてこういう言語はスケールしないんだろう?スタニスラフ・ダツコフスキーがうまく説明してるよね。

これはシンプルな抽象化の状況で、すべてを含むプログラミング環境への移行だと思う。ジョーディ・ラフォージは、エンタープライズであまりコードを書かない。彼は単にコンピュータに異常のモデルを作ってもらって、アイデアをテストするんだ。ある意味、Pythonのような現代の言語は(LLMが出る前から)その現実にかなり近づける。もちろん、言語の基本を知っておく必要はあったけど、それはかなり最小限で、基本的なビルディングブロックを使ってライブラリを組み合わせてアプリケーションを作ることができた。Pythonには、ほとんど何でもできる良いライブラリがあって、これが標準だから、タスクにあまり時間がかからないのが期待される。自分のnumpyやscipyのライブラリを使った解決策を作るのに3年かかるなんて、上司には言えないよ。ライブラリを組み合わせるのが求められてるんだ。だからMITはSICPをSchemeからPythonに移したんだよ。全然違う世界だよ。Forthでは、すべてのプログラムが問題の完全な解決策をゼロからまとめた芸術作品なんだ。その創造者であるチャック・ムーアは、自分のForthソフトウェアと最適に動作するチップを自分で製造するほどのレベルに達してる。この言語たちはライブラリを持っていたけど、簡単に共有できなかったし、PerlのCPANができる前はリポジトリもなかった。Perlはしばらくの間人気があったけど、Pythonは組み込みのオブジェクト指向を持つシンプルな言語で勝った(Perlのアプローチは本当にハッキーな組み込みオブジェクト指向か、ライブラリをダウンロードする必要があったから)。正直なところ、私は10年間いろんな言語(Common Lisp、Prolog、APL、C、Ada、Smalltalk、Perl、C#、C++、Tcl、Lua、Rustなど)を試して、最適なものを探してたけど、専門家にはなれなかった。でも、自分のニーズに合ったものとして、Pythonが一番だと結論づけた。Common Lispの本を読むのに多くの時間を無駄にしたけど、Pythonで同じことをする方がずっと簡単だった。ゲームエンジンを作るようなことをしているなら、あなたの経験は変わるだろうけど、多くの人はプロセスの自動化やそんな感じのことをやっていて、Pythonの方がCommon Lispよりも環境やツールの利点から優れている。あと、PythonはLispほど概念的に美しくはないけど、学ぶのはずっと簡単だと思った。構文が自分に合ってて、好きな人もいるよね。

多くの人がLispのシンプルさを持ち上げるけど、Forthも似たようなもので、あまり評価されてないよね。悲しいことに、僕がForthで書いたコードは... PostScriptだけなんだ。そう、PostScriptはForthの方言なんだよ。子供の頃、Apple ][でのGraFORTHのデモにすごく感動したんだ。3Dワイヤーフレームアニメーションがあって、当時は魔法みたいだった。

Hacker Newsで議論の続きを見る