Slide 1

Slide 1 text

Magic: The Gatheringで Linuxを動かす えすびて (𝕏: @nbit0125) 2026/6/1 ⼀部表現を修正‧補⾜を追加

Slide 2

Slide 2 text

この発表は何? ● 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

Slide 3

Slide 3 text

この発表は何? ● プログラムの変換といえばコンパイラ ● 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

Slide 4

Slide 4 text

この発表は何? ● cnlohr/mini-rv32ima:C⾔語で書かれたRISC-Vのエミュレータ ○ ファイル全体で500⾏程度とシンプルながら、なんとLinuxを動かせる ● これをMtGコンパイラでMtG Asmに変換すれば、 Linuxを(RISC-Vエミュレータごしに)MtGで動かせるのでは!? ● →実際にやってみた MtG計算機 MtG Asm MtG コンパイラ mini-rv32ima Linux Image +

Slide 5

Slide 5 text

MtG上の計算機って何? ● Howe and Churchill (2024) によるMtG計算機の概要を説明する ● 説明の都合上、⼀部のカード効果‧挙動を簡略化している ○ 厳密な効果‧挙動を知りたい⼈は、論⽂や改良版のHTMLを参照 ● 要点:MtG計算機は①の仮定の下、②③を⾏うことでAsmを実⾏する ○ ①計算機における概念をMtGにおける概念に対応づける ○ ②「命令の実⾏」に相当するMtG上の操作を⾏うコンボを(命令の種類数だけ)作る ○ ③ 命令のfetch+decodeに相当するコンボを作成し、②で実⾏するコンボを制御する

Slide 6

Slide 6 text

①計算機における概念をMtGにおける概念に対応づける ● MtGにはレジスタやメモリといった概念が(ルール上は)存在しないので、 ゲーム上の概念(特定のカード, 領域, カウンターなど)でそれらを表現する ○ レジスタxとその値 ⇔ 種族yの とそれに置かれている+1/+1カウンター  の数 ○ メモリ番地zとその値⇔パワーがzである とそれに置かれている  の数 ○ PCがさす命令 ⇔ ⾃分の⼭札の上から3枚のカードの内容 ○ … ● MtG計算機ではこの表現の上で計算機と同等の挙動が⾏われることを⽬指す ○ INC Rx 命令 (Rx← Rx + 1) の実⾏ ⇔ 種族yを持つ の上に  を⼀つ新たに置く ■ 補⾜:実際の論⽂中ではこの命令はAdd1という名前で定義されている(挙動は同じ) ○ この挙動を実現するために、カードを組み合わせてコンボを作る(次ページ) +1 +1 +1 +1 +1 +1

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

● 戦闘時に の効果が誘発し、⾃分以外のクリーチャーに を(⾃⾝のパワーである)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に調整されています

Slide 10

Slide 10 text

③ 命令のfetch+decodeに相当するコンボ ● MtG計算機では各命令に対して「カード3枚の並び」が割り当たっている ○ 例:    → INC R0 ○ … ● 適切にカードを組み合わせることによって以下の挙動をするコンボを作ることができる ○ 1. ⾃分のターンの最初に⼭札の上から3枚を盤⾯に出す ○ 2.「 盤⾯に出た3枚に対応する命令」を実⾏するコンボを特定する ○ 3. 特定したコンボのみを盤⾯に残し、それ以外のコンボをこのターン盤⾯から消去する ● つまり、fetch+decode 操作を⾏うコンボを構成できる ● これによって、アセンブリの命令列を先頭から順に実⾏していくという 計算機の挙動が実現できる ○ そのため「プログラム全体」は「⾃分の⼭札全体」に対応する ○ また、この対応によってBranch命令やCall命令を作ることができる

Slide 11

Slide 11 text

MtG上の計算機って何?(まとめ) ● ①計算機における概念をMtGにおける概念に対応づける ● ②「命令の実⾏」に相当するMtG上の操作を⾏うコンボを(命令の数だけ)作る ● ③ 「命令のfetch+decode」に相当するコンボを作成し、順番通りに命令を実⾏する

Slide 12

Slide 12 text

デモ ● MtG計算機の実際の構成盤⾯ ○ 通常のゲーム開始の初期盤⾯から 適切にプレイすることでこの盤⾯に到達可能

Slide 13

Slide 13 text

デモ ● MtG計算機の実際の構成盤⾯ ○ 通常のゲーム開始の初期盤⾯から 適切にプレイすることでこの盤⾯に到達可能 ● この状態でターンを進めると、 前述の形で命令読み出し+実⾏が 強制的に⾏われる ○ ⾃分+対戦相⼿の1ターンで1命令を実⾏する ● LinuxのImageはメモリにあらかじめ カードとして格納されている 命令フェッチ+デコード 命令実行 レジスタ その他 命令フェッチ+デコード 命令実行 メモリ その他

Slide 14

Slide 14 text

デモ ● 4,417,143,891 ターン⽬、  が91個乗った 「タコ‧トークン」カードが⽣成される ● MtG計算機上では出⼒ストリームに相当 +1 +1 x91 +1 +1

Slide 15

Slide 15 text

デモ ● 以降同様に、カウンターが乗った 同じカードが⽣成されていく 91,32

Slide 16

Slide 16 text

デモ ● 以降同様に、カウンターが乗った 同じカードが⽣成されていく 91,32,32,32

Slide 17

Slide 17 text

デモ ● 以降同様に、カウンターが乗った 同じカードが⽣成されていく 91,32,32,32,32,48,46,48,48,48,48,48,

Slide 18

Slide 18 text

