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
自作言語をrustでwasmにコンパイルする
Search
karamaru
February 01, 2023
0
90
自作言語をrustでwasmにコンパイルする
自作言語をparseして、wasmの四則演算と関数exportにマッピングするまでを行いました。
karamaru
February 01, 2023
Tweet
Share
More Decks by karamaru
See All by karamaru
自動生成の話をしよう 〜 ProtoBuf, Cue, 1次ソースの美学 〜
karamaru
3
460
unique パッケージから学ぶ interning と weak reference @ Asakusa.go#3
karamaru
3
1.3k
ぼくのかんがえたさいきょうのもっくらいぶらり! @ GoConnect#1
karamaru
0
100
詳解 "Fixing For Loops in Go 1.22" 自作linterをgolangci-lintへコントリビュートした話 @ GoConference2024
karamaru
0
57
zsh*単一デスクトップ環境最速を目指して
karamaru
0
380
対isuconメトリクスツール isumaru作った
karamaru
0
97
Featured
See All Featured
Why Our Code Smells
bkeepers
PRO
336
57k
Testing 201, or: Great Expectations
jmmastey
42
7.4k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
29
2k
It's Worth the Effort
3n
184
28k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
507
140k
Facilitating Awesome Meetings
lara
53
6.3k
Unsuck your backbone
ammeep
670
57k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
8
700
4 Signs Your Business is Dying
shpigford
183
22k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
248
1.3M
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
PRO
17
1.1k
Bash Introduction
62gerente
611
210k
Transcript
ࣗ࡞ݴޠΛ wasmʹίϯύΠϧ͢Δ karamaru
݁ Rustͷࣗ࡞ݴޠΛࣗྗͰwasmόΠφϦʹมͯ͠ ϒϥβͰ࣮ߦͯ͠ΈͨΑʂ (࢛ଇԋࢉͱؔexportͷΈ)
͜Μͳײ͡ ࣗ࡞ݴޠ wasmόΠτίʔυ ϒϥβͰ࣮ߦ ͜͜Λ࡞Δ!
ɾWebAssembly֓ཁ ɾHello! Wasm! ɾast·Ͱ࡞Δ ɾࣈ۟ղੳ ɾߏจղੳ ɾwasmมΛ࡞Δ ɹɾόΠφϦ༷ࣜ ࣍
Wasm֓ཁ ɾϒϥβͰಈ͘όΠτίʔυ ɾjsҎ֎ͷߴͳݴޠͰॲཧΛ࣮ߦͤ͞Δ͜ͱ͕తͩͬͨ -> લasm.jsɻjsαϒηοτͱͯ͠ಈ࡞ͯ͠AOTίϯύΠϧ͕ߦΘΕΔɻ ɾԾతͳϋʔυΣΞͰಈ͘ਫ४ͳ໋ྩͷू·Γͱͯ͠ϞδϡʔϧΛఆٛͰ͖Δ -> runtimeଆͰ໌ࣔతʹڐՄ͞Εͨͷ͚࣮ͩߦՄೳ (sandbox) ɾݴޠෆͰίϯύΠϧͰ͖Δ
ɾ͜ͷنΛԠ༻ͯ͠ϒϥβ֎Ͱ࣮ߦ͠Α͏ͱ͢Δಈ͖࠷ۙଟ͍Ͱ͢ΑͶ
ࣗ࡞ݴޠͱwasm ࣗ࡞ݴޠ͔ΒwasmΛు͚ΔΑ͏ʹͳΕ ଞͷݴޠͷruntimeʹཔΒͣಈ͔͢͜ͱ͕Ͱ͖Δʂ LLVM IRมͰྑ͍͚Ͳwasmు͖͍ͨʂ
Πϝʔδ Chorome console ಠࣗݴޠ(text)͔Β ͜ΕܥͷόΠτίʔυΛు͚Ε͍͍
͜Μͳײ͡ͰਐΊ·͢ 1. ࣗ࡞ݴޠͷίʔυ४උ 2. τʔΫϯԽ lexser 3. ߏจղੳ parser 4.
wasmԽ emitter
ࣗ࡞ݴޠͷίʔυ ܕͳ͠ͷؔͬΆ͍ͭʂ ͜ΕΛwasmԽͯ͠ ϒϥβͰ࣮ߦ͢Δ·ͰؤுΔ🔥
ࣈ۟ղੳ Lexser ·ͣࣈ۟ղੳʂ ϓϩάϥϜΛτʔΫφΠζͯ͠ɺ ಠࣗݴޠΛಡΈਐΊΔࡍͷ࠷খ୯Ґ(τʔΫϯ)ͷࣝผ͢Δɻ fn … ؔએݴ add …
ࣝผࢠ ( … ࠨׅހ a … ࣝผࢠ , … ΧϯϚ ͱ͔ɺ ه߸,ࣝผࢠͳͲͷίʔυͷ࠷খ୯ҐΛཧղ͠·͢
ࣈ۟ղੳ ࣮ جຊ1จࣈͣͭ ύλʔϯϚονͰผ enumʹΛ࣋ͨͤΒΕΔ
ࣈ۟ղੳث ʂ ࣮ࡍߏจղੳͰιʔείʔυΛಡΈਐΊΔࡍʹ ࣈ۟ղੳ͢ΔΜ͚ͩͲݟ͢͞తʹશ෦ग़ͯ͠Δ τʔΫϯԽʹޭ͠·ͨ͠Ͷ
ߏจղੳ ࣍ߏจղੳʂ ࿈ଓ͢ΔτʔΫϯྻ͔Βҙຯͷ͋Δ·ͱ·Γ(ߏจ)Λࣝผ͢Δɻ Lexser ͜ͷτʔΫϯྻ… ɾࣝผࢠʮaddʯͰఆٛ͞ΕΔؔఆٛͩʂ ɾࣝผࢠʮaʯͱʮbʯͰఆٛ͞ΕΔҾ͕͋Δʂ ɾ෦Ͱʮa + b
* 2ʯΛߦͳ͍ͬͯΔʂ తͳ
ߏจղੳ ܕఆٛ ϓϩάϥϜจ(statement)ͷू߹ମ ܕؔΛࣜ(expression)ͱͯ͠ѻ͏ If/for/letͱ͔࣮ͯ͠ͳ͍ͷͰจࣜͷΈ
ߏจղੳ ࣮ Expression::Infix( Infix::Plus, Expression::Integer(1), Expression::Integer(2), ) ྫ͑ʮɹ1 + 2ɹʯͩͬͨΒ
precedence: ༏ઌॱҐ
ߏจղੳث AST͕Ͱ͖·ͨ͠Ͷ ֻ͚ࢉΛઌʹͬͯΔͷ͑Β͍ʂ
͜Ε͔Β͍ͨ͜͠ͱ wasmόΠτίʔυ ͜͜Λ࡞Δʂ WasmόΠφϦܗࣜΛݟΔඞཁ͕͋Δ Emitter
WasmόΠφϦΛͭͬͯ͘ΈΑ͏ʂ όΠφϦܗࣜΛֶͿͨΊʹaddؔͷwasmΛͭ͘Δʂ ɾwasmςΩετܗࣜ(Sࣜ)Ͱهड़Ͱ͖Δ = wat ɾwat2wasmΛ༻͍ͯมͰ͖Δ wasmελοΫϚγϯͳΜͩͶʂ
WasmόΠφϦΛݟͯΈΑ͏ʂ ɾγϯϓϧͳ͠ࢉؔͷexport41byteͰදݱͰ͖Δʂ ɾಠࣗݴޠͷιʔείʔυ(ast)͔Β͜ΕΛग़ͤΕউͪ AddؔͷwasmΛݩʹɺܗࣜΛਅࣅ͍ͯ͜͏ʂ
WasmͷηΫγϣϯ: ϓϦΞϯϒϧ ɾ4όΠτͷϚδοΫφϯόʔʢasmͷASCIIίʔυʣɻwasmϞδϡʔϧͩͱೝࣝͤ͞Δɻ ɾ4όΠτόʔδϣϯ൪߸ (ݱࡏ1) https://webassembly.github.io/spec/core/binary/modules.html#binary-magic
WasmͷηΫγϣϯ: ϓϦΞϯϒϧ ࣮ ɾ8όΠτ٧ΊΔ͚ͩ ɾ͜Ε͔ΒemitؔͰast͔ΒbytecodeมΛߦ͏
WasmͷηΫγϣϯ: Type moduleͰ༻͞ΕΔؔͷγάωνϟΛએݴ͢Δ https://webassembly.github.io/spec/core/binary/types.html http://webassembly.github.io/spec/core/binary/types.html#function-types https://webassembly.github.io/spec/core/binary/modules.html#type-section 01: ηΫγϣϯ൪߸ 07: ηΫγϣϯbodyͷbyte
01: ؔͷγάωνϟͷݸ 60 02 7f 7f 01 7f: fn (i32, i32) -> i32
WasmͷηΫγϣϯ: Type ࣮ ϓϩάϥϜ͔ΒؔΛ୳ͯ͠ γάωνϟຖʹu8ͷvectorΛ࡞͢Δ
WasmͷηΫγϣϯ: Function ɾWasmϞδϡʔϧͰ༻͞ΕΔ֤ؔͷએݴ ɾؔͱγάωνϟΛඥ͚ͮΔ 03: ηΫγϣϯ൪߸ 02: ηΫγϣϯbodyͷbyte 01: ؔͷ૯
00: index0ͷؔɺindex0ͷγάωνϟʹରԠ͢Δ https://webassembly.github.io/spec/core/binary/modules.html#function-section
WasmͷηΫγϣϯ: Function ࣮ ؔͱ TypeηΫγϣϯͰొͨ͠γάωνϟͷ IndexΛඥ͚ͮΔ
WasmͷηΫγϣϯ: Export ϗετڥʹఏڙ͢ΔશͯͷΦϒδΣΫτͷએݴ 07: ηΫγϣϯ൪߸ 07: ηΫγϣϯbodyͷbyte 01: export͢Δݸ 03:
ࣝผࢠͷbyte 61 64 64: ࣝผ໊add 00: exportछผ(ؔ) 00: exportͷindex http://webassembly.github.io/spec/core/binary/modules.html#export-section
WasmͷηΫγϣϯ: Export ࣮ Export͢Δؔͷ໊લใ ͱindexΛ٧ΊΔʂ
WasmͷηΫγϣϯ: Code ؔͷ༰Λఆٛ͢Δ (ͬͱຊײ) 0a: ηΫγϣϯ൪߸ 09: ηΫγϣϯbodyͷbyte 01: ؔͷݸ
07: ؔ(index:0)ͷbyte 00: ؔͷมએݴ 20: GetLocal 00: Ҿ1൪ 20: GetLocal 01: Ҿ2൪ 6a: plus 0b: end https://webassembly.github.io/spec/core/binary/modules.html#binary-codesec https://webassembly.github.io/spec/core/binary/instructions.html
WasmͷηΫγϣϯ: Code ࣮ ΘͪΌΘͪΌ
WasmͷηΫγϣϯ: Code ݁Ռʂ ଞʹsection͋Δ͚Ͳɺࠓճ͜ΕͰे
WasmόΠφϦͰ͖ͨʂ ࠓ·ͰͷsectionΛܨ͗߹Θͤͯ… ʂ
݁Ռ: ಠࣗιʔεͷ༻ҙͱίϯύΠϧ ؔͷ༰Λఆٛ͢Δ
݁Ռ: wasmಡΈࠐΈ&ϒϥβͰ࣮ߦ python3 -m http.server Index.html ॕʂʂ🎉
·ͱΊ ɾࣗ࡞ݴޠ͕ಈ͘ͷͨͷ͍͠ ɾWasiରԠͱ͔͍ͨ͠ ɾࠓޙ͍͖͍ٕͬͯͨज़
ࢀߟจݙ wasm-compiler-in-rust https://github.com/karamaru-alpha/wasm-compiler-in-rust WebAssembly binary format. https://webassembly.github.io/spec/core/binary/ ϋϯζΦϯWebAssembly https://www.oreilly.co.jp/books/9784814400102/ WebAssemblyͷྺ࢙ʹ͍ͭͯ
https://zenn.dev/hodagi/articles/4925afbeb3c4dc#fn-9e18-10 Linuxίϯςφͷ࣍ͱͯ͠ͷWebAssembly https://zenn.dev/koduki/articles/9f86d03cd703c4
fin.