Forge: スタックベースのWeb開発アプローチ

現代のWeb開発の状況は、巨大なフレームワークや複雑なビルドパイプラインに支配されがちです。しかし、Forgeと呼ばれる新しい実験的なプロジェクトは、Forthにインスパイアされたスタックベース言語の原則をWebサイトの作成に適用することで、この規範からの急進的な脱却を提案しています。

HTML生成を一連のスタック操作として扱うことで、Forgeは開発者がページ構造やマイクロフォーマットを定義する方法を簡素化し、同時に現代的なブラウザ機能を活用してシームレスなユーザー体験を提供することを目指しています。

コアコンセプト: WebのためのForth

Forgeの本質は、スタックベース言語であることです。従来の命令型言語では、引数とともに関数を呼び出しますが、Forgeでは値をスタックにプッシュし、それらの値を消費する「word」 (関数) を呼び出出します。

例えば、Forgeでシンプルなヘッダーを作成する場合、次のようになります。

: h1  ( s -- )  "<h1>" emit  .  "</h1>" emit ;

"Hello, World!" h1

このスニペットでは、: h1 の定義が新しいwordを作成します。文字列 "Hello, World!" がスタックにプッシュされ、h1 というwordがその文字列を消費し、<h1> タグでラップします。このアプローチにより、開発者は再利用可能なwordのライブラリを構築し、効果的に、特定のサイトアーキテクチャに合わせたドメイン固有言語 (DSL) を作成することができます。

マイクロフォーマットによる高度な構造化

Forgeの主な強みの一つは、マイクロフォーマットのような複雑なHTML構造をいかに簡単に実装できるかという点です。divやspanの深い階層をネストさせる代わりに、開発者はボイラープレートを処理するための高レベルなwordを定義できます。

ブログ記事の本文定義を考えてみましょう。

: post-body
  h-entry-start
    "<p class='byline'>" emit
      "2026-05-21T14:00:00Z"  "May 21, 2026"  dt-published
      " · by " emit
      "Beto"  "/about"  p-author
    "</p>" emit
  h-entry-end

  "On building a tiny stack-based web language." p-summary
  "post-content"                                 e-content
  "/hello-world"  "permalink"                    u-url ;

"Hello, world!" "post-body" blog-post

h-entry-startp-summary のようなwordにHTMLタグを抽象化することで、コードはクリーンに保たれ、マークアップ言語の構文ではなくコンテンツに集中することができます。

ハイブリッドレンダリングアーキテクチャ

Forgeは、サーバーサイドレンダリング (SSR) とシングルページアプリケーション (SPA) の利点を融合させた、洗練されたデプロイメントモデルを採用しています。

  1. サーバーサイドレンダリング: 単一のバイナリがWebサイトを実行します。クローラーや初回訪問者がページにアクセスすると、バックエンドコンパイラが .forge ファイルからHTMLを生成し、提供します。これにより、サイトがSEOに強く、WebMentionsと互換性があることが保証されます。
  2. クライアントサイドレンダリング: サイトがロードされた後、サービスワーカーが後続のネットワークリクエストをインターセプトします。ユーザーが新しいページ (例: /notes) に遷移する際、サービスワーカーは .forge ソースファイルをフェッチし、WebAssemblyでコンパイルされたコンパイラをブラウザ上で直接実行して、その場でHTMLを生成します。

このハイブリッドアプローチにより、静的サイトのアクセシビリティを犠牲にすることなく、SPAのような即時的な感覚を提供します。

状態と永続化

Forgeは、サーバー上の追記型ログ (append-only log) を利用することで、バックエンドとのやり取りを簡素化します。複雑なAPIエンドポイントやデータベーススキーマの代わりに、開発者は log-append というwordを使い、データを永続化できます。

例えば、「いいね」ボタンは次のように実装できます。

: like-button  ( -- )
    "❤"  "do-like"  on-click ;

: do-like
  "1" "likes:demo" log-append ;

ユーザーがボタンをクリックすると、値 "1" は、サーバー上の likes:demo というトピックの下にある JSONL (JSON Lines) ファイルに追記されます。この最小限の永続化アプローチは、動的なWeb要素に通常伴うオーバーヘッドを削減します。

コミュニティの考察

このプロジェクトは、「奇妙な」実験的な言語の作成における現代的なツールの役割について、興味深い議論を起しています。

一人の観察者は、LLMによるコーディング支援が、複雑なシステムの参入障壁を大幅に下げていると指摘しています。

LLM-based coding is enabling so much! The crazy weekend project now can have compilation to native code and web assembly... without breaking a sweat.

言語は実験的なものですが、個人のブログという、個人の表現のための空間は、おそらく型破りなプログラミングパラダイムを試すのに最適な場所です。Forgeが主流のツールになるか、あるいは単なる好奇心の対象として残るかは分かりませんが、それが、古いスタイルのスタックベースのロジックと、WebAssemblyやService Workersのような現代的なWeb標準を組み合わせる力の強さを示していることは間違いありません。

Sources