デモ ● 以降同様に、カウンターが乗った 同じカードが⽣成されていく ● これはグッとにらむと⽂字コードっぽい 91,32,32,32,32,48,46,48,48,48,48,48, 48,93,32,76,105,110,117,120,32,118,101,1 14,115,105,111,110,32,54,46,49,46,49,52

Slide 19

Slide 19 text

デモ ● 以降同様に、カウンターが乗った 同じカードが⽣成されていく ● これはグッとにらむと⽂字コードっぽい ↓ ● そこで、これらをascii⽂字に変換すると Linuxのブートログになっている! ○ ⼭札として埋め込んだRISC-Vエミュレータで カードとして埋め込んだLinuxを実⾏できている [ 0.000000] Linux version 6.1.14

Slide 20

Slide 20 text

デモ ● 以降同様に、カウンターが乗った 同じカードが⽣成されていく ● これはグッとにらむと⽂字コードっぽい ↓ ● そこで、これらをascii⽂字に変換すると Linuxのブートログになっている! ○ ⼭札として埋め込んだRISC-Vエミュレータで カードとして埋め込んだLinuxを実⾏できている ● その後 534,088,770,633ターン⽬に ログインプロンプトが表⽰される [ 0.000000] Linux version 6.1.14 …. Welcome to Buildroot buildroot login:

Slide 21

Slide 21 text

デモ ● その後定期的に  の効果が誘発する ● これが⼊⼒ストリームに相当 ○ 宣⾔した数字が(内部のコンボを経て) 出⼒ストリームに表⽰される buildroot login:      正の整数を宣⾔し、 その数だけダメージを 与える

Slide 22

Slide 22 text

デモ ● その後定期的に  の効果が誘発する ● これが⼊⼒ストリームに相当 ○ 宣⾔した数字が(内部のコンボを経て) 出⼒ストリームに表⽰される buildroot login:      正の整数を宣⾔し、 その数だけダメージを 与える ord(‘r’)=114を宣言

Slide 23

Slide 23 text

デモ ● その後定期的に  の効果が誘発する ● これが⼊⼒ストリームに相当 ○ 宣⾔した数字が(内部のコンボを経て) 出⼒ストリームに表⽰される buildroot login: r

Slide 24

Slide 24 text

デモ ● その後定期的に  の効果が誘発する ● これが⼊⼒ストリームに相当 ○ 宣⾔した数字が(内部のコンボを経て) 出⼒ストリームに表⽰される buildroot login: r      正の整数を宣⾔し、 その数だけダメージを 与える 111を宣言

Slide 25

Slide 25 text

デモ ● その後定期的に  の効果が誘発する ● これが⼊⼒ストリームに相当 ○ 宣⾔した数字が(内部のコンボを経て) 出⼒ストリームに表⽰される buildroot login: ro

Slide 26

Slide 26 text

デモ ● その後定期的に  の効果が誘発する ● これが⼊⼒ストリームに相当 ○ 宣⾔した数字が(内部のコンボを経て) 出⼒ストリームに表⽰される buildroot login: ro      正の整数を宣⾔し、 その数だけダメージを 与える 111を宣言

Slide 27

Slide 27 text

デモ ● その後定期的に  の効果が誘発する ● これが⼊⼒ストリームに相当 ○ 宣⾔した数字が(内部のコンボを経て) 出⼒ストリームに表⽰される buildroot login: roo

Slide 28

Slide 28 text

デモ ● その後定期的に  の効果が誘発する ● これが⼊⼒ストリームに相当 ○ 宣⾔した数字が(内部のコンボを経て) 出⼒ストリームに表⽰される buildroot login: roo      正の整数を宣⾔し、 その数だけダメージを 与える 116を宣言

Slide 29

Slide 29 text

デモ ● その後定期的に  の効果が誘発する ● これが⼊⼒ストリームに相当 ○ 宣⾔した数字が(内部のコンボを経て) 出⼒ストリームに表⽰される buildroot login: root

Slide 30

Slide 30 text

デモ ● その後定期的に  の効果が誘発する ● これが⼊⼒ストリームに相当 ○ 宣⾔した数字が(内部のコンボを経て) 出⼒ストリームに表⽰される buildroot login: root      正の整数を宣⾔し、 その数だけダメージを 与える 10を宣言

Slide 31

Slide 31 text

デモ ● その後定期的に  の効果が誘発する ● これが⼊⼒ストリームに相当 ○ 宣⾔した数字が(内部のコンボを経て) 出⼒ストリームに表⽰される ● シェルにログインできた! ● 実⾏ターン数: 578,513,586,637 buildroot login: root Jan 1 00:00:00 login[28]: root login on 'console' ~ #

Slide 32

Slide 32 text

まとめと展望 まとめ ● Howe and Churchill (2024)のMtG計算機向けにRISC-Vエミュレータをコンパイルし その上でLinuxイメージを実⾏することでMtG上でLinuxを動かした 今後の展望 ● 1. 論⽂の構成にバグがないかの検証 ○ 今回の検証は論⽂の構成が正しいことを仮定して、Asmレベルでのシミュレータを⽤いて⾏ったため ● 2. パフォーマンス改善 ○ コンパイラにMtG向けの最適化パスを実装 ● 3. MtG on MtG ○ メモリの内容がすべて盤⾯として⾒えているので、メンタルポーカー問題のMtGバージョンが必要になるはず

Slide 33

Slide 33 text

ご清聴ありがとうございました! 本スライドはファンコンテンツ‧ポリシーに沿った⾮公式のファンコンテンツです。ウィザーズ社の認可/許諾は得ていません。 題材の⼀部に、ウィザーズ‧オブ‧ザ‧コースト社の財産を含んでいます。©Wizards of the Coast LLC.