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
Lisp -> Wasmコンパイラ を作りたかった人の話
Search
Endered
May 14, 2023
Programming
180
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Lisp -> Wasmコンパイラ を作りたかった人の話
LispからWasmへのコンパイラを作りたかった…!
Endered
May 14, 2023
Other Decks in Programming
See All in Programming
設計次第でAIコードの読む量は減らせる / designing-for-code-reading
minodriven
35
17k
Everything will be SERVERLESS — 信じて運用した10年の経験値 / Everything Will be Serverless — Lessons Learned from 10 Years of Operational Experience
seike460
PRO
1
1.1k
見えないものを探る要求要件定義に必要な基本的思考 / invisible-requirement-thinking
minodriven
15
8.5k
Simple Storage Service(S3) is not simple
iwatsukayura
0
290
UnityでSystem.Net.WebSocketsなWebSocketサーバが動かないのでUnity Monoのコードを覗いてみた / about implementing websocket server with unity mono
drumath2237
1
610
ChromeでローカルLLM
ryu1013
0
140
golang-bob.pdf
iwatsukayura
0
130
Verilogで学ぶCPU自作入門
uyuki234
8
4.1k
Apple Intelligence を用いた個人情報誤送信防止、及びユーザーリクエスト体験の改善について
yukiny
0
350
Event is what happens
moro
2
770
UPDATE をやめる — EF Core でマスタをバージョン管理する
panda728
PRO
0
1.2k
JIS keyboard support in Omarchy
lef237
0
110
Featured
See All Featured
Accessibility Awareness
sabderemane
1
250
Building Flexible Design Systems
yeseniaperezcruz
330
41k
Organizational Design Perspectives: An Ontology of Organizational Design Elements
kimpetersen
PRO
1
850
Neural Spatial Audio Processing for Sound Field Analysis and Control
skoyamalab
0
570
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
21
1.7k
GraphQLとの向き合い方2022年版
quramy
50
15k
KATA
mclloyd
PRO
35
16k
AI: The stuff that nobody shows you
jnunemaker
PRO
10
1.2k
How to Align SEO within the Product Triangle To Get Buy-In & Support - #RIMC
aleyda
2
1.8k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
31
3.4k
Context Engineering - Making Every Token Count
addyosmani
9
1.2k
Measuring & Analyzing Core Web Vitals
bluesmoon
9
1k
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に完成は間に合いませんでしたが開発は続けます - 早く完成させてトランスパイラを作り直したい - コンパイラを作るのが思ってたよりも楽しい作業だった - トランスパイラを作る上で大切なことを沢山知れた - 自作ソフトウェアを自作コンパイラで作りたい!!!!!!!!!!!!!
完