Magic: The Gatheringで Linuxを動かす
by
えすびて
×
Copy
Open
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
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.