Slide 1

Slide 1 text

M4でBrainfuckを 動かす話 KLab株式会社 EM部 牧内大輔

Slide 2

Slide 2 text

自己紹介 牧内大輔(MakKi) twitter: @makki_d GitHub: makiuchi-d 学生時代: 動画編集関連のフリーソフト 就職してから: ブラウザゲームの開発(モバゲー・GREE) EMLauncher(デバッグアプリ配布ツール) 同期対戦通信基盤(Unity・Websocket・Go)

Slide 3

Slide 3 text

まずアンケート ● M4知ってる人

Slide 4

Slide 4 text

まずアンケート ● M4知ってる人 ● Brainfuck知ってる人

Slide 5

Slide 5 text

まずアンケート ● M4知ってる人 ● Brainfuck知ってる人 ● チューリング完全知ってる人

Slide 6

Slide 6 text

M4 is 何?

Slide 7

Slide 7 text

M4 is 何? “m4 は、ブライアン・カーニハンとデニス・リッチー が設計した汎用マクロプロセッサである。その 名称は、"macro" の "m" と、AP-3ミニコンピュータ でデニス・リッチーがそれ以前に書いたマクロプロ セッサ "m3" の次、というところから来ている。 出展:wikipedia http://ja.wikipedia.org/wiki/M4_(プログラミング言語)

Slide 8

Slide 8 text

マクロプロセッサ?

Slide 9

Slide 9 text

マクロプロセッサ define(`H’, `Hello, $1!!’) こんなマクロを定義して

Slide 10

Slide 10 text

マクロプロセッサ define(`H’, `Hello, $1!!’) H(KLab) こんなふうに呼び出すと

Slide 11

Slide 11 text

マクロプロセッサ define(`H’, `Hello, $1!!’) H(KLab) Hello, KLab!! これが出力される

Slide 12

Slide 12 text

マクロプロセッサ define(`H’, `Hello, $1!!’) H(KLab) Hello, KLab!! これが出力される テキストを置換するのが基本動作

Slide 13

Slide 13 text

M4 is 何? “......それ以前のマクロプロセッサとは異なり、特 定のコンピュータ言語や自然言語を対象としたも のではない。ただし、もとはFORTRANの方言であ るRatforの開発で使うために開発された。他のマク ロプロセッサとは異なり、m4 は一般的なプログラミ ング言語と同様、チューリング完全である。 出展:wikipedia http://ja.wikipedia.org/wiki/M4_(プログラミング言語)

Slide 14

Slide 14 text

チューリング完全?

Slide 15

Slide 15 text

チューリング完全 “計算理論において、ある計算のメカニズムが万能チューリン グマシンと同じ計算能力をもつとき、その計算モデルはチューリ ング完全(チューリングかんぜん、Turing-complete)あるいは 計算完備であるという。 (中略) 簡単に言えば、チューリング完全であれば、実現 可能なアルゴリズムや手続きはすべて処理できる ということを意味している。 出展:wikipedia http://ja.wikipedia.org/wiki/チューリング完全

Slide 16

Slide 16 text

つまり コンピュータで動かせるアルゴリズムは 全てM4でも記述できる

Slide 17

Slide 17 text

つまり コンピュータで動かせるアルゴリズムは 全てM4でも記述できる M4は万能

Slide 18

Slide 18 text

確かめてみよう

Slide 19

Slide 19 text

確かめてみよう チューリング完全の証明 ● チューリング完全な処理系を 実装できればOK

Slide 20

Slide 20 text

確かめてみよう チューリング完全の証明 ● チューリング完全な処理系を 実装できればOK チューリング完全な処理系 Brainfuck

Slide 21

Slide 21 text

Brainfuckとは +++++++++[>++++++++>+++++++++++>+++++<<< -]>.>++.+++++++..+++.>-.------------.<++ ++++++.--------.+++.------.--------.>+. Hello, world!

Slide 22

Slide 22 text

M4で実装してみた

Slide 23

Slide 23 text

実演

Slide 24

Slide 24 text

結論 M4はチューリング完全である みんなもM4をつかってみよう!!

Slide 25

Slide 25 text

ありがとうございました。

Slide 26

Slide 26 text

実装の詳細

Slide 27

Slide 27 text

