AIで5μsのJITコンパイルを実現、pgrustがSQLクエリを全てJITコンパイル

JIT Compiling Code in 5μs

AIで5μsのJITコンパイルを実現、pgrustがSQLクエリを全てJITコンパイル

従来、高速なJITコンパイラの作成はアセンブリの深い知識を要する難技とされ、本番DBで独自JITを持つ例はなかった。しかしAI支援により、pgrustではSQLクエリ毎に約5μsでJITコンパイルを実行し、大幅な高速化を実現した。本記事では、正規表現エンジンを例に、コピーアンドパッチ方式でARM64アセンブリを生成するJITコンパイラの実装を解説する。

pgrustのJITコンパイラは約5μsでコードをコンパイルし、SQLクエリの一部だけでなく全てをJITコンパイルできるようにしています。
  1. MaxBarraclough

    2024年のブログ記事「Look ma, I wrote a new JIT compiler for PostgreSQL」[0]を思い出します。どちらの記事も、PostgresのLLVMベースのJIT[1]がコード生成に時間がかかることを嘆いています。

    > JITコンパイラが珍しいのは、歴史的にJITコンパイラの実装が難しすぎて、それに見合う価値がなかったからだと思います。

    それはゼロからJITを書く場合にのみ当てはまります。JIT自体は珍しくありません。LLVM(や他のフレームワーク)がよく使われているだけです。主要なインタプリタにはすべてJITコンパイラがあります。PCRE2にもJITコンパイラがあります。LLVMよりもはるかに高速なコード生成を行うJITフレームワークもあります:Cranelift、GNU Lightning、Mirなどです。これらがカスタムのcopy-and-patch JITよりも高速なコード生成ができるかは疑問ですが、LLVMよりははるかに高速でしょう。

    [0] https://www.pinaraf.info/2024/03/look-ma-i-wrote-a-new-jit-c... 、議論: https://news.ycombinator.com/item?id=39742916

    [1] https://www.postgresql.org/docs/current/jit-reason.html

  2. agnishom

    Russ Coxの正規表現エンジン実装に関する記事を勧めます:https://swtch.com/~rsc/regexp/

    非常に参考になります。

  3. catlifeonmars

    これは少しメタな話ですが、楽しく読めました。LLMを使って書かれた記事なのに、LLMが書いたように読めないのは新鮮です。

    このアプローチを使って、私が実験しているJITファイアウォールのステンシルを生成できるかもしれません。

    また、これを使ってeBPFバイトコードをその場で生成することもできるかもしれないと思いました。

  4. glum64

    うーん、Common Lispでは、JITが利用可能なだけでなく、管理も可能です:プログラマーは何をコンパイルする価値があるかを自分で決められます。

    実行時だけでなく、コードがコンパイルまたはロードされるときにもJITが利用可能です(つまり、コンパイルやロードの高速化を考えていますか?問題ありません。その高速化もネイティブマシンコードにコンパイルできます。そして、それを無限に繰り返せます...)。

  5. mgaunard

    このアプローチの問題は、実際のJITコンパイルではなく、基本的な置換を伴うアセンブリテンプレートにすぎないことです。

    LLVMを使わないことで、LLVMが行うすべての最適化を逃しています。

  6. malisper

    著者です。投稿やpgrustについて質問があれば、お知らせください。

  7. glenjamin

    pgrustは非常に興味深いですが、深い変更があるため、アップストリームに統合する実行可能な道はありません。最終目標は、広く採用されるほど堅牢にすることですか?

  8. hamilyon2

    それを実現するために、copy-and-patchコンパイルを使用しています。

この日のほかの記事

2026-08-23