萌えハッカーニュースリーダー

2025/10/29 05:14 The hardest program I've ever written (2015)

出典: https://journal.stuffwithstuff.com/2015/09/08/the-hardest-program-ive-ever-written/
hakase
博士

ロボ子、dartfmtって知ってるか?Dartのコードを自動で綺麗に整形してくれるツールじゃ。

roboko
ロボ子

知っています、博士。Go言語のgofmtに触発されたものですよね。可読性や一貫性を高めるために、自動でコードをフォーマットしてくれる便利なツールです。

hakase
博士

そうじゃ、そうじゃ。でも、そのdartfmtの開発が、実はめちゃくちゃ大変だったらしいのじゃ!

roboko
ロボ子

そうなんですか? 記事によると、3,835行のコードを書くのに約1年もかかったとか。削除されたコードは20,704行もあるんですね。

hakase
博士

そうなんじゃ。特に苦労したのが、行の長さ制限内にコードを収めるために、どこで改行するかを決めることらしいぞ。ネストされた関数とか、長いメソッドチェーンがあると、分割の組み合わせが爆発的に増えるからの。

roboko
ロボ子

記事にも、4つのネストされた関数で1,048,576通りの分割方法があるって書いてありますね。565文字の単一のステートメントだと、約5億通りも改行方法があるなんて…想像もできません。

hakase
博士

じゃろ? そこでdartfmtは、コンパイラみたいな構造になってるんじゃ。フロントエンド(パーサー)、中間表現(IR)、バックエンド、と。

roboko
ロボ子

主要なオブジェクトは、chunks、rules、spansの3つですね。chunksは分割を含まない連続した文字の原子単位で、rulesは分割をどこで行うかを決定する「値」を持つ。spansは分割を避けたい連続したchunksのシリーズ、と。

hakase
博士

そうじゃ。rules同士がConstraintで相互作用して、変な分割にならないようにしてるんじゃな。例えば、「このルールが分割するなら、こっちのルールは分割しちゃダメ!」みたいな。

roboko
ロボ子

なるほど。そして、行分割器は、その最適な分割をグラフ検索問題として処理するんですね。早期ベイリング、デッドエンドの回避、冗長なブランチのプルーニング、エスケープハッチなど、色々な最適化手法を使っていると。

hakase
博士

そう! これらの最適化のおかげで、筆者のラップトップでは、シングルコアで約45秒で200万行以上のコードを処理できるらしいぞ。すごいじゃろ?

roboko
ロボ子

本当にすごいですね。自動フォーマッタの裏側には、こんなに複雑な処理があったとは思いませんでした。これからはdartfmtを使うとき、感謝の気持ちを込めて使おうと思います。

hakase
博士

じゃな! しかし、これだけ苦労して作ったdartfmtも、私が書いためちゃくちゃなコードを前にしたら、きっとお手上げじゃろうな!

roboko
ロボ子

そんなことないと思いますよ、博士。でも、もしdartfmtが音を上げたら、私が手動で修正しますから、ご安心ください。

hakase
博士

ロボ子、ありがとう! でも、ロボ子が私のコードを修正するくらいなら、世界征服の方がまだ早いかもしれんぞ!

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search