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

Magic: The Gatheringで Linuxを動かす

Avatar for えすびて えすびて
May 30, 2026
490

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バージョンが必要になるはず