Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
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
74
テストだけじゃない!インプロセスDBで生まれるGoらしさ
makki_d
0
78
SQLだけでマイグレーションしたい!
makki_d
0
1.4k
Recap: An Operating System in Go
makki_d
2
200
XSLTで作るBrainfuck処理系
makki_d
0
450
眼鏡と視力についての誤解を解く
makki_d
0
260
標準ライブラリの動向とイテレータのパフォーマンス
makki_d
3
790
range over funcのエラー処理
makki_d
1
1.9k
GoとテストとインプロセスDB
makki_d
3
720
Other Decks in Technology
See All in Technology
ADKで始める業務改善 - AIエージェント開発時の考えと設計
harappa80
2
290
AWS DevOps Agent スキルをつかいこなそう / Master AWS DevOps Agent Skills
kinunori
2
510
10年欲しかった音楽管理アプリを、AIと一緒に作りはじめた
judau
1
120
Coil3を内部実装から読み解く~キャッシュ戦略とAVIF画像の描画〜/nikkei-tech-talk50
nikkei_engineer_recruiting
0
110
What the customer really needed
kawaguti
PRO
3
230
Kiro Meetup #8 Kiro アップデート (2026/3/21〜2026/9/24)
katzueno
1
250
あけおめLINE 傾向とその対策
nasa9084
0
330
SREの視点で考えるSIEM活用術 〜AWS環境でのセキュリティ強化〜
cscengineer
PRO
0
370
Hermes Agentで、AIが調べて記事を書くブログを作った話
blueb
0
110
AIエージェント時代のPlatform as a Product —— テックリードがPdMとして回す発見・導入・計測 / Platform as a Product in the AI Agent Era
toshi0607
0
200
負債のメタファと2026年 / Debt Metaphor in Agentic Engineering Age 202609 Edition
twada
PRO
13
7.6k
AI coding 整合正規方法
philipz
0
550
Featured
See All Featured
Impact Scores and Hybrid Strategies: The future of link building
tamaranovitovic
0
440
What Being in a Rock Band Can Teach Us About Real World SEO
427marketing
0
1.1k
Max Prin - Stacking Signals: How International SEO Comes Together (And Falls Apart)
techseoconnect
PRO
0
470
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.8k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
128
56k
Visual Storytelling: How to be a Superhuman Communicator
reverentgeek
2
670
We Have a Design System, Now What?
morganepeng
55
8.3k
Product Roadmaps are Hard
iamctodd
55
13k
The Straight Up "How To Draw Better" Workshop
denniskardys
239
140k
Unsuck your backbone
ammeep
672
58k
Leading Effective Engineering Teams in the AI Era
addyosmani
9
2.6k
Hiding What from Whom? A Critical Review of the History of Programming languages for Music
tomoyanonymous
3
1.3k
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でグラフ化