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
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
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
zero-micro: Codex Microがzero-kb02にそっくりだったので作ったった
makki_d
0
90
テストだけじゃない!インプロセスDBで生まれるGoらしさ
makki_d
0
80
テストだけじゃない!インプロセスDBで生まれるGoらしさ
makki_d
0
82
SQLだけでマイグレーションしたい!
makki_d
0
1.4k
Recap: An Operating System in Go
makki_d
2
210
XSLTで作るBrainfuck処理系
makki_d
0
450
眼鏡と視力についての誤解を解く
makki_d
0
260
標準ライブラリの動向とイテレータのパフォーマンス
makki_d
3
800
range over funcのエラー処理
makki_d
1
1.9k
Other Decks in Technology
See All in Technology
「事実」を「計測」して、「解釈」する 〜AWS Lambdaのメモリ最適解の見つけ方〜
maimyyym
0
170
OptunaHub: ブラックボックス最適化のためのプラットフォーム
pfn
PRO
0
140
AI × アーキテクト 第1・2章|生成AIの課題とアーキテクトの素養
daidaidai
0
170
Gemini Intelligence 入門 ― AppFunctions と Gemini Nano
takuroabe
0
260
Benchmarking Disaggregated Serving on vLLM + Dynamo with a Real Coding-Agent Workload
nttcom
1
190
パスキーの自動テストはどこまでいけるのか
teamlab
PRO
0
250
TinyGoでオブザーバビリティ?OpenTelemetryはTinyGoで使えるのか / Is OpenTelemetry available in TinyGo environment?
ymotongpoo
2
140
Code for Security プロジェクト紹介 2026年10月
yu23ki14
0
110
ブラウザとサーバーから考えるAI時代のフロントエンド監視
shogo4131
3
940
AI導入は済んだ。次は統制を作り替える番だ_AI×開発組織 Summit 2026
techtekt
PRO
0
240
フロントエンドカンファレンス関西2026 - 速すぎるUIに、待ち時間を
teamlab
PRO
0
130
初海外で注意すべきこと12選!!!安全快適なre:invent生活にするために
yuuuuuuu168
1
160
Featured
See All Featured
How People are Using Generative and Agentic AI to Supercharge Their Products, Projects, Services and Value Streams Today
helenjbeal
2
360
Rails Girls Zürich Keynote
gr2m
96
14k
YesSQL, Process and Tooling at Scale
rocio
174
15k
AI Search: Implications for SEO and How to Move Forward - #ShenzhenSEOConference
aleyda
1
1.4k
Producing Creativity
orderedlist
PRO
348
41k
jQuery: Nuts, Bolts and Bling
dougneiner
66
8.6k
The Mindset for Success: Future Career Progression
greggifford
PRO
0
540
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.8k
Why Your Marketing Sucks and What You Can Do About It - Sophie Logan
marketingsoph
0
430
The Language of Interfaces
destraynor
162
27k
Max Prin - Stacking Signals: How International SEO Comes Together (And Falls Apart)
techseoconnect
PRO
0
490
Amusing Abliteration
ianozsvald
1
350
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でグラフ化