Slide 1

Slide 1 text

SwiftͷWebAssemblyରԠͷي੻ iOSDC 2020 @kateinoigakukun 1

Slide 2

Slide 2 text

ࣗݾ঺հ @kateinoigakukun • Intern at Merpay Expert Team • Love Swift ! 2

Slide 3

Slide 3 text

What is WebAssembly? WebAssembly (Wasm) ͱ͸ελοΫϕʔεͷԾ૝Ϛγϯ্Ͱಈ ໋͘ྩηοτͷҰͭͰ͢ɻWebAssembly͸C΍C++΍RustͳͲ ͔Βϙʔλϒϧͳλʔήοτͱͯ͠ίϯύΠϧ͞ΕΔΑ͏ʹઃ ܭ͞Ε͓ͯΓɺΫϥΠΞϯταΠυɺαʔόʔαΠυͷΞϓϦ έʔγϣϯΛಈ͔͢͜ͱ͕Ͱ͖·͢ɻ1. 1 https://webassembly.org/ 3

Slide 4

Slide 4 text

https://hacks.mozilla.org/2019/03/standardizing-wasi-a-webassembly-system-interface/ 4

Slide 5

Slide 5 text

https://hacks.mozilla.org/2019/03/standardizing-wasi-a-webassembly-system-interface/ 5

Slide 6

Slide 6 text

Swift x WebAssembly? 6

Slide 7

Slide 7 text

Swift ͕WebAssemblyʹରԠ͢Δͱخ͍͜͠ͱ • ΞϓϦΛॻ͖΍͍͢SwiftͰWebϑϩϯτΤϯυ։ൃ͕Մೳʹ • Server Side Swift΍iOS, macOSͱίʔυڞ༗Ͱ͖Δ • Swift͕ରԠ͍ͯ͠ͳ͍؀ڥͰ΋WasmϥϯλΠϜ͑͋͞Ε͹ ಈ͘ 7

Slide 8

Slide 8 text

SwiftWasm Project https://swiftwasm.org SwiftͷWebAssemblyରԠΛਐΊΔϓϩδΣΫτ • ϝϯςφ: @zhuowei, @MaxDesiatov, @kateinoigakukun • swiftwasm/swift • swiftwasm/llvm-project • etc... 8

Slide 9

Slide 9 text

Demo https://swiftwasm-pad.netlify.app SwiftͷΦϯϥΠϯ࣮ߦ؀ڥ • ϒϥ΢β্ͰSwiftΛ࣮ߦ • ΠϯλϥΫςΟϒͳૢ࡞͕ Մೳ 9

Slide 10

Slide 10 text

https://swiftwasm-pad.netlify.app 10

Slide 11

Slide 11 text

SwiftWasmϓϩδΣΫτͷಓͷΓ 11

Slide 12

Slide 12 text

Compiler Pipeline http://llvm.org/devmtg/2016-10/slides/GroffLattner-SILHighLevelIR.pdf 12

Slide 13

Slide 13 text

LLVM for WebAssembly • SwiftWasmϓϩδΣΫτҎલ͔ΒWebAssemblyΛαϙʔτ • ʢجຊతʹʣίϯύΠϥ͸ग़ྗλʔήοτΛมߋ͢Δ͚ͩͰ WebAssemblyରԠՄೳ • Swiftݻ༗ͷݺͼग़͠ن໿͸Wasm্Ͱಈ͔ͳ͍ 13

Slide 14

Slide 14 text

Wasm্Ͱ্ख͘ಈ͘Swiftݺͼग़͠ن໿Λ੍ఆ https://reviews.llvm.org/D76049 14

Slide 15

Slide 15 text

Swift Compiler • ϥϯλΠϜϥΠϒϥϦ&ඪ४ϥΠϒϥϦͷWasmαϙʔτ • ඪ४ϥΠϒϥϦͷςετέʔε100% Pass 15

Slide 16

Slide 16 text

طଘίϯϙʔωϯτͷWasm ରԠ·ͱΊ ίϯϙʔωϯτ WebAssemblyରԠ LLVM Swift Compiler (WIP) SwiftPM Foundation 16

Slide 17

Slide 17 text

Swift for WebAssemblyͷΤίγεςϜ 17

Slide 18

Slide 18 text

swiftwasm/JavaScriptKit JavaScriptͱͷόΠϯσΟϯάϥΠϒϥϦ • JavaScript likeͳΦϒδΣ Ϋτૢ࡞APIΛఏڙ • JavaScriptͱSwiftͷGCͷ ࠩΛҰ෦ٵऩ import JavaScriptKit let alert = JSObject.global.alert.function! let document = JSObject.global.document.object! let div = document.createElement!("div").object! div.innerText = "Hello, world" let body = document.body.object! body.appendChild!(div) alert("Swift is running on browser!") 18

