Slide 1

Slide 1 text

Go beyond the Actor Boundary 2023/3/22 Swift 6΁ͷConcurrencyରԠ @giginet

Slide 2

Slide 2 text

୭ʁ • @giginet • LINEגࣜձࣾ Developer Experience։ൃνʔϜ • ٕज़ސ໰ • ϚωʔϑΥϫʔυ, peep, ϢϏϨδ • OSSϝϯςφ • Carthage, XcodeGen, fastlaneͳͲ • ϙέϞϯϥϯΫϚον੎

Slide 3

Slide 3 text

ࠓ೔࿩͢͜ͱ • Swift Concurrencyʹ͍͓ͭͯ͞Β͍ • Race Conditions, Actor Boundary, Sendable • Swift 6.0࣌୅ʹ޲͚ͯԿΛ͢Ε͹ྑ͍͔ • ݱঢ়ઃఆͰ͖Δޓ׵Ϟʔυʹ͍ͭͯڍಈ΍ݱঢ়Λௐ΂ͨ

Slide 4

Slide 4 text

Swift 6 • Swift 6͔ΒRace ConditionsͷνΣοΫ͕ݫ֨Խ • εϨουηʔϑͰ͸ͳ͍ίʔυ͸ίϯύΠϧΤϥʔʹͳͬͯ͠·͏ • Sendableʹద߹͍ͯ͠ͳ͍ܕΛϓϩηεΛ௒͑ͯڞ༗ͯ͠͸͍͚ͳ ͍ʢActor boundaryʣ

Slide 5

Slide 5 text

Race conditions? • ෳ਺ͷϓϩηεʢॲཧʣ͕ڞ༗ϦιʔεʹΞΫηεͯ͠༧ظ͠ͳ͍ڍ ಈΛҾ͖ى͜͢͜ͱ value = 1 value = 2 value = 2? 💥 ϓϩηε1 ϓϩηε2 ڞ༗Ϧιʔε let value = Shared.value Shared.value = value + 1 let value = Shared.value // Do long task await doLongTask() Shared.value = value + 1

Slide 6

Slide 6 text

Sendable • Race ConditionsΛ๷͙ͨΊʹSendableͱ͍͏protocol͕ಋೖ • ෳ਺ͷϓϩηε͔Β஋Λڞ༗ͯ͠΋҆શͩͱ͍͏͜ͱΛࣔ͢ protocol • ҎԼͷUser͸ෆมͰ͋Γɺෳ਺͔Βࢀরͯ͠΋Race Conditions ͕ى͖ͳ͍ • = Sendableʹద߹Ͱ͖Δ struct User: Sendable { let name: String let age: Int64 }

Slide 7

Slide 7 text

ࢀߟࢿྉ • Protect mutable state with Swift actors • https://developer.apple.com/videos/play/wwdc2021/10133/ • Eliminate data races using Swift Concurrency • https://developer.apple.com/videos/play/wwdc2022/110351/

Slide 8

Slide 8 text

Swift 6 • ͜ͷΑ͏ͳةݥͳίʔυΛίϯύΠϧ࣌ʹνΣοΫͯ͘͠ΕΔΑ͏ʹ ͳΔ • Sendable͕ඞཁͳՕॴͰ͸ඞਢʹͳΔ(Sendable Constraints) • ಛఆͷεϨουͰͷಈ࡞Λڧ੍ (Actor Isolation Checking) • →ࠓ·Ͱಈ͍͍ͯͨίʔυ͕ಈ͔ͳ͘ͳΔՄೳੑ • →Swift 6͕ग़ͨͱ͖ʹ߄ͯͳ͍Α͏ʹɺࠓͷ͏ͪʹ४උ͓ͯ͘͠ඞ ཁ͕͋Δ

Slide 9

Slide 9 text

