Relaxは、関数が最初に呼び出されたときにのみコンパイルすることで、Rust開発における従来の「ビルドしてから実行」というサイクルを排除します。Makepadプロジェクトの一部として開発されたこのJIT(Just-In-Time)ランタイムは、開発者が実行中のプロセスに編集内容を直接パッチすることを可能にし、プログラムを完全に再起動することなく状態を維持します。
オンデマンドコンパイルとホットパッチング
プログラムを実行する前に完全にコンパイルする必要がある標準的なCargoおよびrustcのワークフローとは異なり、RelaxはCargoパッケージをソースから直接実行します。それは各関数が最初に呼び出されたときにコンパイルを行い、プログラムの実行中に「ホット」な関数をバックグラウンドで最適化します。
このアプローチの主な特徴はホットパッチングです。開発者がファイルを保存すると、Relaxは変更された関数を再チェックおよび再コンパイルし、それらを実行中のプロセスに差し替えます。これにより、3Dゲームの現在のフレームやUIの現在のレイアウトといったアプリケーションの状態を、コードの変更を跨いで保持しながら即座に反復開発を行うことができます。

この画像は、3Dゲームのパーティクルの動きのようなアプリケーションの状態が、コードの変更を跨いで保持されるホットパッチングの概念を説明しています。
「Relaxは、ビルドしながらプログラムを実行します。」
— Relax: Rust without the wait
JIT固有の開発者ツール
RelaxはJITランタイムとして動作するため、特殊なデバッグおよびプロファイリング機能を提供します。これには、スタックを保持したままスレッドを停止させる「pause on panic」機能が含まれており、開発者はパニックフレーム内でローカル変数を読み取ったり、Rustの式を直接評価したりすることができます。
このシステムは、スレッドイベントの最後の数分間を保存する「フライトレコーダー」や、デッドロックやブロックされたスレッドを診断するための「why-hung」コマンドも提供します。パフォーマンス分析については、JITフレームとネイティブフレームの両方をサンプリングして、ホットな行やコールツリーを特定する「why-slow」ツールを提供します。
パフォーマンスのトレードオフと制限
ネイティブCPUビルドと比較して、Relaxを使用すると測定可能なパフォーマンスのコストが発生します。定常状態において、Relaxで生成されたコードはrustcの--release出力よりも低速であり、21のワークロードにおいてネイティブビルドに対して幾何平均で1.22倍から1.25倍の減速が見られます。

この表は、ネイティブビルドと比較したRelax JITランタイムの使用によるパフォーマンスオーバーヘッドに関する具体的なデータポイントを提供しています。
また、コンパイラ、そのキャッシュ、および公開されたすべてのコードバージョンがプログラムのプロセスを共有するため、システムはより多くのメモリを消費します。さらに、関数ボディはホットパッチが可能ですが、構造体のレイアウト変更、インポート、またはトレイトヘッダーの変更といった構造的な変更には、依然としてセッションの再起動が必要です。
Hacker Newsの読者の反応
- 代替案: 別のツールを使用した経験を共有したあるコメント主は、ワークフローの支援のために「mr boxington」を使用していると述べました。 コメント ↗
- 懐疑的: あるコメント主はプロジェクトの規模に対して懐疑的な見方を示し、Rustの完全な再実装は非常に野心的な試みであると示唆しました。 コメント ↗
- 懐疑的: 別のユーザーはプロジェクトの前提に疑問を投げかけ、Rustのビルド時間は過去10年間大きな問題になっておらず、Lispとは根本的に異なると主張しました。 コメント ↗
- 懐疑的: あるコメント主は、このプロジェクトは、以前はあまりにも多くの手動作業を必要とした、野心的ではあるが概念的によく踏破されたタスクに取り組むことで、AIエージェントがいかに成果を出せるかを示す好例であると提案しました。 コメント ↗
Hacker Newsのスレッドで出た意見の要約です。事実として検証されたものではありません。 議論の全文を読む ↗