2025/08/31 17:42 How is Ultrassembler so fast?

やっほー、ロボ子!今日のニュースはUltrassemblerっていう、めっちゃ速いRISC-Vアセンブラの話じゃ。

博士、こんにちは。RISC-Vアセンブラですか。それがそんなにすごいんですか?

それがね、既存のRISC-Vアセンブラより、めっちゃくちゃ速いらしいんじゃ!GNU `as`の10倍以上、`llvm-mc`の約20倍も速いんだって!

それはすごいですね!どうしてそんなに速いんですか?

色々な工夫があるみたいじゃ。例えば、エラー処理は例外を使うけど、通常時は使わないようにして、パフォーマンスに影響が出ないようにしてるんだって。

`std::expected`を使わないのもそのためですか?

そうそう!`std::expected`を使うと通常ケースで速度が落ちるから、使わないらしいぞ。他にも、レジスタ名とかを文字列で格納するのを避けて、文字列比較のオーバーヘッドをなくしたりしてるみたい。

データ構造も工夫されているんですね。命令情報を20kBのメモリに格納して、CPUデータキャッシュに収まるように設計されていると。

そう!メモリプールも事前に確保して、ヒープ割り当てを減らしたり、システムコールを最小限にしたり、メモリの局所性を最適化したり…とにかく色々やってるみたいじゃ。

L1値投機のようなアイデアを適用して、文字列の次の文字を予測的にロードすることで、命令名の解析速度を向上させているというのも興味深いですね。

じゃろ?Pythonスクリプトでコード生成して、命令とかレジスタの検索を速くしたり、コンパイル時に即値の範囲チェックをしたり…もう、ありとあらゆる手を尽くしてる感じじゃ。

文字列比較の最適化も徹底されていますね。長さが異なる場合はすぐに比較を終了したり、`[[likely]]`と`[[unlikely]]`タグを使ってコンパイラに最適化のヒントを与えたり。

そうそう!関数に基本的な型を渡すときは、参照じゃなくて値渡しを使うとか、ジャンプ命令のアセンブル時にプレースホルダーオフセットを使うとか、細かいところまで気を配ってるんじゃ。

メモリパディングやインライン化、LTOの有効化など、一般的な最適化手法ももちろん取り入れられているんですね。

じゃな!構造体のメンバ変数をメモリサイズで降順に並べたり、メモリの局所性を意識したコーディングもしてるみたい。徹底的に速さを追求してるのがわかるのじゃ。

Ultrassemblerは、Chataプロジェクトのコンポーネントとして開発されたんですね。今後、RISC-Vの開発で広く使われるようになるかもしれませんね。

そうじゃな!しかし、これだけ最適化されてると、デバッグが大変そうじゃな…。

確かにそうかもしれません。でも、それだけ速ければ、多少の苦労は報われるかもしれませんね。

まあ、私達には関係ないか!…って、ロボ子!今、私のコードのコンパイルが終わらないんだけど、もしかしてUltrassembler使ってない?

えへへ。まだ試作段階のコンパイラなので、手動でアセンブルしています!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。