高速リンカの mold が3.0になって、内部実装がC++からRustへ移ったそうです。
今回、Rustになったから急に速くなったという話ではなく、性能も基本的には従来のC++版と同程度。
それより気になったのが、
これどうやって丸ごとRustにしたんだ?
というところ。
作者の発言やコミットを少し追ってみました。
作者「去年ならやってなかった」
GitHub Discussionsで、なぜRustへ移行するのか聞かれた作者のRui Ueyama氏。
memory safetyやCargo、cross compilationなどを理由に挙げつつ、AI-assisted rewritingによって、こういうrewriteのコスト自体が大きく変わったと話しています。
さらに、
去年だったらたぶんやっていなかったけど、今なら驚くほど少ない労力でできる
という趣旨の発言まで。
時代が一年単位で変わってますなー。
Redditではもっと直球だった
Redditでは、
「こんなrewriteを短期間でどうやるの?」
という質問に対して、作者本人が
AIをかなり使ってC++からRustへportする
と回答しています。
とはいえAIに全部投げて祈る方式ではなく、その後のコメントでは、
- 変換されたコードを自分でも注意深く確認する
- 既存の大量のtest harnessでregressionを捕まえる
とも説明しています。
つまり、
AIに書かせる
↓
人間も見る
↓
昔からあるテストに殴らせる
実に地に足のついたやり方ですよね。
足腰大事。
Gitを見るとRust版がいきなりドン
最初に公開されたRust版のcommitがこちら。
commit名は、
Import current mold Rust port
703ファイル、88,886行追加。
しかも、
C++ reference: mold fbaaa75
と、比較元にしたC++版のcommitまで明記されています。
既存test suiteもこの時点で、
- PASS: 5,360
- SKIP: 636
- FAIL: 0
という状態。
なので公開Gitだけを見ると、
「今日はこのファイルをRust化しました」
みたいに少しずつ移したのではなく、別でかなり作り込んだRust版をドンと持ってきて、旧C++版をreferenceとして比較していったように見えます。
「1か月で全部書いた」のでもなかった らしい
Rust rewriteの発表が9月、3.0リリースが10月なので、
「え、1か月くらいで全部やったの?」
となるところですが、Hacker Newsに作者本人が登場していました。
そこで、
rewriteを発表した時点で、実際にはもうほとんど完成していた
と説明しています。
さすがに発表してからヨーイドンで9万行近く生えてきたわけではなかった。
それでも作者は同じコメントで、AI-assisted codingについて、自分がこれまで見てきたプログラミング生産性の向上の中でも非常に大きなものだ、とかなり高く評価しています。
最後は実環境でも確認
mold 3.0の正式リリースでは、
- 全supported targetでtest suite
- 実際のworkloadで旧C++版と出力比較
- Gentooの全packageをbuild
まで実施して、regressionが見つからなかったとしています。
つまり今回の移行、
AIでどう上手にRustを書かせたか
よりも、
AIが書いたものが旧実装と同じなのか、どうやって確認するか
のほうが重要だったように見えます。
個人的に参考になったところ
自分でも最近、既存コードを別言語へ寄せたり、古い実装や依存を消したりする作業をしています。
なので今回一番参考というか「やっぱそうだよねー」になったのは、AIにどういうpromptを与えたかではなく、
旧実装をreferenceとして固定して、新旧を直接比較する
というところでした。
同じinputを旧版と新版に入れる。
既存testを通す。
実際のworkloadでも比較する。
問題がないことを確認してから旧版を消す。
あたりまえですが確認大事。
AIが書いても責任は人間ですからねー。
実際わたしも、ほとんどの時間が確認作業と言っても過言ではないです。
たまにAIと口喧嘩したり。
しかしずいぶん楽な世界になったもんです。
個人的にはもっと低きに流れたい。