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
XSLTで作るBrainfuck処理系
Search
MakKi
June 14, 2025
Programming
460
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
XSLTで作るBrainfuck処理系
関数型まつり2025
MakKi
June 14, 2025
More Decks by MakKi
See All by MakKi
zero-micro: Codex Microがzero-kb02にそっくりだったので作ったった
makki_d
0
94
テストだけじゃない!インプロセスDBで生まれるGoらしさ
makki_d
0
80
テストだけじゃない!インプロセスDBで生まれるGoらしさ
makki_d
0
84
SQLだけでマイグレーションしたい!
makki_d
0
1.4k
Recap: An Operating System in Go
makki_d
2
210
眼鏡と視力についての誤解を解く
makki_d
0
260
標準ライブラリの動向とイテレータのパフォーマンス
makki_d
3
800
range over funcのエラー処理
makki_d
1
1.9k
GoとテストとインプロセスDB
makki_d
3
730
Other Decks in Programming
See All in Programming
GemmaをJevのように使ってみる / Use Gemma like Jev
kishida
5
800
npm との違いを手がかりにGo の依存管理を理解したい
optim
0
860
ActionController meets Protocol Buffers
sorah
0
560
sbt 2.0: takeoff
eed3si9n
0
160
When benchmarks go bad - what I learned from measuring performance wrong
hollycummins
0
220
月間100万人のサービス刷新で、 技術選定をHonoに振り切った話
yutobara
8
6.7k
作って学ぶSpring BootのAuto Configuration / JJUG Night Seminar 2026-10-19
rshindo
0
190
パズルゲームの作り方 / how to make puzzle games
kaityo256
PRO
2
300
Optunaを作ったときにやりたかったこと、その後 (2026/10/16, Optuna Meetup #3)
iwiwi
2
670
[JA] Domain Modeling with Vanilla Rails: 「操作」から再考するRailsの設計論
yasaichi
3
450
複雑なUIコンポーネントとの ⻑い付き合い⽅:波及するバグからテスト戦略を経て、安全な再設計へ
mixplace
0
430
S3 TablesのIcebergデータに、AIエージェントからアクセスしてみた / 20261016developersio2026joetsu-accessing-iceberg-in-s3tables-via-agent
kasacchiful
PRO
0
170
Featured
See All Featured
What the history of the web can teach us about the future of AI
inesmontani
PRO
2
740
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
18k
Impact Scores and Hybrid Strategies: The future of link building
tamaranovitovic
0
460
Digital Projects Gone Horribly Wrong (And the UX Pros Who Still Save the Day) - Dean Schuster
uxyall
1
3.4k
Documentation Writing (for coders)
carmenintech
77
5.6k
Sam Torres - BigQuery for SEOs
techseoconnect
PRO
0
580
Design in an AI World
tapps
1
350
SEOcharity - Dark patterns in SEO and UX: How to avoid them and build a more ethical web
sarafernandez
0
300
Imperfection Machines: The Place of Print at Facebook
scottboms
270
14k
The Cult of Friendly URLs
andyhume
79
7k
SEO Brein meetup: CTRL+C is not how to scale international SEO
lindahogenes
2
2.9k
Lessons Learnt from Crawling 1000+ Websites
charlesmeaden
PRO
1
1.6k
Transcript
XSLTで作るBrainfuck処理系 XSLTは関数型言語たり得るか?
自己紹介 • 牧内大輔(MakKi) ◦ @makki_d ◦ makiuchi-d • KLab株式会社 ◦
スマホゲーム、主にサーバサイドや同期通信まわり • OSS ◦ gozxing: バーコードQRコード ◦ arelo: 自動リロード ◦ EMLauncher: スマホデバッグアプリ配信 ◦ WSNet2: 同期通信 • Go言語界隈によく出没
XSLT
• EXtensible Stylesheet Language Transformation • XMLをXMLや他の形式に変換するスタイルシート 言語 ◦ XSL自身もXMLで記述する
XSLTとは XML </> HTML < > TXT Aa XML </> XSLT XSL </>
<?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="html"/> <xsl:template match="/">
<html> <body> <h1>Library Books</h1> <ul> <xsl:apply-templates select="library/book"/> </ul> </body> </html> </xsl:template> <xsl:template match="book"> <li> <strong> <xsl:value-of select="title"/> </strong> by <xsl:value-of select="author"/> </li> </xsl:template> </xsl:stylesheet> convert.xsl <?xml version="1.0" encoding="utf-8"?> <library> <book> <title>Learning XSLT</title> <author>John Doe</author> </book> <book> <title>XML in Action</title> <author>Jane Smith</author> </book> </library> input.xml <html> <body> <h1>Library Books</h1> <ul> <li> <strong>Learning XSLT</strong> by John Doe </li> <li> <strong>XML in Action</strong> by Jane Smith </li> </ul> </body> </html> output.html
XSLTの特徴 • 宣言的なテンプレート <xsl:template> • テンプレートの再帰呼び出し による繰り返し処理 • パターンマッチング でテンプレートを自動選択
• 変数 <xsl:variable> が不変(再代入不可) すごく関数型言語ぽい!
XSLTは関数型言語か? • そもそもプログラミング言語 と言えるのか? ◦ プログラミング言語であるからにはチューリング完全が求められる • プログラミング言語ならばチューリング完全 であるべき ◦
計算可能なアルゴリズムは全てチューリングマシン上の計算に書き換えられる ▪ チューリングマシンはあらゆる計算可能な計算が可能 ◦ チューリングマシンと同等の能力を持つことを「チューリング完全」と呼ぶ ▪ チューリング完全ならあらゆる計算可能な計算が可能 • チューリング完全な 処理系を実装できればチューリング完全
Brainfuckを実装してみた
Brainfuckとは • 記号のみで記述 • 8つの命令しかない言語 • メモリ配列 とポインタを持つ • もちろんチューリング完全
実装が簡単! +++++++++[>++++++++>+++++++++ ++>+++++<<<-]>.>++.+++++++..+ ++.>-.------------.<++++++++. --------.+++.------.--------. >+. hello.bf
BrainfuckをXMLで表現 • 各命令をタグで表現 ◦ 記号と1:1対応 • XSLTプロセッサがパースしてくれる ◦ [と ]の対応が親子関係でわかる
• 標準入力も含めることに <?xml version="1.0" encoding="utf-8"?> <?xml-stylesheet type="text/xsl" href="bf.xsl"?> <bf> <code> <inc/><inc/> <loop> <dec/><right/><read/><inc/><print/><left/> <end/> </loop> </code> <input>Aa</input> </bf> atob.xml “Aa”を”Bb”にするプログラム: ++[->,+.]
ポインタのインクリメント( >) • 状態を引数でまるごと伝搬 ◦ ptr: ポインタ ◦ mem: メモリ配列
◦ input: 標準入力文字列 • <right/>のテンプレート ◦ 次の命令のテンプレート呼び出し ◦ 直後の兄弟要素 ▪ following-sibling::*[1] ◦ 引数のptrを+1 <xsl:template match="right"> <xsl:param name="ptr"/> <xsl:param name="mem"/> <xsl:param name="input"/> <xsl:apply-templates select="following-sibling::*[1]"> <xsl:with-param name="ptr" select="$ptr + 1"/> <xsl:with-param name="mem" select="$mem"/> <xsl:with-param name="input" select="$input"/> </xsl:apply-templates> </xsl:template>
メモリの実装 • メモリ配列の表現 ◦ 連番のXML要素 ▪ key = '_'+ptrの値 •
読み出し ◦ 名前が$keyな要素の値 ▪ sumで存在しないとき0に • 書き込み ◦ write-valテンプレート ◦ $key以外の要素のコピー ◦ $keyの要素を追加 ▪ 値を$valに <_0>65</_0> <_1>66</_1> <_2>67</_2> <_3>68</_3> sum(exsl:node-set($mem)/*[name()=$key]) <xsl:template name="write-val"> <xsl:param name="mem"/> <xsl:param name="key"/> <xsl:param name="val"/> <xsl:for-each select="exsl:node-set($mem)/*[name()!=$key]"> <xsl:copy-of select="."/> </xsl:for-each> <xsl:element name="{$key}"> <xsl:value-of select="$val"/> </xsl:element> </xsl:template>
値のインクリメント( +) • ポインタが指すメモリの現在の値 ◦ 取り出すための key('_' + ptr) ◦
値 val • write-val テンプレート ◦ メモリの"$key"に"$val+1" を書く ◦ まるごと作り直して次の命令に渡す <xsl:template match="inc"> <!-- param 省略 --> <xsl:variable name="key" select="concat('_', $ptr)"/> <xsl:variable name="val" select="sum(exsl:node-set($mem)/*[name()=$key])"/> <xsl:variable name="mem"> <xsl:call-template name="write-val"> <xsl:with-param name="mem" select="$mem"/> <xsl:with-param name="key" select="$key"/> <xsl:with-param name="val" select="$val + 1"/> </xsl:call-template> </xsl:variable> <!-- apply-templates 省略 -->
ループ([ ]) • <xsl:choose>で分岐 ◦ 非0のとき:子要素の先頭 ▪ "*[1]" ◦ 0のとき:直後の兄弟要素
▪ "following-sibling::*[1]" • ループ終端 <end/> ◦ 親要素でapply-template ▪ "parent::node()" <!-- いろいろ省略 --> <xsl:choose> <xsl:when test="$val != 0"> <xsl:apply-templates select="*[1]"> <xsl:with-param name="ptr" select="$ptr"/> <xsl:with-param name="mem" select="$mem"/> <xsl:with-param name="input" select="$input"/> </xsl:apply-templates> </xsl:when> <xsl:otherwise> <xsl:apply-templates select="following-sibling::*[1]"> <xsl:with-param name="ptr" select="$ptr"/> <xsl:with-param name="mem" select="$mem"/> <xsl:with-param name="input" select="$input"/> </xsl:apply-templates> </xsl:otherwise> </xsl:choose>
実装できた! • https://github.com/makiuchi-d/bfxslt • 解説記事 KLabTechBook Vol. 14 ◦ 技術書典18にて頒布中
▪ 物理本500円(在庫残り1冊) ▪ 電子版0円 ◦ ブログでも読めます 新刊もあります
XSLTは プログラミング言語 である
関数型言語たり得るか?
関数型言語であるためには • 関数が一級オブジェクト ◦ 関数を変数に拘束できたり演算できたり • XSLTのテンプレートは一級オブジェクトではない ◦ テンプレート自体を変数や引数に拘束できない ◦
動的生成もできない ▪ XSL自体もXMLなのでXSLからXSLを生成するXSLTを多段で呼べばあるいは ……
XSLTは 関数型言語ぽい プログラミング言語である
つづく? 実はXSLT2.0でtemplateとは別にfunctionが導入され XSLT3.0でfunctionが一級オブジェクトになったのは また別のお話……