Ͳ͏΍ͬͯҠߦ͍͚ͯ͠͹ྑ͍ͷʁ • Incremental migration to concurrency checking • https://github.com/apple/swift-evolution/blob/main/proposals/0337- support-incremental-migration-to-concurrency-checking.md • ҆શͳඇಉظॲཧνΣοΫͷͨΊͷϚΠάϨʔγϣϯख๏ΛఏҊͨ͠ proposal

Slide 10

Slide 10 text

No content

Slide 11

Slide 11 text

কདྷతʹյΕΔͱ͜ΖΛ஌Δʹ͸ʁ • -warn-concurrency • Swift 6͔ΒΤϥʔʹͳΔ߲໨Λܯࠂͯ͘͠ΕΔϏϧυΦϓγϣϯ • ͜ΕΛ͚ͭΔ͜ͱͰɺSwift 6͔ΒΤϥʔʹͳΔ෦෼Λܯࠂͯ͘͠ΕΔΑ͏ ʹͳΔ • Swift 5.7͔ΒมΘͬͨͷͰ࠷ۙ͸ਪ঑͞Εͳ͍ʢ·ͩ࢖͑Δʣ

Slide 12

Slide 12 text

-strict-concurrency= • Swift 5.7(Xcode 14.0)͔ΒมΘͬͨ • https://github.com/apple/swift/pull/42523 • ୅ΘΓʹ-strict-concurrency=LEVELͱ͍͏ΦϓγϣϯͰܯࠂϨϕϧΛબ΂ ΔΑ͏ʹ • minimal, targeted, completeͷ3ஈ֊ • completeϞʔυ͕-warn-concurrencyͱಉ౳

Slide 13

Slide 13 text

Xcode Project΁ͷઃఆ • ͳ͔ͥXcode 14.3βͰͣͬͱͿͬյΕ͍͕ͯͨɺ14.3RCͰ΍ͬͱ௚ͬͨ

Slide 14

Slide 14 text

// swift-tools-version: 5.8 // The swift-tools-version declares the minimum version of Swift required to build this package. import PackageDescription let package = Package( name: "MyPackage", platforms: [ .macOS(.v11), ], targets: [ .executableTarget( name: "MyPackage", path: "Sources", swiftSettings: [ .unsafeFlags([ "-Xfrontend", "-strict-concurrency=complete", ]), ] ), ] ) Swift Package΁ͷઃఆ

Slide 15

Slide 15 text

֤Ϩϕϧ͸Կ͕ҧ͏ͷ͔ʁ • Proposalʹ͸ॻ͔Ε͍ͯͳ͍ • ͜ͷΦϓγϣϯ͕ಋೖ͞ΕͨPR΍swiftcͷ࣮૷Ͱ஌Δ͜ͱ͕Ͱ͖Δ • ͜ΕΛಡΜ͚ͩͩ͡ΌΑ͘Θ͔Βͳ͍ https://github.com/apple/swift/blob/main/include/swift/Basic/LangOptions.h https://github.com/apple/swift/pull/42523

Slide 16

Slide 16 text

Sendable Constraints Actor Isolation Checking Minimal ໌ࣔతʹSendableʹద߹͍ͯ͠ Δ৔߹ ConcurrencyΛ࢖༻͍ͯ͠Δ৔߹ Targeted ConcurrencyΛ࢖༻͍ͯ͠Δ৔߹ ConcurrencyΛ࢖༻͍ͯ͠Δ৔߹ Completed શͯͷίʔυ શͯͷίʔυ

Slide 17

Slide 17 text

Minimal • Xcodeͷॳظઃఆ • SendableΛ໌࣮ࣔͨ͠૷ʹؔͯ͠SendableͷνΣοΫ͕૸Δ ⚠Sendableʹద߹ग़དྷͳ͍৔߹ʹܯࠂʹͳΔ • ڞ༗͞ΕΔՄมͳ஋͕͋Δ৔߹ͳͲ

Slide 18

Slide 18 text

