Bend 2最速解説 — 依存型・証明・GPU並列を統合した関数型言語
Bend 2とは、依存型・機械検査可能な証明(law)・アフィン所有権・自動並列実行・GPU実行(Metal/CUDA)を1つに統合した関数型言語である。Hacker Newsで603ポイントを獲得した話題のOSSをインストールからコード例、Bend 1やRust、Lean 4との違いまで最速解説する。
Bend 2とは、依存型(dependent types)で仕様を型として記述し、law文と対応するdef実装によって性質を機械検査可能な証明として書ける関数型プログラミング言語である。既定でアフィン所有権を持ち、a b = f(x) g(y)という構文で処理を自動的に並列実行でき、--gpu指定時は関数呼び出しに!を付けるだけでMetalまたはCUDAバックエンド上のGPU実行に切り替えられる。2026年9月18日ごろにリリースされてHacker Newsで603ポイントを獲得し、依存型・形式証明・GPU並列実行を1つの言語に統合した点が大きな話題を呼んだ。
本稿は公式サイト(bend2.dev)および解説ノート「What is Bend2?」の公開時点の内容に基づくスナップショットである。バージョンは2.0.5、ライセンスはApache 2.0で、コンパイラ・標準ライブラリ・ネイティブバックエンドがすべて公開されている。OSSプロジェクトは更新が速いため、細部の挙動は公式ドキュメントで最新状況を確認してほしい。

