Share
Embed
Writing an LLVM Backend that Compiles Code to Magic: The Gathering
えすびて
May 29, 2026
Transcript
18 slides
-
Writing an LLVM Backend that Compiles Code to Magic: The
Gathering えすびて (𝕏: @nbit0125) -
LLVMとは • OSSのコンパイラ基盤 • 様々な言語で書かれたコードを様々なターゲット向けのアセンブリ (やオブジェクトファイル)に変換できる • 変換は大きく3段階からなる ◦ プログラムコード→LLVM
IR (Frontend) ◦ LLVM IR内での最適化 (Middleend) ◦ LLVM IR→各ターゲットのアセンブリ (Backend) 各種 アセンブリ プログラム コード LLVM IR 計算結果 アセンブル+リンク+ 各種ターゲットでの実行 LLVM Backend LLVM Frontend LLVM Middleend -
Magic: The Gathering(MTG)とは • 世界で初めて作られた TCG(諸説あり? ) • プレイヤーは魔法使いとなって、呪文(カード)を駆使して対戦相手と戦う •
現時点で2万種類以上のカード が存在し、様々な 効果を持つ ◦ ゲーム中の行動を強制 /制限する ◦ ゲームのルールを変更する ◦ カードの効果テキスト自体を書き換える ◦ … • 2012年にはこのようなカードを組み合わせて、 ゲーム上で計算を行う(万能チューリングマシンを エミュレートする )ことが可能だと判明する ◦ チューリングマシンの状態およびテープの内容を MTGの 盤面情報として表現し、チューリングマシンの遷移に相当 する操作以外ができないようにプレイヤーの行動を制限 https://arxiv.org/abs/1904.09828 より -
MTGを用いた計算に関する近年の発展 • 2024年、MTGを用いたマイクロコントローラが実装される ◦ Howe Choong Yin and Alex Churchill.
“A Programming Language Embedded in Magic: The Gathering”. In 12th International Conference on Fun with Algorithms (FUN 2024). • これによりMTGを用いたプログラミングがアセンブリレベルで行える ように https://drops.dagstuhl.de/entities/document/10.4230/LIPIcs.FUN.2024.31 より MTG アセンブリ 計算結果 MTG -
MTGを用いた計算に関する近年の発展 • 2024年、MTGを用いてマイクロコントローラが実装される ◦ Howe Choong Yin and Alex Churchill.
“A Programming Language Embedded in Magic: The Gathering”. In 12th International Conference on Fun with Algorithms (FUN 2024). • これによりMTGを用いたプログラミングがアセンブリレベルで行える ように https://drops.dagstuhl.de/entities/document/10.4230/LIPIcs.FUN.2024.31 より -
プログラム コード LLVM IR LLVM Backend For MTG LLVM Frontend
LLVM Middleend MTG アセンブリ 計算結果 MTG -
• MTGをターゲットとしたLLVM Backendを実装すれば、既存の言語で書かれたコード がMTGで実行可能になる • Extremeな環境でプログラムを動かせるととても楽しいので、これをしたい やりたいこと プログラム コード LLVM
IR LLVM Backend For MTG LLVM Frontend LLVM Middleend MTG アセンブリ 計算結果 MTG -
(補足)MTG でコンピュータに関する概念を扱う方法 • MTGにはレジスタやメモリといった概念が存在しない • 代わりに、ゲーム上の概念(特定のカード , 領域, コンポーネントなど)を用いてそれらを表現する 一般的な概念
MTGマイクロコントローラでの表現 PCが指している命令 山札の上から 1,2,3枚目にある基本土地 命令をデコード 山札の上から順に基本土地を 3枚戦場に出す 命令の種類 戦場に出た基本土地たちの組み合わせ 汎用レジスタ GRx 特定の種族 yを持つ 汎用レジスタの値 の上に置かれている +1/+1 カウンターの数 … … PCが指すアドレスから命令をデコードし、 その命令がAdd GR1, GR2 であるならば、 GR1にGR2が保持している値を加算する 山札の上から基本土地カードを 3枚戦場に出し、 それらが順に であるならば、 種族 Brushwagg を持つ の上に 種族 Camarid を持つ の上にある個数と同じだけ +1/+1カウンターを置く -
• 利用できるレジスタは計 13本 ◦ 汎用レジスタ R0~R11, ◦ フラグレジスタ FLAG •
命令セットは一般的なバックエンドに比べシンプル( 全部合わせて 40命令未満 ) ◦ 即値, レジスタ値の代入 ◦ 四則演算 ▪ 負の数に対する演算には対応していない ◦ 比較演算 ▪ Ra< Rb か判定 ▪ Ra= 0 か判定 ◦ プログラム制御命令 ▪ 無条件ジャンプ ▪ 条件付きジャンプ ▪ 関数呼び出し ▪ リターン ◦ 入出力命令 ◦ RND命令 • 命令とメモリは別領域に確保 MTG アセンブリの仕様(一部) -
実装方針 • 0から実装するのではなく、既にあるBackendターゲットの実装をMTG向けに 修正していく方針で実装 ◦ 実装のシンプルさから MSP430 ターゲットの実装を利用 • 実装する処理の内容や修正箇所は『作って学ぶコンピュータアーキテクチャ
』 を参 考に理解 • それでもわからない部分は直接ソースコードを読む https://gihyo.jp/book/2022/978-4-297-12914-9 より -
大まかな実装ログ(WIP) • MSP430ターゲットをコピーして、MSP430→MtGにリネームしただけの ターゲットを作成 • 当面不要になる命令や処理を削除 • retのみからなるLLVM IRをコンパイル可能に •
即値の代入命令を実装 • 加算, 減算, レジスタ代入命令を実装 • ロード/ストアを実装 • 簡易的なエミュレータを実装 • レジスタスピルを実装 • 比較命令を実装 • ジャンプ命令を疑似命令として実装 • 関数呼び出しを実装 -
• 課題 ◦ アドレス解決や疑似命令の展開 ◦ 生成したアセンブリを実行できるようにエミュレータを更新 ◦ 負の数を用いた演算への対応 ◦ …
• 展望 ◦ MTG計算機の計算能力の向上 ▪ 実行できる命令をより扱いやすいものに変更 ◦ より複雑なコードのコンパイル ▪ HW emulator running on MTGをしたい 今後の課題&展望