Slide 19

Slide 19 text

swiftwasm/carton ! SwiftWasm੡WebΞϓϦͷϏϧυπʔϧ • Zero-config • πʔϧνΣʔϯΠϯετʔϧͷࣗಈԽ • WebΞϓϦ։ൃ࣌ͷAuto reload 19

Slide 20

Slide 20 text

TokamakUI/Tokamak SwiftUIޓ׵ͷUIϥΠϒϥϦ • ΫϩεϓϥοτϑΥʔϜΛ લఏʹઃܭ • WebAssembly/DOMɺ Static HTMLΛαϙʔτ import TokamakDOM struct Counter: View { @State var count: Int = 0 var body: some View { VStack { Text("\(count)") HStack { Button("Reset") { count = 0 } Button("Increment") { count += 1 } } } } } 20

Slide 21

Slide 21 text

ݱঢ়ͷ՝୊ 21

Slide 22

Slide 22 text

όΠφϦαΠζ໰୊ ଞͷݴޠͱൺ΂Wasmʹͨ͠ͱ͖ͷαΠζ͕େ͖͍ e.g. Hello, World ͷόΠφϦαΠζ Language Size Swift 8.5 MB Go 2.4 MB Rust 70 KB 22

Slide 23

Slide 23 text

όΠφϦαΠζ໰୊ (ICU) • Swift͸Unicodeσʔλϕʔ ε΍ਖ਼نԽͷͨΊʹICUʹ ґଘ͍ͯ͠Δ • ICU͚ͩͰ4MBҎ্ let emoji: UnicodeScalar = " " emoji.properties.isEmoji // true // Pokémon let str1 = "Poke\u{0301}mon" // Pokémon let str2 = "Pok\u{00e9}mon" str1 == str2 // true ICU = International Components for Unicode 23

Slide 24

Slide 24 text

όΠφϦαΠζ໰୊ (ඪ४ϥΠϒϥϦ) • Swiftͷඪ४ϥΠϒϥϦ͸ඇৗʹେ͖͍ • ࢖ΘΕͳ͍ػೳ΋όΠφϦʹؚ·Εͯ͠·͏ 24

Slide 25

Slide 25 text

৽͍͠όΠφϦαΠζ࠷దԽ SwiftͷGoogle Summer of Code ϓϩδΣΫτͷҰͭ https://summerofcode.withgoogle.com/projects/#6691362033893376 25

Slide 26

Slide 26 text

৽͍͠όΠφϦαΠζ࠷దԽ ϞδϡʔϧΛލ͍Ͱ࢖ΘΕͳ͍ίʔυΛ࡟আ͢Δ͜ͱͰόΠφ ϦαΠζΛ࡟ݮ // LibX.swift public protocol P { func foo() func unusedMethod() } public struct S: P { public func foo() {} public func unusedMethod() {} } // main.swift import LibX func useP(_ value: T) { value.foo() } useP(S()) 26

Slide 27

Slide 27 text

৽͍͠όΠφϦαΠζ࠷దԽ ϞδϡʔϧΛލ͍Ͱ࢖ΘΕͳ͍ίʔυΛ࡟আ͢Δ͜ͱͰόΠφ ϦαΠζΛ࡟ݮ // LibX.swift public protocol P { func foo() func unusedMethod() } public struct S: P { public func foo() {} public func unusedMethod() {} } // main.swift import LibX func useP(_ value: T) { value.foo() } useP(S()) 26

Slide 28

Slide 28 text

৽͍͠όΠφϦαΠζ࠷దԽ • SILϨϕϧͰSwiftͷηϚϯςΟοΫΛ࢖ͬͯ࠷దԽ • LLVMϨϕϧΑΓੵۃతͳ࠷దԽ͕ߦ͑Δ 27

Slide 29

Slide 29 text

࠷దԽޙ Language Size Swift 8.5 MB Swift (Optimized) 3.5 MB Go 2.4 MB Rust 70 KB 28

Slide 30

Slide 30 text

ৄ͘͠஌Γ͍ͨํ޲͚ • kateinoigakukun/swift-lto-benchmark • Swift Forum: https://forums.swift.org/t/refactoring-plan-of- silvisitor-for-lto/37678/14 29

Slide 31

Slide 31 text

·ͱΊ • ࣮ݧஈ֊ͱͯ͠ར༻Մೳ • पลπʔϧ΍ϥΠϒϥϦͷରԠ΋ਐΜͰ͍Δ • όΠφϦαΠζ͸վળͷ༨஍͋Γ 30

Slide 32

Slide 32 text

ؔ࿈ϦϯΫ • kateinoigakukun/swiftwasm-pad • https://swiftwasm.github.io/swiftwasm-book/ 31