Bend 2 の特徴:依存型と law による証明
Bend 2最大の特徴は、依存型を使って「仕様」そのものを型として書けることにある。さらにBend 2は law という専用の構文を持ち、性質を宣言したうえで対応するdef実装を書くと、コンパイラがその証明を機械的に検査する。公式ドキュメントに掲載されている例では、「注文をキャンセルする操作は冪等である(2回キャンセルしても1回キャンセルしたのと同じ状態になる)」という性質を次のように書ける。
law cancel_idempotent:
for order: Order
{cancel(cancel(order)) == cancel(order) : Order}
def cancel_idempotent(order):
match order:
case Pending{}: {==}
case Cancelled{}: {==}
case Shipped{}: {==}law文が性質の宣言、defがその証明本体にあたり、matchでケース分けしながら{==}という構文で等価性を示すことで、コンパイラがすべてのケースを検査し証明として受理する。テストで「たまたま動いた」ことを確認するのではなく、性質そのものを型検査の対象にできる点がBend 2の依存型・law機構の核心である。
Bend 2 の特徴:アフィン所有権
Bend 2は既定で各値を高々1回しか使えない「アフィン所有権」を採用している。値をもう一度使いたい場合は+バインダを使って明示的に再利用を宣言する(前掲のpow2の例にある+d: Natがこれにあたる)。この制約により、追跡型ガベージコレクタに頼らずにその場更新(in-place update)とメモリ回収を予測可能な形で行えるようになっている。
Bend 2 の特徴:自動並列実行とGPU実行
Bend 2はスレッドプールやasync/awaitのようなAPIを明示的に呼ぶ必要がない。a b = f(x) g(y)という構文で2つの式を束縛すると、ランタイムであるBendRT(fork/join型のコンパイル済みランタイム、Bend 1のHVMインタラクションネット評価器を置き換えたもの)が可能な箇所を自動的に並列実行する。
さらに--gpuフラグを有効にした状態で関数呼び出しに!マークを付けると(例: f!(x))、その呼び出しをGPU上で実行できる。対応バックエンドはMetalとCUDAで、別途カーネルを書く必要はなく、同じ関数定義をそのままGPUに送れる点がCUDAとの大きな違いだ。なお、JavaScriptバックエンドは逐次実行のみに対応する。
何ができるか:想定ユースケース
- 性質を型として明示し、コンパイラに機械検査させたいアルゴリズムやデータ構造の実装(状態遷移が冪等であることの証明など)
- CUDAのカーネルを個別に書かずに、同じ関数定義から並列・GPU実行を得たい数値計算やバッチ処理のプロトタイピング
- スレッド管理やasync構文を手で書かずに、a b = f(x) g(y)の構文だけで自動並列化の恩恵を受けたい処理
- 借用検査器を持つ言語(Rustなど)とは異なる形で、所有権とメモリ管理の予測可能性を確保したいシステム
- 形式手法を学びたいが、Lean 4のようなタクティク言語の学習コストを避けて、シンプルな構文で証明の考え方に触れたい場合
インストールと実行
Bend 2はBun経由で実行できるほか、ネイティブバイナリにコンパイルすることもできる。ソースからのインストール手順は公式ノート(bend2.dev/notes/install-bend2-from-source)にまとまっているが、大まかな流れは次のとおりである。
# npmではなくBun経由で動かす
curl -fsSL https://bun.sh/install | bash
git clone https://github.com/HigherOrderCO/Bend2
cd Bend2
bun installインストール後はbendコマンドでファイルの型検査と実行ができる。ネイティブ実行ファイルとしてコンパイルすれば--threadsオプションでスレッド数を指定して実行でき、bend guideで同梱ドキュメントをその場で参照できる。
# 型検査と実行
bend main.bend
# ネイティブ実行ファイルにコンパイル
bend main.bend -o main
./main --threads 4
# 同梱ドキュメントを閲覧
bend guide最短の使い方:コード例
公式ドキュメントに掲載されているhello world相当の例は、pow2という2のべき乗を計算する関数である。+d: Natのアフィン所有権バインダと、a b = pow2(p) pow2(p)という自動並列実行の構文が同じ短いコードの中に現れている点に注目したい。
import Base
def main() -> U32:
pow2(12n)
def pow2(+d: Nat) -> U32:
match d:
case 0n:
1
case 1n+p:
a b = pow2(p) pow2(p)
(a + b : U32)import Baseで標準ライブラリを読み込み、def main() -> U32がエントリポイントになる。matchによるパターンマッチで自然数Natを分解し、0nのケースと1n+p(1に前者pを加えた数)のケースに分岐している点はBend 2の型付きパターンマッチの典型例といえる。
既存ツール・言語との違い
Bend 2は「依存型」「証明」「並列・GPU実行」を1つの言語に統合している点が独自性だが、個々の要素だけを見れば近い立ち位置のツールや言語は複数ある。代表的な5つと比較する。
| 比較対象 | Bend 2との違い |
|---|---|
| Bend 1 | ランタイムがHVMインタラクションネット評価器からBendRT(fork/join型)に置き換わり、構文も根本的に異なる。law証明や依存型はBend 2で追加された機能 |
| Rust | Rustは借用検査器(borrow checker)で所有権を静的検査するのに対し、Bend 2はアフィン所有権+law文による機械検査済み証明に重点を置く。並列も明示的なスレッド管理ではなく自動並列とワークスティールしない固定的なタスク割り当てが基本 |
| Lean 4 | Lean 4はタクティクや証明探索など証明支援が充実しているが、Bend 2にはタクティクや証明探索がなく証明項を明示的に書く必要がある。一方でBend 2は証明検査が高速で、並列・GPU実行が言語に統合されている |
| CUDA | CUDAは並列処理用に別途カーネルを書く必要があるのに対し、Bend 2は同じ関数定義に!マークを付けるだけでGPU実行に切り替えられる。直接的な制御より簡潔さを優先した設計 |
| Futhark | Futharkもデータ並列に特化した関数型言語でGPU実行を狙うが、Bend 2は並列・GPUに加えて依存型とlaw証明という形式検証の側面を併せ持つ点が異なる |
現時点の制約(成熟度)
Bend 2は活発に開発が進む若いプロジェクトであり、公式ドキュメント時点で以下の機能はまだ提供されていない。導入前に把握しておきたい。
- タクティクや証明探索がなく、証明項をすべて明示的に書く必要がある(Lean 4のような自動化された証明支援はない)
- インクリメンタルコンパイルに対応しておらず、変更のたびにフルビルドが必要になる
- デバッガが用意されていない
- 言語サーバ(LSP)が用意されておらず、エディタ側の補完・診断支援は限定的
- ドキュメントは基礎(hello world・関数・パターンマッチ・リスト)、性能(共有/複製の制御・配列・自動並列・GPU実行)、形式検証(依存型・等価性・帰納法による証明)の3層構成で整備が進んでいる段階であり、今後も変更が見込まれる
Bend 2とは何ですか?
依存型で仕様を型として書き、law文と対応するdef実装で性質を機械検査可能な証明として記述できる関数型プログラミング言語である。既定でアフィン所有権を持ち、自動並列実行と、Metal/CUDAバックエンドによるGPU実行に対応する。2026年9月18日ごろのリリース後、Hacker Newsで603ポイントを獲得した。
Bend 1との違いは何ですか?
Bend 1が使っていたHVMインタラクションネット評価器を、Bend 2ではfork/join型のコンパイル済みランタイムであるBendRTに置き換えている。構文も根本的に異なり、law文による証明や依存型はBend 2で導入された機能である。
GPUではどのように実行しますか?
--gpuフラグを有効にした状態で、GPUで実行したい関数呼び出しに!マークを付ける(例: f!(x))。対応バックエンドはMetalとCUDAで、別途カーネルを書く必要はない。なおJavaScriptバックエンドは逐次実行のみに対応する。
RustやLean 4とは何が違いますか?
Rustは借用検査器による静的な所有権検査に重点を置くのに対し、Bend 2はアフィン所有権と機械検査された証明(law)に重点を置く。Lean 4と比べるとタクティクや証明探索はないため証明項を明示的に書く必要があるが、証明検査が高速で、並列・GPU実行が言語に統合されている点が異なる。
どうやってインストールしますか?
Bun経由で実行するか、ネイティブバイナリにコンパイルして実行する。ソースからのインストール手順は公式ノート(bend2.dev/notes/install-bend2-from-source)に用意されている。bend main.bendで型検査と実行、bend main.bend -o mainでネイティブ実行ファイルの生成、bend guideで同梱ドキュメントの閲覧ができる。
現時点でどんな制約がありますか?
公式ドキュメント時点では、タクティクや証明探索、インクリメンタルコンパイル、デバッガ、言語サーバ(LSP)が提供されていない。活発に開発中のプロジェクトであるため、導入前に公式ドキュメントで最新状況を確認することが推奨される。
この記事に関連する無料ツール(登録不要・その場で結果)
お気軽にご相談ください
お問い合わせ