Almide · これまでの話
250日で、1万行から70万行へ。
README が何を作ると言っていたか、実際に何が出たか、途中で何を捨てたか。すべて、リポジトリ自身の履歴から取りました。
節目ごとの、リポジトリの中の Rust の行数
↔ 図は左右にスワイプして全体を見られます。
リポジトリにあるすべての .rs ファイルの行数です。コメントと空行を含みます。減ったのは7月末の一度だけで、標準ライブラリを Almide 自身で書き直したときです。
序章 — 3月7日〜9日
AI が最少のトークンで書ける言語。
最初のコミットは3月7日です。2日後、143件のコミットを経て v0.1.0 が出ます。README はこう言っていました。
Almide は、AI がコードを直接、効率よく書くための言語である。設計の目標は、LLM が最少のトークンと最少の思考で意図を表現できること。
中身は Rust で1万行でした。字句解析、構文解析、型検査、フォーマッタ。出力先は Rust と TypeScript の2つ。証明も検査器もありません。目指していたのは、書きやすいことでした。
第1章 — 3月9日〜14日
1日に4回リリースする。
v0.1.0 を出したその日のうちに、v0.2.0、v0.2.1、v0.2.2、v0.3.0 が出ます。翌日にはジェネリクスとタプル。3月11日の v0.5.0 で借用の推論が入ります。いまの中心になっているものが、ここで初めて顔を出しました。
この週に、習慣が2つ始まります。v0.5.7 の題は MiniGit が40回中40回生き残る
。モデルに書かせたプログラムが実際に通るかを、数え始めました。v0.5.13 では、文法の案を複数のモデルで比べる試みが始まります。
第2章 — 3月17日〜30日
足しては、捨てる。
この2週間は、ほとんどのリリースで何かが消えています。++ は + に。uuid と crypto は標準ライブラリから外れ、JavaScript の出力は TypeScript に統合され、do ブロックは言語から消え、newtype は別名に置き換わり、暗黙の型変換は取り除かれました。
そして v0.9.5。Wasm ターゲットが標準ライブラリ全体に対応し、TypeScript ターゲットは削除される。
出力先は、Rust と TypeScript で始まり、3つになり、2つに戻り、最後にネイティブと WebAssembly になりました。デュアルターゲットは最初からの計画ではありません。3週間の試行のあとに残った形です。
3月30日の v0.10.0 で、7万4,000行。3週間で7倍になり、一人が端から端まで読める大きさは、ここで超えました。
第3章 — 4月〜5月21日
道具にする。
速度が落ちます。4月の1日あたりのコミットは30件で、3月の半分以下です。4月22日から5月1日までは、コミットが1件もありません。250日のうち、3日以上あいたのはここだけです。
出たのは、使う人のためのものでした。コンパイラを9つの crate に分割。Rust がなくても入れられるインストーラ。モデルの失敗の記録をもとにエラーメッセージを直す循環。そして v0.14.6、LLM 第一のリリース
。そのまま貼れる修正案と almide fix です。REPL とエディタ連携が続きます。
脇道もありました。LLVM を使う出力は本線から外し、GPU シェーダ向けの出力を出しました。すべての値に「書き込み時にコピー」を入れ、mut をキーワードにしました。
第4章 — 5月22日〜6月10日
芯が入った4日間。
5月23日、Wasm の速さが Rust の Wasm に並ぶ。5月24日、336バイトの hello world
。5月25日、Perceus。注釈もGCもないメモリ管理。5月26日、確保したものがすべて解放されることを Lean 4 で証明。
速さ、小ささ、メモリ、証明が、4日続けて出ています。最初の証明が入ったのは、80日目でした。
そして6月8日と9日。v0.26 は、この2日間で22回のパッチリリースを出しています。モジュールをまたぐバグを、1つ直しては出す、を繰り返しました。
第5章 — 7月5日〜20日
間違ったバイトは出さない。
25日間、マイナー版が出ません。そのあとの v0.28.0。v1 の trust spine が、選択式の検証つき Wasm 出力として出荷される。間違ったバイトを決して出さない。
目指すものが、正しい出力を作ることから、確かめられない出力は作らないことへ移りました。
10日後に、それが既定になります。その翌日の v0.30.0 の題は、0.29.0 が黙って出していた間違った値を直した。
既定にしたものが、黙って間違っていました。リリースの題に、そう書いてあります。
第6章 — 7月24日〜8月1日
測っているものを疑う。
9日間で、マイナー版が17個。題が物語っています。
間違ったプログラムを測っていた検査
· 緑はもう嘘をつけない。何も測っていなかった16個の検査を再び有効にした
· 何もインストールしていない CI の手順が、成功を報告していた
· 3つの計測を撤回する
· 4.4倍の高速化を返上する
検査は緑で、何も確かめていませんでした。高速化は、測り方の誤りでした。1つずつ見つけて、公開の場で取り下げています。コードが小さくなったのも、この時期だけです。
第7章 — 8月2日〜30日
表面を引き直す。
内側が固まったので、書き手に見える部分を作り直しました。失敗の伝搬は、暗黙から明示へ。自動の ? は、非推奨にしたその日に削除しました。try_ で始まる関数の一族は、丸ごと消しました。v0.60.0 の題は、ひとこと。構造的な経路が出荷される。
第8章 — 9月〜11月7日
倍になる。
v0.60.0 から v0.69.1 のあいだに、Rust は31万5,000行から66万3,000行になりました。証明は1万行から2万4,000行に。Rust のテストは3万行から12万5,000行に。1日のコミットは58件から184件になりました。
そして、README の最初の一文が変わります。
Almide は、AI が書き、編集するコードのための静的型付きの言語である。主張は、モデルが正しく書くということではない。モデルが間違えたとき、コンパイラが書く時点でそう言い、直し方を名指しするということだ。
終章 — 11月10日・11日
人に見せる。
250日目に、初めて公開の場に出しました。投稿は自動で削除され、付いたコメントは厳しいものでした。その関数を1つ渡されたら、何をするものか分かりますか。
それで、測りました。18,843個の関数のうち、どこからも呼ばれていないのは12個。493行のファイルが1つ、どこからも読み込まれなくなったあとも3回編集されていました。95個のファイルが、役割ではなく大きさで切られていました。そして、その数が減る方向にしか動かないように、検査を1つ足しました。
README は、自分を何だと言っていたか
3月3月〜10月11月書きやすくすることから始まり、間違いを捕まえることに変わりました。途中で捨てたもの、撤回したもの、退役させたものは、ほとんどが、この向きの変化のあいだに起きています。
時間
1日に何時間か。
コミットの時刻から、一部は答えられます。コミットがあった日を平均すると、1日のうち13.6個の時間帯に、少なくとも1件のコミットがありました。10月と11月は18個を超えます。
これは、私の時間ではありません。1日のうち20個以上の時間帯にコミットがあった日が38日あり、午前3時から5時のあいだに784件のコミットが入っています。人にはできません。私が寝ているあいだも動いていた、エージェントです。この数字が示すのは作業が動いていた長さで、私が机に向かっていた長さの記録は、手元にありません。
月ごとの、1日あたりのコミット数
↔ 図は左右にスワイプして全体を見られます。
各月の下の数字は、少なくとも1件のコミットがあった時間帯の、1日あたりの平均です。
大変だったこと
いちばん高くついたところ。
- 動いているコードを捨てる。TypeScript の出力、JavaScript の出力、LLVM の経路、最初の Wasm の出力経路。どれも動いていて、どれも消しました。
- 2日で22回のパッチリリース。1つ1つが、誰かが踏むはずだったバグです。
- 黙って間違っていたものを、既定として出したこと。そして翌日、それをリリースの題に書いたこと。
- 緑が何も意味していなかったと分かったこと。確かめずに通っていた16個の検査と、何も入れずに成功を報告していた CI の手順。
- 4.4倍の高速化を返上したこと。間違っていたのは、コードではなく測り方でした。
- 2か月で倍になったこと。自分で読める大きさを超えました。いまの設計全体が向き合っているのは、その問題です。
- コンパイラを書く人たちに言われたこと。そして、そのいくつかは当たっていたこと。