Targeted • ConcurrencyΛར༻͍ͯ͠ΔՕॴͰSendableͷνΣοΫ͕༗ޮʹͳΔ ⚠SendableͳclosureΛٻΊ͍ͯΔՕॴͰnon-sendableͳclosureΛ౉͢ ⚠SendableͰ͸ͳ͍஋ΛSendableͳclosureͰΩϟϓνϟ͢Δ

Slide 19

Slide 19 text

• non-sendableͳ஋ΛSendableͳclosureͰ࢖͓͏ͱ͢Δ(Sendable Constraints) • actor͕ࢦఆ͞Ε͍ͯͳ͍asyncϝιουΛผͷactor͔Βݺ΅͏ͱ͢Δ(Actor isolation Checking)

Slide 20

Slide 20 text

Complete ɾSwift 6ޓ׵Ϟʔυ ɾwarn-concurrencyͱಉ౳ ⚠ConcurrencyΛ࢖͍ͬͯͳ͍෦෼ʹؔͯ͠΋Sendable੍໿/Actor IsolationΛ νΣοΫ͢Δ • `MainActor(unsafe)`͕༗ޮʹͳΔ 🚨UIViewControllerͳͲɺϝΠϯεϨουͰͷಈ࡞Λ૝ఆ͍ͯ͠Δ࣮૷͕ MainActorҎ֎͔Β͸ݺ΂ͳ͘ͳΔ

Slide 21

Slide 21 text

• ಉظؔ਺ʹ͍ͭͯ΋Sendable Constraints͕νΣοΫ͞ΕΔ • MainActor(unsafe)ͳ࣮૷͕MainActorʹͳΔͨΊɺ͜Ε·Ͱͱҧ͍ಉظతʹݺ΂ͳ͘ͳΔ • UIViewControllerͳͲ

Slide 22

Slide 22 text

ࢀߟ • Swift Concurrency ʹରԠ͍ͯͨ͘͠Ίͷ Strict Concurrency Check ͱ `@preconcurrency import` • https://qiita.com/maiyama18/items/7f2a7c0ed4cce9d3af72

Slide 23

Slide 23 text

Ͳ͏΍ͬͯ௚͍ͯ͘͠ͷʁ • ࠷ऴతʹSwift 6·ͰʹCompleteͷܯࠂ͕ղফ͞Εͳ͍ͱϏϧυ͕௨Βͳ͘ ͳΔ • ࠓޙஈ֊తϚΠάϨʔγϣϯΛਐΊ͍ͯ͘͜ͱͰɺରԠͷ஌ݟ͕ཷ·͍͖ͬͯ ͦ͏ • ͪ͜ΒͷهࣄͰҠߦϓϥϯʹ͍ͭͯ৮ΕΒΕ͍ͯͨ • Introducing Swift Concurrency to Merpay code • https://engineering.mercari.com/en/blog/entry/20221223-introducing- swift-concurrency-to-merpay-code/

Slide 24

Slide 24 text

Ͳ͏΍ͬͯ௚͍ͯ͘͠ͷʁ • Concurrencyͷཧղʹ͸5෼͸͕࣌ؒ଍Γͳ͍ • ༷ʑͳݴޠ࢓༷΍ඇಉظॲཧ΁ͷૉཆ͕ඞཁ • actor/@MainActor/Sendable/@preconcurrency • ଓ͖͸࠙਌ձͰ 🍻🍻

Slide 25

Slide 25 text

·ͱΊ • ܯࠂΛઃఆͯ͠Swift 6ʹ޲͚ͯিܸʹඋ͑Δ • -warn-concurrencyͰ͸ͳ͘ɺ-strict-concurrency=completeΛ࢖͏ • ϚΠάϨʔγϣϯϓϥϯʹ͍ͭͯߟ͍͑ͯ͘ඞཁ͕͋Δ • ଟ͘ͷΞϓϦέʔγϣϯͰ͸Main Actor IsolatedͳܯࠂΛղফ͍ͯ͘͠ඞཁ ͕͋Δ