Upgrade to PRO for Only $50/Year—Limited-Time Offer! 🔥
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Lisp -> Wasmコンパイラ を作りたかった人の話
Search
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
Combinatorial Interview Problems with Backtracking Solutions - From Imperative Procedural Programming to Declarative Functional Programming - Part 2
philipschwarz
PRO
0
110
안드로이드 9년차 개발자, 프론트엔드 주니어로 커리어 리셋하기
maryang
1
140
[AtCoder Conference 2025] LLMを使った業務AHCの上⼿な解き⽅
terryu16
6
740
The Past, Present, and Future of Enterprise Java
ivargrimstad
0
350
Rubyで鍛える仕組み化プロヂュース力
muryoimpl
0
160
生成AI時代を勝ち抜くエンジニア組織マネジメント
coconala_engineer
0
12k
クラウドに依存しないS3を使った開発術
simesaba80
0
170
Giselleで作るAI QAアシスタント 〜 Pull Requestレビューに継続的QAを
codenote
0
300
LLMで複雑な検索条件アセットから脱却する!! 生成的検索インタフェースの設計論
po3rin
4
970
大規模Cloud Native環境におけるFalcoの運用
owlinux1000
0
200
GISエンジニアから見たLINKSデータ
nokonoko1203
0
180
AI前提で考えるiOSアプリのモダナイズ設計
yuukiw00w
0
190
Featured
See All Featured
The #1 spot is gone: here's how to win anyway
tamaranovitovic
1
870
Git: the NoSQL Database
bkeepers
PRO
432
66k
Navigating the moral maze — ethical principles for Al-driven product design
skipperchong
1
210
Highjacked: Video Game Concept Design
rkendrick25
PRO
0
250
What the history of the web can teach us about the future of AI
inesmontani
PRO
0
370
How People are Using Generative and Agentic AI to Supercharge Their Products, Projects, Services and Value Streams Today
helenjbeal
1
81
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
254
22k
Reflections from 52 weeks, 52 projects
jeffersonlam
355
21k
Prompt Engineering for Job Search
mfonobong
0
130
How to Talk to Developers About Accessibility
jct
1
85
How to build a perfect <img>
jonoalderson
0
4.7k
Un-Boring Meetings
codingconduct
0
160
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に完成は間に合いませんでしたが開発は続けます - 早く完成させてトランスパイラを作り直したい - コンパイラを作るのが思ってたよりも楽しい作業だった - トランスパイラを作る上で大切なことを沢山知れた - 自作ソフトウェアを自作コンパイラで作りたい!!!!!!!!!!!!!
完