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
Lisp -> Wasmコンパイラ を作りたかった人の話
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
Endered
May 14, 2023
Programming
0
180
Lisp -> Wasmコンパイラ を作りたかった人の話
LispからWasmへのコンパイラを作りたかった…!
Endered
May 14, 2023
Tweet
Share
Other Decks in Programming
See All in Programming
【卒業研究】会話ログ分析によるユーザーごとの関心に応じた話題提案手法
momok47
0
200
CSC307 Lecture 01
javiergs
PRO
0
690
CSC307 Lecture 04
javiergs
PRO
0
660
Fluid Templating in TYPO3 14
s2b
0
130
React 19でつくる「気持ちいいUI」- 楽観的UIのすすめ
himorishige
11
7.5k
QAフローを最適化し、品質水準を満たしながらリリースまでの期間を最短化する #RSGT2026
shibayu36
2
4.4k
今から始めるClaude Code超入門
448jp
8
9.1k
Raku Raku Notion 20260128
hareyakayuruyaka
0
360
要求定義・仕様記述・設計・検証の手引き - 理論から学ぶ明確で統一された成果物定義
orgachem
PRO
1
220
フロントエンド開発の勘所 -複数事業を経験して見えた判断軸の違い-
heimusu
7
2.8k
登壇資料を作る時に意識していること #登壇資料_findy
konifar
4
1.6k
AI巻き込み型コードレビューのススメ
nealle
2
1.3k
Featured
See All Featured
Scaling GitHub
holman
464
140k
The SEO identity crisis: Don't let AI make you average
varn
0
330
Sam Torres - BigQuery for SEOs
techseoconnect
PRO
0
190
brightonSEO & MeasureFest 2025 - Christian Goodrich - Winning strategies for Black Friday CRO & PPC
cargoodrich
3
110
Building a Scalable Design System with Sketch
lauravandoore
463
34k
A brief & incomplete history of UX Design for the World Wide Web: 1989–2019
jct
1
300
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
52
5.8k
How to make the Groovebox
asonas
2
1.9k
<Decoding/> the Language of Devs - We Love SEO 2024
nikkihalliwell
1
130
Marketing Yourself as an Engineer | Alaka | Gurzu
gurzu
0
130
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
333
22k
Conquering PDFs: document understanding beyond plain text
inesmontani
PRO
4
2.3k
Transcript
Lisp -> Wasmコンパイラ を作りたかった人の話 Endered
自己紹介 名前: Endered 使用OS: NixOS メインで使う言語: Lisp / Scala 競技プログラミングを少しだけしている
[備考] 静的型付け関数型言語が好きです
普段していること - LispからJSやLuaへのトランスパイラを書いたり - Lispでバックエンドを書くのに欲しいライブラリを書いたり - LispでLaTeXを書くためのフレームワークを作ったり - etc… と、Lispでこの世の全てができたら嬉しいなと模索しています
Lispってどんな言語? 特徴 - 全てが前置記法 - 中置記法が無い - マクロで言語拡張ができる - 記号を名前に使える!
- 定数を+で囲う(ex. +pi+, +max-connections+) - グローバル変数を*で囲う(ex. *db*, *error-logs*) - boolを返す関数の末尾が?(ex. prime?, even?) - 副作用がある関数の末尾が! (ex. push!, swap!)
普段していること - LispからJSやLuaへのトランスパイラを書いたり ◁ 今日はここあたりの話 - Lispでバックエンドを書くのに欲しいライブラリを書いたり - LispでLaTeXを書くためのフレームワークを作ったり -
etc… と、Lispでこの世の全てができたら嬉しいなと模索しています
あるLuaを書く日のこと Luaにトランスパイルしたコードが謎のメッセージを出して動かない?
None
そんなことはない
そんなことはない 構文のネスト深すぎw 死にますw
生成されたソースコード
自分が使う言語が特殊すぎた… Lispだとソースコードを自動生成する都合上、 ネストが1000超えることがたまにあるので、 まさかネストが深いだけでLuaが死ぬとは思わなかった(反省はしている)
自分が使う言語が特殊すぎた… Lispだとソースコードを自動生成する都合上、 ネストが1000超えることがたまにあるので、 まさかネストが深いだけでLuaが死ぬとは思わなかった(反省はしている) 教訓 - ネストが200を超えるプログラムは書くべきではない
どうすればよいか? トランスパイラの出力するコードのネストを浅くしたい ⇓ もっと原始的な命令にトランスパイルすればネストが浅くなるのでは? ⇓ 💡コンパイラを作って、コンパイル結果を高級言語に変換すればよいのでは? - asm.jsが取っていた戦略(ブラウザでC言語を動かすためのOSS) ここでWASMコンパイラを作ることが決定
WASMへコンパイルしようとした理由
WASMへコンパイルしようとした理由 A. 人気だったから ちゃんと他にも理由はありますが、話すと長くなります
コンパイラの構成 主に3つのレイヤで構成 - K正規化層 - プログラムをできるだけ単純な形に変換するぞ! - クロージャ変換層 - 関数が「環境」を参照できるようにするぞ!
- コード生成層 - WASMの命令列に変換するぞ!
K正規化層 正規化とは - プログラムを実行順序の曖昧性が無い形に変換する操作
正規化の例
K正規化層 正規化とは - プログラムを実行順序の曖昧性が無い形に変換する操作 - 見た目が高級言語なアセンブリ言語に変換していると思えば良いです
クロージャ変換層 クロージャ変換 is? - A. 関数の引数に渡していない値を参照するための仕組み
クロージャ変換が必要なコードの例
クロージャ変換層 クロージャ変換 is? - A. 関数の引数に渡していない値を参照するための仕組み どうやって実装するの? - A. 関数を(関数への参照,
関数の環境)の組で表現する
クロージャ変換したソースコード
クロージャ変換層 クロージャ変換 is? - A. 関数の引数に渡していない値を参照するための仕組み どうやって実装するの? - A. 関数を(関数への参照,
関数の環境)の組で表現する つまり - クロージャ変換を使えば、 関数型言語の関数を単純な手続きだけで表現できる
コード生成層 自明! Q.E.D
デモンストレーションしたかった…!!! 完成したものをお披露目したかったのですが、実は完成しませんでした。 - K正規化層: 完成 - クロージャ変換層: 完成 - コード生成層:
未完成 完成できなくて悔しい(´・ω・`)
完成しなかった理由 初めて作るコンパイラをLispにしようとするのは難しいですね Lispの言語仕様はコンパイラが作りづらい - 動的型付け言語 - 型周りの設計でかなり時間を取られる - 関数型言語 -
VMコンパイラは作りやすいが、ネイティブコンパイルは難しい - 可変長引数関数が言語の主体 - これが存在するだけで、設計がすごく難しくなりました
俺達の戦いはこれからだ! LTに完成は間に合いませんでしたが開発は続けます - 早く完成させてトランスパイラを作り直したい - コンパイラを作るのが思ってたよりも楽しい作業だった - トランスパイラを作る上で大切なことを沢山知れた - 自作ソフトウェアを自作コンパイラで作りたい!!!!!!!!!!!!!
完