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
Endered
May 14, 2023
Programming
0
160
Lisp -> Wasmコンパイラ を作りたかった人の話
LispからWasmへのコンパイラを作りたかった…!
Endered
May 14, 2023
Tweet
Share
Other Decks in Programming
See All in Programming
1BRC--Nerd Sniping the Java Community
gunnarmorling
0
340
educure_カリキュラム生操作マニュアル.pdf
linew_official
0
810
大規模Reactアプリのリアーキテクチャ~8万行のTanStack Query移行の軌跡~
kj455
4
960
Scalable Customer Journey Orchestration (CJO)
lewuathe
0
330
Site Reliability Engineering for GMO
pyama86
8
1k
冗長なエラーログを削減し、スタックトレースを手に入れる / Reducing Verbose Error Logs and Obtaining Stack Traces
upamune
0
770
Amazon SQSコンシューマー疎結合への旅 - 出張! #DevelopersIO IT技術ブログの中の人が語る勉強会 #3
quiver
0
270
Ruby Function Composition
bkuhlmann
1
330
Java 22 Overview
kishida
1
180
『Railsオワコン』と言われる時代に、なぜブルーモ証券はRailsを選ぶのか
free_world21
0
250
2 週間で Twitter Bot を作ってみた
contour_gara
0
510
What We Can Learn From OSS
inouehi
0
420
Featured
See All Featured
Building Your Own Lightsaber
phodgson
99
5.7k
Making Projects Easy
brettharned
108
5.5k
StorybookのUI Testing Handbookを読んだ
zakiyama
13
4.6k
Six Lessons from altMBA
skipperchong
21
3k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
116
18k
Fontdeck: Realign not Redesign
paulrobertlloyd
76
4.9k
Adopting Sorbet at Scale
ufuk
68
8.6k
Large-scale JavaScript Application Architecture
addyosmani
504
110k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
78
43k
Fashionably flexible responsive web design (full day workshop)
malarkey
398
65k
Designing for humans not robots
tammielis
248
25k
Faster Mobile Websites
deanohume
299
30k
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に完成は間に合いませんでしたが開発は続けます - 早く完成させてトランスパイラを作り直したい - コンパイラを作るのが思ってたよりも楽しい作業だった - トランスパイラを作る上で大切なことを沢山知れた - 自作ソフトウェアを自作コンパイラで作りたい!!!!!!!!!!!!!
完