Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Magic: The Gatheringで Linuxを動かす

Avatar for えすびて えすびて
May 30, 2026
2.6k

Magic: The Gatheringで Linuxを動かす

Avatar for えすびて

えすびて

May 30, 2026

Transcript

  1. この発表は何? • MtG: 30年以上の歴史を持つカードゲーム ◦ これまでに様々な効果を持つカードが作られている • 2024年、MtGのカードを組み合わせることによって 独⾃のAsmを実⾏する計算機が構築される(後述) ◦

    Howe Choong Yin and Alex Churchill, “A Programming Language Embedded in Magic: The Gathering”, FUN 2024 • 既存のプログラムをMtG Asmに変換できれば、いろいろ遊べる MtG計算機 MtG Asm
  2. この発表は何? • プログラムの変換といえばコンパイラ • MtG Asmをコンパイルターゲットにした LLVM Backendを開発した(している) ◦ Writing

    an LLVM Backend that Compiles Code to Magic: The Gathering ◦ Magic: The Gathering をコンパイルターゲットにした LLVM Backendの紹介 • Clang Frontendと合わせることで、C⾔語で書かれたコードをMtGで実⾏可能に • ⾯⽩そうなCプログラムはないか? MtG計算機 MtG Asm MtG コンパイラ C Program
  3. MtG上の計算機って何? • Howe and Churchill (2024) によるMtG計算機の概要を説明する • 説明の都合上、⼀部のカード効果‧挙動を簡略化している ◦

    厳密な効果‧挙動を知りたい⼈は、論⽂や改良版のHTMLを参照 • 要点:MtG計算機は①の仮定の下、②③を⾏うことでAsmを実⾏する ◦ ①計算機における概念をMtGにおける概念に対応づける ◦ ②「命令の実⾏」に相当するMtG上の操作を⾏うコンボを(命令の種類数だけ)作る ◦ ③ 命令のfetch+decodeに相当するコンボを作成し、②で実⾏するコンボを制御する
  4. ①計算機における概念をMtGにおける概念に対応づける • MtGにはレジスタやメモリといった概念が(ルール上は)存在しないので、 ゲーム上の概念(特定のカード, 領域, カウンターなど)でそれらを表現する ◦ レジスタxとその値 ⇔ 種族yの

    とそれに置かれている+1/+1カウンター  の数 ◦ メモリ番地zとその値⇔パワーがzである とそれに置かれている  の数 ◦ PCがさす命令 ⇔ ⾃分の⼭札の上から3枚のカードの内容 ◦ … • MtG計算機ではこの表現の上で計算機と同等の挙動が⾏われることを⽬指す ◦ INC Rx 命令 (Rx← Rx + 1) の実⾏ ⇔ 種族yを持つ の上に  を⼀つ新たに置く ◦ この挙動を実現するために、カードを組み合わせてコンボを作る(次ページ) +1 +1 +1 +1 +1 +1
  5. • 例:INC R0 を実⾏するコンボ ◦ MtG上での表現:種族Aetherbornを持つ の上に  を⼀つ新たに置く • に+1/+1 カウンターを⼀つ置きたい

    • そのために  を使う ②「命令の実⾏」を⾏うコンボを作る 種族: Aetherborn (R0に相当) 効果, パワー: 略 種族: 略 効果: 戦闘の開始時、自分以外の クリーチャーに自分のパワーの 個数+1/+1カウンターを置く パワー: 1 +1 +1
  6. • 例:INC R0 を実⾏するコンボ ◦ MtG上での表現:種族Aetherbornを持つ の上に  を⼀つ新たに置く • に+1/+1 カウンターを⼀つ置きたい

    • そのために  を使う ②「命令の実⾏」を⾏うコンボを作る 種族: Aetherborn (R0に相当) 効果, パワー: 略 種族: 略 効果: 戦闘の開始時、自分以外の クリーチャーに自分のパワーの 個数+1/+1カウンターを置く パワー: 1 +1 +1
  7. • 戦闘時に の効果が誘発し、⾃分以外のクリーチャーに を(⾃⾝のパワーである)1個置く • 以外のクリーチャーは  しかいないので、 この上に置かれる • →

    INC R0 が達成される • Add, Divなどの他の命令に対しても 同様にコンボを作成する 例:INC R0 を実⾏するコンボ(簡略版) 種族: Aetherborn (R0に相当) 効果, パワー: 略 +1 +1 +1 +1 種族: 略 効果: 戦闘の開始時、自分以外の クリーチャーに自分のパワーの 個数+1/+1カウンターを置く パワー: 1 MtGに詳しい人向けの補足:Joraga Warcallerの本来のクリーチャータイプは Elf Warrior ですが、計算機のセットアップ時点でArtificial Evolutionによってこれが書き換わっています。また、Halana and Alena, Partnersの基本のパワーとタフネスは2/3ですが、これもセット アップ時点でBelbe's Armor及びSaw in Halfによって0/2に調整されています
  8. ③ 命令のfetch+decodeに相当するコンボ • MtG計算機では各命令に対して「カード3枚の並び」が割り当たっている ◦ 例:    → INC1 R0 ◦ …

    • 適切にカードを組み合わせることによって以下の挙動をするコンボを作ることができる ◦ 1. ⾃分のターンの最初に⼭札の上から3枚を盤⾯に出す ◦ 2.「 盤⾯に出た3枚に対応する命令」を実⾏するコンボを特定する ◦ 3. 特定したコンボのみを盤⾯に残し、それ以外のコンボをこのターン盤⾯から消去する • つまり、fetch+decode 操作を⾏うコンボを構成できる • これによって、アセンブリの命令列を先頭から順に実⾏していくという 計算機の挙動が実現できる ◦ そのため「プログラム全体」は「⾃分の⼭札全体」に対応する ◦ また、この対応によってBranch命令やCall命令を作ることができる
  9. デモ • MtG計算機の実際の構成盤⾯ ◦ 通常のゲーム開始の初期盤⾯から 適切にプレイすることでこの盤⾯に到達可能 • この状態でターンを進めると、 前述の形で命令読み出し+実⾏が 強制的に⾏われる

    ◦ ⾃分+対戦相⼿の1ターンで1命令を実⾏する • LinuxのImageはメモリにあらかじめ カードとして格納されている 命令フェッチ+デコード 命令実行 レジスタ その他 命令フェッチ+デコード 命令実行 メモリ その他
  10. デモ • 以降同様に、カウンターが乗った 同じカードが⽣成されていく • これはグッとにらむと⽂字コードっぽい ↓ • そこで、これらをascii⽂字に変換すると Linuxのブートログになっている!

    ◦ ⼭札として埋め込んだRISC-Vエミュレータで カードとして埋め込んだLinuxを実⾏できている • その後 534,088,770,633ターン⽬に ログインプロンプトが表⽰される [ 0.000000] Linux version 6.1.14 …. Welcome to Buildroot buildroot login:
  11. デモ • その後定期的に  の効果が誘発する • これが⼊⼒ストリームに相当 ◦ 宣⾔した数字が(内部のコンボを経て) 出⼒ストリームに表⽰される •

    シェルにログインできた! • 実⾏ターン数: 578,513,586,637 buildroot login: root Jan 1 00:00:00 login[28]: root login on 'console' ~ #
  12. まとめと展望 まとめ • Howe and Churchill (2024) のMtG計算機向けにRISC-Vエミュレータをコンパイ後、 その上でLinuxイメージを実⾏することでMtG上でLinuxを動かした 今後の展望

    • 1. 論⽂の構成にバグがないかの検証 ◦ 今回の検証はAsmレベルで(=論⽂の構成が正しいことを仮定して)実⾏したため • 2. パフォーマンス改善 ◦ コンパイラにMtG向けの最適化パスを実装 • 3. MtG on MtG ◦ メモリの内容がすべて盤⾯として⾒えているので、メンタルポーカー問題のMtGバージョンが必要になるはず