Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
M4でBrainfuckを動かす話
Search
MakKi
October 12, 2017
Technology
460
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
M4でBrainfuckを動かす話
MakKi
October 12, 2017
More Decks by MakKi
See All by MakKi
テストだけじゃない!インプロセスDBで生まれるGoらしさ
makki_d
0
52
テストだけじゃない!インプロセスDBで生まれるGoらしさ
makki_d
0
65
SQLだけでマイグレーションしたい!
makki_d
0
1.4k
Recap: An Operating System in Go
makki_d
2
180
XSLTで作るBrainfuck処理系
makki_d
0
420
眼鏡と視力についての誤解を解く
makki_d
0
230
標準ライブラリの動向とイテレータのパフォーマンス
makki_d
3
780
range over funcのエラー処理
makki_d
1
1.9k
GoとテストとインプロセスDB
makki_d
3
700
Other Decks in Technology
See All in Technology
強化学習「理論」入門
enakai00
3
3.6k
ボトムアップ文化が強い組織で セキュリティをどう根付かせていくかの現在進行形の話 / Making Security Stick in a Bottom-Up Organization
yamaguchitk333
0
200
サイバー捜査員研修(後半)
nomizone
1
810
第3回しろおびセキュリティスポンサーセッション
log0417
0
160
モダンフロントエンド 開発研修
recruitengineers
PRO
3
560
メルカリのグローバルアプリで挑んだ AlloyDB 運用と課題解決の実践記
hatappi
0
240
つくって納得、つかって実感! 大規模言語モデルことはじめ ver2.0
recruitengineers
PRO
3
1.2k
PLATEAU で バーチャル花火大会
tatsuya1970
0
110
名刺メーカーDevグループ 紹介資料
sansan33
PRO
0
1.2k
関東Kaggler会発表資料
takoi
1
180
20260801_スクフェス大阪
kgnkhkr
2
1.2k
AIコーディングの次。コードレビューと理解負荷を解消して組織の開発生産性を高める
moongift
PRO
2
2.3k
Featured
See All Featured
Measuring & Analyzing Core Web Vitals
bluesmoon
9
950
Building the Perfect Custom Keyboard
takai
2
830
世界の人気アプリ100個を分析して見えたペイウォール設計の心得
akihiro_kokubo
PRO
73
41k
Product Roadmaps are Hard
iamctodd
55
12k
Optimizing for Happiness
mojombo
378
71k
Ethics towards AI in product and experience design
skipperchong
2
340
The World Runs on Bad Software
bkeepers
PRO
72
12k
The Mindset for Success: Future Career Progression
greggifford
PRO
0
440
SERP Conf. Vienna - Web Accessibility: Optimizing for Inclusivity and SEO
sarafernandez
2
1.5k
SEO Brein meetup: CTRL+C is not how to scale international SEO
lindahogenes
1
2.8k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
28
3.6k
Lightning talk: Run Django tests with GitHub Actions
sabderemane
0
230
Transcript
M4でBrainfuckを 動かす話 KLab株式会社 EM部 牧内大輔
自己紹介 牧内大輔(MakKi) twitter: @makki_d GitHub: makiuchi-d 学生時代: 動画編集関連のフリーソフト 就職してから: ブラウザゲームの開発(モバゲー・GREE)
EMLauncher(デバッグアプリ配布ツール) 同期対戦通信基盤(Unity・Websocket・Go)
まずアンケート • M4知ってる人
まずアンケート • M4知ってる人 • Brainfuck知ってる人
まずアンケート • M4知ってる人 • Brainfuck知ってる人 • チューリング完全知ってる人
M4 is 何?
M4 is 何? “m4 は、ブライアン・カーニハンとデニス・リッチー が設計した汎用マクロプロセッサである。その 名称は、"macro" の "m" と、AP-3ミニコンピュータ
でデニス・リッチーがそれ以前に書いたマクロプロ セッサ "m3" の次、というところから来ている。 出展:wikipedia http://ja.wikipedia.org/wiki/M4_(プログラミング言語)
マクロプロセッサ?
マクロプロセッサ define(`H’, `Hello, $1!!’) こんなマクロを定義して
マクロプロセッサ define(`H’, `Hello, $1!!’) H(KLab) こんなふうに呼び出すと
マクロプロセッサ define(`H’, `Hello, $1!!’) H(KLab) Hello, KLab!! これが出力される
マクロプロセッサ define(`H’, `Hello, $1!!’) H(KLab) Hello, KLab!! これが出力される テキストを置換するのが基本動作
M4 is 何? “......それ以前のマクロプロセッサとは異なり、特 定のコンピュータ言語や自然言語を対象としたも のではない。ただし、もとはFORTRANの方言であ るRatforの開発で使うために開発された。他のマク ロプロセッサとは異なり、m4 は一般的なプログラミ ング言語と同様、チューリング完全である。
出展:wikipedia http://ja.wikipedia.org/wiki/M4_(プログラミング言語)
チューリング完全?
チューリング完全 “計算理論において、ある計算のメカニズムが万能チューリン グマシンと同じ計算能力をもつとき、その計算モデルはチューリ ング完全(チューリングかんぜん、Turing-complete)あるいは 計算完備であるという。 (中略) 簡単に言えば、チューリング完全であれば、実現 可能なアルゴリズムや手続きはすべて処理できる ということを意味している。 出展:wikipedia
http://ja.wikipedia.org/wiki/チューリング完全
つまり コンピュータで動かせるアルゴリズムは 全てM4でも記述できる
つまり コンピュータで動かせるアルゴリズムは 全てM4でも記述できる M4は万能
確かめてみよう
確かめてみよう チューリング完全の証明 • チューリング完全な処理系を 実装できればOK
確かめてみよう チューリング完全の証明 • チューリング完全な処理系を 実装できればOK チューリング完全な処理系 Brainfuck
Brainfuckとは +++++++++[>++++++++>+++++++++++>+++++<<< -]>.>++.+++++++..+++.>-.------------.<++ ++++++.--------.+++.------.--------.>+. Hello, world!
M4で実装してみた
実演
結論 M4はチューリング完全である みんなもM4をつかってみよう!!
ありがとうございました。
実装の詳細
Brainfuckの構成要素 • メモリ配列 • その上を動くポインタ • 入力 • 出力
Brainfuckの命令 • > : ポインタのインクリメント • < : ポインタのデクリメント •
+ : ポインタの指す値のインクリメント • - : ポインタの指す値のデクリメント • [ : ループ始点 • ] : ループ終点 (ポインタの指す値が0以外なら対応する[へジャンプ) • . : ポインタの指す値を出力 • , : 入力をポインタの指す場所に書き込む
対応するマクロ • > : ip • < : dp •
+ : ic • - : dc • [ : bn • ] : ed • . : pr • , : ???
Brainfuckをマクロに変換 変換前 >++++[-<++++++++>]<+. 変換後 `'ip`'ic`'ic`'ic`'ic`'bn(``'dc `'dp`'ic`'ic`'ic`'ic`'ic`'ic `'ic`'ic`'ip')`'ed`'dp`'ic`'pr
変換 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')))
ポインタの実装 define(`ptr', `0') 初期値0として定義 define(`ip', `define(`ptr', incr(defn(`ptr')))`'') ptrの定義をincrした値でptrを再定義 define(`dp', `define(`ptr',
decr(defn(`ptr')))`'') ptrの定義をdecrした値でptrを再定義
配列の実装 M4には配列がない… そこで、 “_0_”, “_1_”, “_2_”, … を配列とする 値の書き込み define(`_’defn(`ptr’)`_’,
1) 値の取り出し defn(`_’defn(`ptr’)`_’) ⇒ “1”
配列の値の操作の実装 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して再定義
ループの実装 define(`bn', `pushdef(`s', `ifelse(eval(cv>0), 1, `$1`'s')')') 次のようなマクロ s を定義 cvの値が0以上のとき
引数の文字列をまるごと展開 s自身を再帰呼出し define(`ed', `s`'popdef(`s')') bnで定義された s を展開
出力の実装 define(`pr', `format(`%c', cv)') cvで取り出した値をフォーマットして出力
入力は? 標準入力はBrainfuckコードの入力 このままでは “,” を実装できない
入力は? 標準入力はBrainfuckコードの入力 このままでは “,” を実装できない “A”が入力したければ “+”を65回書けばいいじゃない ⇒ “,”は実質不要
詳しく見たい人は… GitHubにて公開しているのでどうぞ https://github.com/makiuchi-d/bfm4 もし技術書典3に参加されるなら… 「い03企」にて掲載本頒布予定 (後日web配信も計画中)
ありがとうございました。
None
実際問題使えるの?
None
スクフェスモブキャラ相関図
スクフェスモブキャラ相関図 https://github.com/makiuchi-d/mob-graph • m4スクリプトでdotスクリプトを生成 • graphvizでグラフ化