Brainfuckの構成要素 ● メモリ配列 ● その上を動くポインタ ● 入力 ● 出力

Slide 28

Slide 28 text

Brainfuckの命令 ● > : ポインタのインクリメント ● < : ポインタのデクリメント ● + : ポインタの指す値のインクリメント ● - : ポインタの指す値のデクリメント ● [ : ループ始点 ● ] : ループ終点 (ポインタの指す値が0以外なら対応する[へジャンプ) ● . : ポインタの指す値を出力 ● , : 入力をポインタの指す場所に書き込む

Slide 29

Slide 29 text

対応するマクロ ● > : ip ● < : dp ● + : ic ● - : dc ● [ : bn ● ] : ed ● . : pr ● , : ???

Slide 30

Slide 30 text

Brainfuckをマクロに変換 変換前  >++++[-<++++++++>]<+. 変換後  `'ip`'ic`'ic`'ic`'ic`'bn(``'dc  `'dp`'ic`'ic`'ic`'ic`'ic`'ic  `'ic`'ic`'ip')`'ed`'dp`'ic`'pr

Slide 31

Slide 31 text

変換 define(`token', `changequote({,})ifelse( {$1}, {>}, {`'ip}, {$1}, {<}, {`'dp}, {$1}, {+}, {`'ic}, {$1}, {-}, {`'dc}, {$1}, {.}, {`'pr}, {$1}, {[}, {`'bn(`}, {$1}, {]}, {')`'ed}){}changequote') define(`parse', `ifelse( eval(len(`$*')>0), 1, `token(substr(`$*',0,1))`'parse(substr(`$*',1))')') define(`internal', parse(include(`/dev/stdin')))

Slide 32

Slide 32 text

ポインタの実装 define(`ptr', `0') 初期値0として定義 define(`ip', `define(`ptr', incr(defn(`ptr')))`'') ptrの定義をincrした値でptrを再定義 define(`dp', `define(`ptr', decr(defn(`ptr')))`'') ptrの定義をdecrした値でptrを再定義

Slide 33

Slide 33 text

配列の実装 M4には配列がない… そこで、 “_0_”, “_1_”, “_2_”, … を配列とする 値の書き込み define(`_’defn(`ptr’)`_’, 1) 値の取り出し defn(`_’defn(`ptr’)`_’) ⇒ “1”

Slide 34

Slide 34 text

配列の値の操作の実装 define(`cv', `eval(defn(`_'defn(`ptr')`_')+0)') ポインタの指す値を取り出す define(`ic', `define(`_'defn(`ptr')`_', incr(cv))`'') cvで取り出した値をincrして再定義 define(`dc', `define(`_'defn(`ptr')`_', decr(cv))`'') cvで取り出した値をdecrして再定義

Slide 35

Slide 35 text

ループの実装 define(`bn', `pushdef(`s', `ifelse(eval(cv>0), 1, `$1`'s')')') 次のようなマクロ s を定義 cvの値が0以上のとき 引数の文字列をまるごと展開 s自身を再帰呼出し define(`ed', `s`'popdef(`s')') bnで定義された s を展開

Slide 36

Slide 36 text

出力の実装 define(`pr', `format(`%c', cv)') cvで取り出した値をフォーマットして出力

Slide 37

Slide 37 text

入力は? 標準入力はBrainfuckコードの入力 このままでは “,” を実装できない

Slide 38

Slide 38 text

入力は? 標準入力はBrainfuckコードの入力 このままでは “,” を実装できない “A”が入力したければ “+”を65回書けばいいじゃない ⇒ “,”は実質不要

Slide 39

Slide 39 text

詳しく見たい人は… GitHubにて公開しているのでどうぞ https://github.com/makiuchi-d/bfm4 もし技術書典3に参加されるなら… 「い03企」にて掲載本頒布予定 (後日web配信も計画中)

Slide 40

Slide 40 text

ありがとうございました。

Slide 41

Slide 41 text

No content

Slide 42

Slide 42 text

実際問題使えるの?

Slide 43

Slide 43 text

No content

Slide 44

Slide 44 text

スクフェスモブキャラ相関図

Slide 45

Slide 45 text

スクフェスモブキャラ相関図 https://github.com/makiuchi-d/mob-graph ● m4スクリプトでdotスクリプトを生成 ● graphvizでグラフ化