HN 日本語サマリー

← 一覧へ戻る
プログラミング

Fableを使って65kLoCのGoコードをRustに書き換えたら、費用は400ドルだった

I used Fable to rewrite 65kLoC of Go in Rust. It cost $400 (iurii.net)

19 pointsby aka-rider12 コメント

要約

この記事では、FableというツールとLLMを活用して、65,000行のGoコードをRustに書き換えた経験が語られています。著者は、LLMにコードをデータ構造として表現させ、その表現を操作してからコードに戻すというアプローチで、低コストかつ効率的に大規模なコードベースの書き換えを達成した方法を解説しています。

全文翻訳

Fableを使って65kLoCのGoコードをRustに書き換えたら、費用は400ドルだった。

私はずっと「Rustをずっと前に習得したかったけど、C++のお金だけではまともなファー・スーツを買うには足りない。それに、私はハゲているから髪を青く染めることもできない」と冗談を言っていました。

しかし、その時、二つのことが同時に起こりました。

まず、Matt Pocock による /teach スキル [1] を試してRustを学びました。すると、それが腑に落ちました。「C++プログラマーに、構文や "Hello, World!" は飛ばして、idiomatic Rustだけを教える。主な違いにだけ焦点を当てる」。このスキルはパーソナルトレーナーのようなものです。心地よい挑戦を乗り越えることで意欲が維持され、同時に教材が圧倒的になることはありません。ぜひ試してみてください。

ほぼ同時期に、「Rewriting Bun in Rust」 [2] という記事に出会い、その手法に興味を持ちました。

各ダイナミックワークフローは次のようなループでした。

  • Zigのパターンと型をRustのパターンと型にマッピングするポートガイドを生成する
  • PORTING.mdとLIFETIMES.tsvに合わせて、すべての.zigファイルを.rsファイルに機械的にポートする
  • 各クレートのコンパイラエラーを修正する
  • bun test や bun build のようなサブコマンドを動作させる
  • Bunのテストスイート全体にあるすべてのテストをパスさせる
  • いくつかの大規模なリファクタリングとクリーンアップパス

このプロジェクトのコストは535,496行で165,000ドルでした。

私は、ある中間表現を使えば、書き換えはもっと安くできるのではないかというアイデアを持っていました。

あなたのフローチャートを見せて、表を隠してください。そうすれば私は当惑し続けるでしょう。あなたの表を見せてください。そうすれば、通常はフローチャートは必要ないでしょう。それらは明白になるでしょう。 --- Fred Brooks

これはあらゆるLLMに当てはまりますが、Fable 5は特にデータの流れを驚くほど正確にトレースします。問題をデータ問題として再構成できれば、自律的に複雑なリファクタリングを行ったり、ある言語から別の言語に書き換えたり、サービスを抽出または統合したり、つまり根本的な変更を行ったりすることができます。

三つのステップ

LLMに、コードを以下のいずれかの組み合わせで表現するように依頼します。

  • グラフ
  • オントロジー
  • 階層型状態機械
  • UMLプロセスチャート
  • 制約
  • 数学の公式
2. 表現の操作

この時点で、状態機械を状態数を減らして単純化したり、隠れた通信チャネル(共有テーブル経由やRAMアドレスの共有など)を削除したりするように依頼できます。

3. 表現をコードに戻す

今度はコードを要求します。たとえ別のプログラミング言語であってもです。

秘訣

しばらくの間、エージェントはツールの使用に長けており、他のエージェントをツール呼び出しとして扱うことができる限りにおいて。 --- Anthropicの投稿 [3]

実際には、これはFableにコードの読み書きを禁止し、代わりにサブエージェントをオーケストレーションするように指示することを意味します。そうすることで、Fableは何時間にもわたる実行中にコンテキストウィンドウを節約でき、トークンコストも合理的になります。

Fableのプロンプトに以下を追加できます。

広範な `Glob`/`Grep`/`WebSearch`/`Bash` は避ける - 代わりに `Explore` エージェントを使用する
広範な `Edit`/`Bash` は避ける - 代わりに汎用的な Sonnet または Haiku サブエージェントを使用する
`Read` は控えめに使用し、重要な主張を自分で検証する

Glob、Grep、WebSearch は Claude Code の組み込みツールの名前です。

これで役立つことを願っています。ハッピーコーディング。

P.S. 65kLoCとは、LLM時代のターミナルエディタであるrune です。

  • ターミナル上の Obsidian × VSCode、⌘ - キー操作
  • 主な焦点はマークダウンとシンタックスハイライト。言語サーバーとデバッガーはエージェント用です
    • マークダウンテーブル
    • Obsidian ボールト ([[wikilinks]] 付き)
    • - [x] 牛乳を買う タスク
  • 自動マージ、クラッシュデータリカバリなど多数...

···

Photo by Laura Rivera on Unsplash

注釈

  1. Matt Pocock による /teach スキル ↩

  2. Rewriting Bun in Rust ↩

  3. Patterns and problems in emerging multiagent systems ↩