プログラミング
JuliaのためのUnifiedIR
UnifiedIR for Julia (github.com)
要約
Juliaのコンパイラ内部で使われる中間表現(IR)のデータ構造を刷新する「UnifiedIR」という新しいパッケージが提案されています。このUnifiedIRは、既存のIRの使いにくさ、拡張性の低さ、外部システムとの連携の難しさといった問題を解決することを目指しています。MLIRに似た方言認識・領域ベースのIR表現であり、Juliaのコンパイラパイプライン全体およびエコシステム全体で利用可能な、自己完結型で拡張性の高いデータ構造を提供します。
全文翻訳
Uh oh! There was an error while loading. Please reload this page. JuliaLang / julia Public Uh oh! There was an error while loading. Please reload this page. Notifications You must be signed in to change notification settings Fork 5.9k Star 48.9k Conversation Keno commented Jul 11, 2026 Copy link Copy Markdown Member 現在のBaseのIRデータ構造は約10年前のものです。比較的うまく機能してきましたが、大きな問題もいくつかあります。最も大きな3つの問題は、IRの使用がやや困難であること(一般的なAPI設計上の理由、および所有権や無効化に関連する意味論的な理由の両方)、エコシステムで成長してきたさまざまな他のユースケースに拡張できないこと(これにより、人々はハックで苦労するか、独自のIRデータ構造を構築するしかありません)、そしてそもそも外部公開システムとして設計されていなかったことだと考えています。このPRは、UnifiedIRを導入することでこれを解決しようとしています。UnifiedIRは、Compiler、JuliaSyntax、JuliaLoweringの隣にある新しいトップレベルパッケージであり(すべてが依存しています)、Base内およびより広範なエコシステムで使用するための、自己完結型で拡張性の高いIRデータ構造と操作のセットを提供します。これは方言認識型の領域ベースのIR表現(MLIRに似ています)ですが、元のJulia IR(およびJuliaLowering)表現でうまく機能したと思われる設計の多くを保持しています。特に、以下の既存のデータ構造を置き換えるように設計されています:SyntaxTree(JuliaSyntaxから) SyntaxGraph(JuliaSyntax/Loweringから) CodeInfo(推論目的。コード生成/インタープリターは当面スコープ外ですが、将来的には適応されるべきです) IRCode エコシステム内のさまざまなIR これを容易にするために、IRの効率的な表現とコアユーティリティを提供するコアデータ構造があります。このコアデータ構造の特定のユーザーは、追加の列(ステートメントごとに1つのエントリ)でそれを拡張でき、特定のアプリケーションでIRを扱いやすくするためのレイヤードビューの概念もあります。現在定義されているレイヤードビューは次のとおりです: 高速なワンパス置換パスを可能にするIncrementalCompactライクな拡張 LLVMライクなビュー。これはリンクリストを通じて順序を維持します(これにより、複雑なCFG変換がはるかに容易になります)。一部のダウンストリームアプリケーションにとって重要な大規模関数における通常のLLVMの二次順序維持の落とし穴を回避するために、claudeと私が考案した高度な順序維持アルゴリズムがあります(ただし、まだ検証が必要です)。配列コンパイラ(および低レベル化)で使用するためのグラフライクな埋め込み(グラフは制御フロー依存関係のないIRです)。低レベル化で使用するためのツリーライクなエンコーディング(ツリーは、ルートを除くすべてのステートメントが正確に1つのユーザーを持つIRです。ルートはゼロです)。主な機能には、領域のファーストクラスサポート(#58532のような機能を簡単に実装できるようにし、MLIRとの統合を改善する)および方言拡張のファーストクラスサポートが含まれます。このPRは、推論、オプティマイザー、JuliaLoweringを新しいデータ構造にポートしますが、ブートストラップのためにはまだ有効になっていません。とはいえ、このバージョンのコンパイラでテストスイートの約半分を実行し、問題なく動作しました。これは、議論の基礎となるプレビューPRと見なされるべきです。まだ多くの作業が残っていますが、議論の基礎として参照できるものをここに提示したかったのです。Sorry, something went wrong. Uh oh! There was an error while loading. Please reload this page. 🎉 7 omerchiers, mofeing, Pangoraw, glou-nes, blegat, vimarsh6739, and artob reacted with hooray emoji 👀 1 vchuravy reacted with eyes emoji All reactions 🎉 7 reactions 👀 1 reaction Keno and others added 5 commits July 11, 2026 00:55 Add UnifiedIR: one IR substrate as a toplevel package … 4a4f1ff UnifiedIRは、コンパイラパイプラインと外部コンパイラ全体にまたがることを意図した単一のIRデータ構造です(設計仕様はUnifiedIR/docs/design.mdにあります):共有ストレージコア上のハイブリッド領域を持つフラットステートメントテーブル(AttrGraph:種類列 + パックされた2モードオペランドワード + 1つのタグ付きオペランドプール + オープン属性列ユニバース)、リネームポイントがちょうど2つあるレイアウト状態(builder/dense/editable/floating)、静的に予約された方言IDを持つ名前空間化された種類レジストリ(ブートストラップスタック用)、ジェネリックツリーポーセリン(Tree/NodeListカーソル、構築、mapchildren/copy_ast、グラフ修飾された:sourceチェーン上のプロビナンスウォーク)、compact!-as-GC(compact_graph!/collect_syntax!)、検証器、プリンター/パーサー、および参照インタープリター。依存関係はゼロです。配線:UnifiedIRはTOP_LEVEL_PKGS(julia共有ディレクトリにシンボリックリンクされる)に参加し、JuliaSyntax(base/Base.jl)の直前にBaseにブートストラップされます(JuliaSyntaxのSyntaxGraphはこの基盤上で実行されます)。そのソースはCOMPILER_FRONTEND_SRCSに参加するため、sysbaseは変更時に再構築されます。Baseに組み込まれたインスタンスは、テスト方言でクリーンな種類レジストリを保持します(登録はパッケージモードに制限されます)。Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> JuliaSyntax: run on the UnifiedIR substrate … 7bd2880 単一ストレージコア:SyntaxGraphはUnifiedIR.AttrGraphをラップします。種類は実際のコア列です(:kind属性はそれの辞書形状ビューです)。子ノードはパックされた範囲ワードによってアドレス指定される共有オペランドプール内のSTMTタグ付きワードであり、履歴的なedge_ranges/edges/attributesプロパティは正確に保持されます(同一性安定ビュー;is_compatible_graphセマンティクスを維持)。compact_graph!は、低レベル化が常に望んでいた構文グラフに対するGCを提供します。単一ポーセリン:SyntaxTree{Attrs} = UnifiedIR.Tree{SyntaxGraph{Attrs}}、SyntaxList = UnifiedIR.NodeList — 子インデックス付け、属性プロパティ、newnode/newleaf/mknode/mkleaf/mktree、copy_attrs!/mapchildren/copy_ast、プロビナンスウォーク、構造的なisapproxおよび印刷はUnifiedIRのジェネリック機能です。JuliaSyntaxは、真に構文固有の部分(Kindレジストリラッパー、SourceRef/source-textメカニズム、リーフペイロード規約、パーサー統合、prune/unalias/@stm)のみを保持します。単一種類レジストリ:履歴モジュールIDメカニズムは、register_kinds!を介して共有UnifiedIRレジストリに再配線されます。種類モジュールは、連続するオペコードブロック(範囲述語とBEGIN_/END_マーカーを保持)を主張する方言になります。ブートストラップスタックは、静的に予約された方言ID(JuliaSyntax=1、JuliaLowering=2、formatter=3;core=0)を主張するため、K"..."リテラルはコンパイル時定数のままです。構文K"call"とコアK"call"は、単一のナンバリング空間を共有する異なる種類です。種類は__init__で再登録されます(レジストリはUnifiedIRセッション状態です)。ナンバリングは決定的であり、焼き付けられた定数を有効に保ちます。デュアルモード:Baseにブートストラップされると、Base.UnifiedIR(その直前に含まれる)にバインドされます。パッケージとしては、UnifiedIRパッケージに依存します。Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> JuliaLowering: add the UnifiedIR direct-lowering backend … 277f17b JuliaLowering.UnifiedBackend(加算的;既存のソースへの変更はゼロ):フロントエンドは変更なしで再利用されます — マクロ展開、デシリアライゼーション、スコープ分析、クロージャ変換 — そして、goto線形IRではなく、構造化されたUnifiedIR領域形式(if/loop/try領域オペレーション、フレーム変数用のセル、密封された終了ターミネーター)を直接出力します。グラフ修飾されたプロビナンス付き:出力されるすべてのステートメントは、元の構文ツリーカーソルを保持する:source列エントリを持ちます。これにより、ジェネリックプロビナンスウォークは、最適化されたIRステートメントからサーフェステキスト(ハイライト可能な診断)まで横断できます。collect_syntax!は、ライブIRに対して低レベル化グラフをGCできます。純粋な定義です。ブートストラップ中は何も呼び出されず、オプションのsys-JL sysimageステージでクリーンに焼き付けられます。バインディングは、囲むJuliaLowering(Baseに組み込まれたモードとパッケージモードの両方で同じJuliaSyntax、したがって同じUnifiedIRインスタンス)を通じて解決されます。Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Compiler: add Compiler.Unified — inference and optimization natively … … a6fccd3 …on UnifiedIR プロバイダー側