Mere は何を最適化するか
言語設計はどれも「何を最適化するか」への賭けだ。Mere の賭けは、正しさの検証可能性 —— 暗黙を明示にし、プログラムを読めばそれが何をするか分かるようにすること。なぜその原則なのか、「暗黙」とは正確に何を指すのか、そしてコードを AI とともに書くなら冗長さは払う価値のある代償である理由。
どのプログラミング言語も、ほとんどの言語が声に出しては言わない問いへの答えだ —— 私たちは何を最適化しているのか? 書く速さ、走る速さ、安全性、単純さ、馴染み やすさ。これらすべてを同時に最大化はできないので、言語とは実のところ順位付けだ。 言語間の面白い違いの多くは、構文ではなくこの順位から生まれる。
Mere の順位は、一つのものを頂点に置く:
正しさの検証可能性。
正しさそのものではない —— それを保証できる言語は無い —— そうではなく、あなたが、 あるいはツールが、プログラムが主張どおりの動きをすることをどれだけ簡単に検査 できるか、だ。設計上の他のすべては、これに奉仕する限りで交渉可能とする。
暗黙を明示にする
検証可能性のための主要なてこは、単純に聞こえて実はほとんどすべてに触れる規則だ:
実行時の表現や挙動がひそかに変わりうるものは、明示する。
ここで効いている言葉は ひそかに だ。典型的な言語が「考えなくてよい」ことにして くれる項目を挙げてみる:
- メモリ。 この値はスタックにあるのか、ヒープ確保なのか、GC 対象のオブジェクト なのか、まとめて解放されるアリーナの中なのか? 多くの言語では使用箇所からは見えず、 コードが育つにつれて変わる。
- エフェクト。 この関数はファイルを読むのか、共有状態を変更するのか、ログを
出すのか、メモリを確保するのか? 素の
T -> Uというシグネチャは何も言わない。 エフェクトは実在するのに、環境的(ambient)—— 型が言及しない経路で出入りしている。 - スレッド間の共有。 この値は別スレッドに渡してよいのか? 多くの言語で型は沈黙し、 答えは「実行時に、あるいはデバッガで確かめろ」だ。
これらはどれも、プログラムの実際の挙動が、型の語る内容から乖離する場所だ。Mere の 立場は、その隙間を閉じること:メモリの所有権、エフェクト、そして(連載が並行処理に 達すれば)どの値がスレッド境界を越えられるか、これらすべてを型システムが語る対象に する。コメントや慣習を信じる必要はない。シグネチャを読む。
その見返りこそがこの言語の眼目だ:コードの一片を見て、それが何をするか分かる —— 何に触れ、何を所有し、裏で何をしうるか —— なぜなら「裏」が無いからだ。
なぜ冗長さは許容できる代償なのか
暗黙を明示にすることには、分かりやすい代償がある:書く量が増える。ひそかにログを 出しメモリを確保していた関数は、それを型に書くことになる。リージョンに住む値は、 リージョンを型に持ち歩く。これはまさに、人間第一の言語を逆方向 —— 推論・デフォルト・ 環境的コンテキスト —— へ押しやる代償だ。人がそれを全部打たねばならないからだ。
Mere は別の賭けをする。そしてそれが、この設計全体を可能にする賭けだ:
コードは AI の支援で書くので、冗長さは安い。
「打鍵量が多い」ことが制約でなくなると、トレードオフは反転する。言語はもはや、 書き心地を保つために所有権やエフェクトを隠す必要がない。それらを表に出せる。 書き下ろす摩擦がほぼ消えたからだ。高いままなのは —— 人にとってもツールにとっても —— 見通せないプログラムについて推論すること だ。Mere は冗長さを支払って透明性を 買う。
これは「ボイラープレートは多いほど良い」ではない。コードを機械と共作するのだから、 空いた予算を、プログラムを短くすることではなく、検査可能にすることに使う という ことだ。
妥協は避けられない —— だから「どこで」を選ぶ
トレードオフが無いと主張する設計は、それを隠している。検証可能性を最適化することには 実際の代償がある:一部のプログラムはより冗長になり、環境状態に寄りかかるパターンは 書きにくくなり、いくつかの便利さは意図的に手放す。Mere の規則は、それを取り繕うこと ではなく、その都度トレードオフを名指しし、意図的に選ぶ ことだ。
以降の回は、その選択の記録がほとんどだ:
- GC ではなく リージョン/ビュー のメモリモデル —— 明示的なライフタイム、代償は 型構造の増加。
- 環境的 I/O ではなくエフェクトの 能力受け渡し —— シグネチャに見えるエフェクト、 代償は呼び出しを通じた能力の引き回し。
- 「たぶん大丈夫」ではなく並行処理の
Send/Sync—— 型検査器が排除する データ競合、代償はもう数個の述語。
いずれの場合も、妥協はそれが行われる場所で明言される。だから読者は、Mere が予算を うまく使ったかを判断できる。
賢くもなく、速くもなく —— 読み解けること
これのどれも賢さの話ではないし、こういうプロジェクトが誘いがちなのとは裏腹に、 作るのが速いことの話でもない。目標はもっと狭く、そして —— 私はより有用だと思う —— 読めば信頼できるプログラム だ。真実を語るシグネチャ。挙動が変われば変わる型。 主張を検証できないプログラムを拒む compiler。
連載の残りは、この原則を一つずつ適用したものだ:最小コア、次にメモリ、次にエフェクト、 次に 4 つのバックエンド、次に言語が自分自身をコンパイルすること、次に並行処理。 どのパートも同じ問いを問い直している —— これをどう検査可能にするか? —— そして それにどう答えたかの記録だ。
次回:それらすべてを作るための母言語を選ぶ。