Slide 1

Slide 1 text

2025/01/17 Θ͍Θ͍swiftc shiz SwiftίϯύΠϥ௒ೖ໳ asyncؔ਺ͷ࢓૊Έ +

Slide 2

Slide 2 text

ࣗݾ঺հ •shiz(ͣ͠) X: @stzn3 GitHub: @stzn •෱Ԭࡏॅ iOSΤϯδχΞ ຊͷࣥච 4XJGUݴޠΨΠυͷ຋༁

Slide 3

Slide 3 text

৽ץग़͠·͢ •λΠτϧ: ετϦʔτίʔμʔ •2025೥2݄຤ൃച༧ఆ •ݱ৔(ετϦʔτ)Ͱੜ͖ൈͨ͘Ίͷ஌ࣝ΍ٕज़ ͕٧·͍ͬͯΔ https://amzn.asia/d/dfD9BxU

Slide 4

Slide 4 text

ຊ೔ͷ಺༰ •SwiftίϯύΠϥ௒ೖ໳ •Swift asyncؔ਺ͷ2ͭͷಛ௃(֓ཁ) •Swift asyncؔ਺ͷ2ͭͷಛ௃(ৄࡉ)

Slide 5

Slide 5 text

࢖༻ͨ͠swiftlang/swiftͷtag •swift-DEVELOPMENT-SNAPSHOT-2024-12-22-a •Swift6.2

Slide 6

Slide 6 text

ຊ೔ͷ಺༰ •SwiftίϯύΠϥ௒ೖ໳ •Swift asyncؔ਺ͷ2ͭͷಛ௃(֓ཁ) •Swift asyncؔ਺ͷ2ͭͷಛ௃(ৄࡉ)

Slide 7

Slide 7 text

ίϯύΠϥͱ͸ʁ

Slide 8

Slide 8 text

ίϯύΠϥ •ϓϩάϥϛϯάݴޠͰॻ͔ΕͨίʔυΛɺʮί ϯϐϡʔλ͕࣮ࡍʹ࣮ߦͰ͖Δܗʯʹม׵͢Δ ϓϩάϥϜ

Slide 9

Slide 9 text

ίϯύΠϥ͕ߦ͏ओͳॲཧ •ࣈ۟ղੳ: ιʔείʔυΛτʔΫϯʹ෼ղ͠ɺߏจతʹղੳ͠΍͘͢͢Δ •ߏจղੳ: τʔΫϯΛجʹߏจنଇΛνΣοΫ͠ɺߏ଄ΛղੳɻASTΛੜ੒ •ҙຯղੳ: ม਺ͷܕ΍είʔϓΛ֬ೝ͠ɺҙຯతʹਖ਼͍͔͠νΣοΫ •IRੜ੒: ίϯύΠϥ͕࠷దԽ͠΍͘͢ΔͨΊͷίʔυΛੜ੒ •࠷దԽ: ੑೳΛ޲্ͤ͞ΔͨΊʹɺIRΛΑΓૣ͘(খ͘͞)ม׵͢Δ •ίʔυੜ੒: ػցޠΛੜ੒͠ɺCPU͕࣮ߦՄೳͳܗࣜʹม׵ 💡 ίϯύΠϥʹΑͬͯ͸ߦ͏͜ͱ͸มΘΔ

Slide 10

Slide 10 text

ίϯύΠϥ͕ߦ͏ओͳॲཧ • ࣈ۟ղੳ: ιʔείʔυΛτʔΫϯʹ෼ղ͠ɺߏจతʹղੳ͠΍͘͢͢Δ • ߏจղੳ: τʔΫϯΛجʹߏจنଇΛνΣοΫ͠ɺߏ଄ΛղੳɻASTΛੜ ੒ • ҙຯղੳ: ม਺ͷܕ΍είʔϓΛ֬ೝ͠ɺҙຯతʹਖ਼͍͔͠νΣοΫ •IRੜ੒: ίϯύΠϥ͕࠷దԽ͠΍͘͢ΔͨΊͷίʔυΛੜ੒ • ࠷దԽ: ੑೳΛ޲্ͤ͞ΔͨΊʹɺIRΛΑΓૣ͘(খ͘͞)ม׵͢Δ • ίʔυੜ੒: ػցޠΛੜ੒͠ɺCPU͕࣮ߦՄೳͳܗࣜʹม׵ 💡 ίϯύΠϥʹΑͬͯ͸ߦ͏͜ͱ͸มΘΔ

Slide 11

Slide 11 text

ίϯύΠϥ͕ߦ͏ओͳॲཧ •ࣈ۟ղੳ: ιʔείʔυΛτʔΫϯʹ෼ղ͠ɺίʔυΛߏจతʹղੳ͠΍͘͢ •ߏจղੳ: τʔΫϯΛجʹߏจنଇΛνΣοΫ͠ɺϓϩάϥϜͷߏ଄ΛղੳɻASTΛੜ੒ •ҙຯղੳ: ม਺ͷܕ΍είʔϓΛ֬ೝ͠ɺϓϩάϥϜ͕ҙຯతʹਖ਼͍͔͠νΣοΫ •IRੜ੒: ίϯύΠϥ͕࠷దԽ͠΍͘͢ΔͨΊͷίʔυΛੜ੒ •࠷దԽ: ੑೳΛ޲্ͤ͞ΔͨΊʹɺෆཁͳܭࢉͷ࡟আ΍ޮ཰ͷྑ͍ΞϧΰϦζϜ΁ม׵ •ίʔυੜ੒: ػցޠΛੜ੒͠ɺCPU͕࣮ߦՄೳͳܗࣜʹม׵ •ίʔυϦϯΫ: ιʔεϑΝΠϧ΍ϥΠϒϥϦΛ݁߹͠ɺ࠷ऴతͳ࣮ߦՄೳϑΝΠϧΛੜ੒ 💡 શͯΛඞͣߦ͏ͱ͍͏Θ͚Ͱ͸ͳ͍

Slide 12

Slide 12 text

IRͱ͸ʁ •Intermediate Representation /தؒදݱ •ϓϩάϥϛϯάݴޠͷίʔυΛػցޠʹม׵͢ ΔաఔͰੜ੒͢Δதؒతͳίʔυ

Slide 13

Slide 13 text

IRͱ͸ʁ • Intermediate Representation /தؒදݱ • ϓϩάϥϛϯάݴޠͷίʔυΛػցޠʹม׵͢ΔաఔͰੜ੒͢Δ தؒతͳίʔυ •ͳͥඞཁʁ • ߏ଄͕γϯϓϧͰίʔυΛ࠷దԽ͠΍͍͢ • ৭ʑͳλʔήοτͷίʔυΛੜ੒(e.g. Apple SiliconͷMacOS༻) • ίϯύΠϥϓϩηεͷ෼཭ʹΑΔ࠶ར༻ੑͱ։ൃޮ཰޲্

Slide 14

Slide 14 text

Swi f ίϯύΠϥ͸ʁ

Slide 15

Slide 15 text

SwiftίϯύΠϥͷओͳॲཧ 1. Parse(ࣈ۟ɾߏจղੳ) 2. Sema(ҙຯղੳ) 3. SILGen(IRੜ੒) 4.SILOptimizer(࠷దԽ) 5. IRGen(IRੜ੒) 6.LLVM(࠷దԽɺίʔυੜ੒) https://qiita.com/rintaro/items/3ad640e3938207218c20 ❶ ❷ ❸ ❹ ❺ ❻

Slide 16

Slide 16 text

SwiftίϯύΠϥʹ͍ͭͯ஌Γ͚ͨΕ͹ https://qiita.com/rintaro/items/3ad640e3938207218c20

Slide 17

Slide 17 text

͍͔ͭ͘ิ଍

Slide 18

Slide 18 text

SwiftίϯύΠϥͷओͳύΠϓϥΠϯ 1. Parse(ࣈ۟ɾߏจղੳ) 2. Sema(ҙຯղੳ) 3.SILGen(IRੜ੒) 4.SILOptimizer(࠷దԽ) 5.IRGen(IRੜ੒) 6.LLVM(࠷దԽɺίʔυੜ੒) https://qiita.com/rintaro/items/3ad640e3938207218c20 💡࣮ࡍ͸ASTͳͲ΋ͬͱଟ͘ͷIRΛੜ੒͍ͯ͠Δ

Slide 19

Slide 19 text

SILGen •SILΛੜ੒͢Δ •SIL: Swift Intermediate Language •Swiftͷݴޠߏ଄Λ൓өͨ͠IR •ܕνΣοΫ΍Swiftಛ༗ͷ࠷దԽΛߦ͏ ϓν৘ใ: ࠷ۙSILʹ͍ͭͯͷυΩϡϝϯτ͕੔ཧ͞Εͨ

Slide 20

Slide 20 text

IRGen •LLVM IRΛੜ੒͢Δ •࠷ऴతͳػցޠΛੜ੒͢ΔաఔͰ࠷దԽ͠΍ ͘͢͢ΔͨΊʹੜ੒͞ΕΔLLVM༻ͷIR

Slide 21

Slide 21 text

LLVMʁ

Slide 22

Slide 22 text

SwiftίϯύΠϥͷओͳύΠϓϥΠϯ 1. Parse(ࣈ۟ɾߏจղੳ) 2. Sema(ҙຯղੳ) 3. SILGen(IRੜ੒) 4.SILOptimizer(࠷దԽ) 5. IRGen(IRੜ੒) 6.LLVM(࠷దԽɺίʔυੜ੒) https://qiita.com/rintaro/items/3ad640e3938207218c20

Slide 23

Slide 23 text

LLVM •SwiftͰ͸ͳ͍ •ίϯύΠϥͷόοΫΤϯυͱݺ͹ΕΔ෦෼ •LLVM IR͔Β͞·͟·ͳλʔήοτͷػցޠΛੜ੒ •λʔήοτʹԠͨ͡࠷దԽΛͯ͘͠ΕΔ •൚༻తʹ࢖ΘΕ͍ͯΔ(C++ɺRustɺ ActionScript…)

Slide 24

Slide 24 text

LLVMʹ͍ͭͯ஌Γ͚ͨΕ͹ 💡ͪΐͬͱݹ͍৘ใ΋͋Δ

Slide 25

Slide 25 text

LLVM IR •࠷ऴతͳػցޠΛੜ੒͢ΔաఔͰ࠷దԽ͠΍͢ ͘͢ΔͨΊʹੜ੒͞ΕΔLLVM༻ͷIR

Slide 26

Slide 26 text

SILͱLLVM IR Swift SIL LLVM IR

Slide 27

Slide 27 text

SILͱLLVM IR Swift SIL LLVM IR string integer Array i64 i32 ptr

Slide 28

Slide 28 text

ຊ೔ͷ಺༰ •SwiftίϯύΠϥ௒ೖ໳ •Swift asyncؔ਺ͷ2ͭͷಛ௃(֓ཁ) •Swift asyncؔ਺ͷ2ͭͷಛ௃(ৄࡉ)

Slide 29

Slide 29 text

ຊ೔ͷ಺༰ •SwiftίϯύΠϥ௒ೖ໳ •Swift asyncؔ਺ͷ2ͭͷಛ௃(֓ཁ) •Swift asyncؔ਺ͷ2ͭͷಛ௃(ৄࡉ)

Slide 30

Slide 30 text

SwiftͷύϑΥʔϚϯεৄࡉ Swift asyncؔ਺ͷ2ͭͷಛ௃

Slide 31

Slide 31 text

ಛผͳελοΫʹϩʔΧϧঢ়ଶΛอ࣋ தஅϙΠϯτ(await)Ͱෳ਺ͷؔ਺ʹ෼ׂ Swift asyncؔ਺ͷ2ͭͷಛ௃ SwiftͷύϑΥʔϚϯεৄࡉ

Slide 32

Slide 32 text

Swift asyncؔ਺ͷ2ͭͷಛ௃ •ಛผͳελοΫʹϩʔΧϧঢ়ଶΛอ࣋ •தஅϙΠϯτ(await)Ͱෳ਺ͷؔ਺ʹ෼ׂ

Slide 33

Slide 33 text

Swift asyncؔ਺ͷ2ͭͷಛ௃ •ಛผͳελοΫʹϩʔΧϧঢ়ଶΛอ࣋ •தஅϙΠϯτ(await)Ͱෳ਺ͷؔ਺ʹ෼ׂ

Slide 34

Slide 34 text

ελοΫϝϞϦ ಉظ(sync)ؔ਺ͷ࢓૊Έ ελοΫϝϞϦ্ͷ ίʔϧελοΫ(※) ίʔϧελοΫ func1 func2 func3 εϨου ※ ؔ਺ͷݺͼग़͠΍໭ΓΛ ؅ཧ͢ΔελοΫ(σʔλߏ଄)

Slide 35

Slide 35 text

ิ଍: ελοΫ(σʔλߏ଄) ελοΫ ཁૉ LIFO(Last-In, First-OutʗޙೖΕઌग़͠)ͷಛੑΛ࣋ͭσʔλߏ଄ ཁૉ ελοΫ ཁૉ ཁૉ ޙೖΕ(Last-In) ઌग़͠(First-Out)

Slide 36

Slide 36 text

ิ଍: ελοΫ(σʔλߏ଄) ελοΫ ཁૉ LIFO(Last-In, First-OutʗޙೖΕઌग़͠)ͷಛੑΛ࣋ͭσʔλߏ଄ ཁૉ ελοΫ ཁૉ ཁૉ ޙೖΕ(Last-In) ઌग़͠(First-Out) ⚠ώʔϓϝϞϦͰ΋ελοΫ(σʔλߏ଄)͸࢖༻Մೳ

Slide 37

Slide 37 text

ίʔϧελοΫ func1 func2 func3 εϨου ελοΫϑϨʔϜ Ҿ਺ ϩʔΧϧม਺ ؔ਺ͷ໭ΓΞυϨε ݺͼग़͠ݩ΁ͷࢀর

Slide 38

Slide 38 text

εϨου ಉظ(sync)ؔ਺ syncݺͼग़͠ syncऴྃ ίʔϧελοΫ func1 func2 sync ίʔϧελοΫ func1 func2 εϨου sync ऴΘͬͨΒ ফ͑Δ

Slide 39

Slide 39 text

asyncؔ਺Ͱߟ͑ͯΈΔ

Slide 40

Slide 40 text

ݺͼग़࣌͠͸ಉ͡ asyncݺͼग़͠ ίʔϧελοΫ func1 func2 εϨου async

Slide 41

Slide 41 text

ίʔϧελοΫ func1 func2 εϨου async தஅ࣌ʹऔΓग़͢ඞཁ͕͋Δ asyncݺͼग़͠ await ίʔϧελοΫ func1 func2 εϨου async async ফ͑Δ… ଴͍ͬͯΔؒʹ ଞͷॲཧΛ͍ͤͨ͞

Slide 42

Slide 42 text

ίʔϧελοΫ func1 func2 εϨου async ࠶։࣌ʹ·ͨඞཁ asyncݺͼग़͠ ίʔϧελοΫ func1 func2 εϨου async ίʔϧελοΫ func1 func2 func3 εϨου ࠶։࣌ async Ͳ͏͠Α͏… await ⚠ಉ͡εϨουͱ ͸ݶΒͳ͍

Slide 43

Slide 43 text

ͦ͜Ͱ

Slide 44

Slide 44 text

ಛผͳελοΫʹ ϩʔΧϧঢ়ଶΛอ࣋ 💡͜͜Ͱݴ͏ελοΫ͸σʔλߏ଄ͷ࿩

Slide 45

Slide 45 text

async ώʔϓϝϞϦ ελοΫϝϞϦ Ұ෦ΛผͷελοΫʹୀආ εϨου func1 func2 async ίʔϧελοΫ ελοΫ ώʔϓϝϞϦ্ͷ ελοΫ

Slide 46

Slide 46 text

࠶։ޙʹඞཁͳ৘ใͷΈ async ελοΫ ίʔϧελοΫ async a b

Slide 47

Slide 47 text

async ελοΫ ίʔϧελοΫ async asyncϑϨʔϜ தஅ(await)લ·Ͱ͔͠ ࢖Θͳ͍৘ใ ࠶։ޙʹ΋ඞཁͳ৘ใ

Slide 48

Slide 48 text

ελοΫϝϞϦ ࠶։࣌ʹίʔϧελοΫʹ໭͢ ελοΫ εϨου ⚠ผεϨου ͷՄೳੑ͋Γ ώʔϓϝϞϦ func4 func5 async ίʔϧελοΫ

Slide 49

Slide 49 text

Task Task͕ඇಉظॲཧΛ؅ཧ

Slide 50

Slide 50 text

Task TaskAllocatorͰϝϞϦ؅ཧ TaskAllocator

Slide 51

Slide 51 text

ώʔϓϝϞϦ ৘ใΛ֨ೲ͢ΔϝϞϦΛ֬อ Task TaskAllocator ϝϞϦྖҬ 💡Taskͷ࡞੒࣌ʹߦ͍ͬͯΔ Task TaskAllocator ϝϞϦྖҬ

Slide 52

Slide 52 text

ώʔϓϝϞϦ Task TaskAllocator ϝϞϦྖҬ Task TaskAllocator ϝϞϦྖҬ async ඞཁʹԠͯ͡ϝϞϦׂΓ౰ͯ

Slide 53

Slide 53 text

ώʔϓϝϞϦ Task TaskAllocator ϝϞϦྖҬ async ϝϞϦྖҬ ଍Γͳ͚Ε͹௥Ճ

Slide 54

Slide 54 text

ώʔϓϝϞϦ Task TaskAllocator ϝϞϦྖҬ async ϝϞϦྖҬ ଍Γͳ͚Ε͹௥Ճ Stack discipline + Bump pointer allocation Slab ࿈ଓͨ͠ϝϞϦྖҬ ޮ཰తʹϝϞϦΛׂΓ౰ͯΔͨΊͷ࢓૊Έ StackAllocatorͷ࣮૷(TaskAllocator͸typealiasΈ͍ͨͳ΋ͷ)

Slide 55

Slide 55 text

ώʔϓϝϞϦ Task ޮ཰Խͷ޻෉ TaskAllocator ϝϞϦྖҬ async StackAllocatorͷ࣮૷(TaskAllocator͸typealiasΈ͍ͨͳ΋ͷ) Slab ࿈ଓͨ͠ϝϞϦྖҬ Stack discipline + Bump pointer allocation ޮ཰తʹϝϞϦΛׂΓ౰ͯΔͨΊͷ࢓૊Έ

Slide 56

Slide 56 text

Swift asyncؔ਺ͷ2ͭͷಛ௃ •ಛผͳελοΫʹϩʔΧϧঢ়ଶΛอ࣋ •தஅϙΠϯτ(await)Ͱෳ਺ͷؔ਺ʹ෼ׂ

Slide 57

Slide 57 text

Swift asyncؔ਺ͷ2ͭͷಛ௃ •ಛผͳελοΫʹϩʔΧϧঢ়ଶΛอ࣋ •தஅϙΠϯτ(await)Ͱෳ਺ͷؔ਺ʹ෼ׂ

Slide 58

Slide 58 text

ؔ਺Λ෼ׂʁʁʁ Ͳ͏͍͏͜ͱʁ

Slide 59

Slide 59 text

awaitͰؔ਺Λ෼ׂͤ͞Δ 💡ͦΕͧΕΛ෦෼ؔ਺ͱݺͿ hoge1 hoge2

Slide 60

Slide 60 text

ิ଍: rampؔ਺&resumeؔ਺ •rampؔ਺: ࠷ॳͷawait·Ͱ࣮ߦ •resumeؔ਺: awaitҎ߱ͷॲཧΛ࣮ߦ

Slide 61

Slide 61 text

hoge1 hoge2 resumeؔ਺͸await͝ͱʹ࡞੒ hoge3

Slide 62

Slide 62 text

hoge1 ࠶։࣌ʹawaitҎ߱ͷॲཧΛݺͼग़͢ await hoge2 https://github.com/swiftlang/swift/blob/main/docs/SIL/Types.md#async-functions asyncϑϨʔϜ ࠶։ޙͷॲཧ

Slide 63

Slide 63 text

hoge1 ࠶։࣌ʹawaitҎ߱ͷॲཧΛݺͼग़͢ await hoge2 https://github.com/swiftlang/swift/blob/main/docs/SIL/Types.md#async-functions asyncϑϨʔϜ ࠶։ޙͷॲཧ 💡͜ͷதஅͯ͠࠶։͢Δ࢓૊ΈΛ ContinuationͱݺͿ 💡ίʔϧελοΫ্Ͱ Ͳ͔͜Β࣮ߦ͢Ε͹Α͍͔ͷ৘ใ

Slide 64

Slide 64 text

͞Βʹ2ͭͷಛ௃ •຤ඌ࠶ؼ(tail call) •AsyncContext

Slide 65

Slide 65 text

͞Βʹ2ͭͷಛ௃ •຤ඌ࠶ؼ(tail call) •AsyncContext

Slide 66

Slide 66 text

hoge1 await await hoge2 asyncϑϨʔϜ ࠶։ޙͷॲཧ ؔ਺ϙΠϯλ ௚઀ΞυϨεΛ౉͢

Slide 67

Slide 67 text

hoge1 ॲཧ͕ऴΘͬͨΒݺͼग़͢ await await hoge2 asyncϑϨʔϜ ࠶։ޙͷॲཧ 💡຤ඌ࠶ؼ(tail call)ͱ͍͏ख๏Λ࢖͍ͬͯΔ ؔ਺ϙΠϯλ ݺͼग़͠

Slide 68

Slide 68 text

hoge1 ຤ඌ࠶ؼ(tail call) await await hoge2 asyncϑϨʔϜ ࠶։ޙͷॲཧ 💡ελοΫΛ࢖Θͳͯ͘ࡁΉ(ϝϞϦ࠷దԽ) ؔ਺ϙΠϯλ ݺͼग़͠

Slide 69

Slide 69 text

͞Βʹ2ͭͷಛ௃ •຤ඌ࠶ؼ(tail call) •AsyncContext

Slide 70

Slide 70 text

Task Taskશମͷ৘ใ asyncϑϨʔϜ asyncϑϨʔϜ asyncϑϨʔϜ 1ͭͷඇಉظؔ਺ͷ৘ใ AsyncContext

Slide 71

Slide 71 text

hoge1 await hoge2 asyncϑϨʔϜ ࠶։ޙͷॲཧ AsyncContext ϙΠϯλ AsyncContextͷϙΠϯλΛ࣋ͪճΔ ϙΠϯλܦ༝Ͱ ඞཁͳ৘ใΛऔಘ AsyncContext ϙΠϯλ AsyncContext ϙΠϯλ

Slide 72

Slide 72 text

ؔ਺෼ׂ͸ Ͳ͜ͰߦͬͯΔͷ͔ʁ

Slide 73

Slide 73 text

ؔ਺෼ׂ͸LLVM͕ߦ͍ͬͯΔ 1. Parse(ࣈ۟ɾߏจղੳ) 2. Sema(ҙຯղੳ) 3. SILGen(IRੜ੒) 4. SILOptimizer(࠷దԽ) 5. IRGen(IRੜ੒) 6.LLVM(࠷దԽɺίʔυੜ੒) https://qiita.com/rintaro/items/3ad640e3938207218c20 ͜͜

Slide 74

Slide 74 text

Async lowering https://llvm.org/docs/Coroutines.html#async-lowering

Slide 75

Slide 75 text

ݩʑSwi f ͷͨΊʹ ௥Ճ࣮ͨ͠૷

Slide 76

Slide 76 text

Swi f ༻ͷ࣮૷͸ͳͥඞཁͩͬͨʁ •ΦʔόʔϔουΛ࠷খݶʹ཈͑ΔͨΊ • ෆཁͳॲཧͷলུ എܠ: ݩʑ͸C++ʹద࣮ͨ͠૷ & SwiftͰͷ࢖ΘΕํ͕ҟͳΔ(ྫ: forϧʔϓ) • Swiftଆʹ͓͚Δߴ౓ͳ࠷దԽΛॏࢹ • Swiftಠࣗͷݺͼग़͠ن໿ʹରԠ • কདྷతͳݴޠػೳͷ֦ுʹରԠ • ݺͼग़͠ଆʹΑΔॊೈͳϝϞϦ؅ཧ(Task͕࢘ྩౝ)

Slide 77

Slide 77 text

Coroutine Representations and ABIs in LLVM

Slide 78

Slide 78 text

⚠ Returned-Continuation Lowering → Async Lowering LLVMͷϓϩϙʔβϧ

Slide 79

Slide 79 text

ຊ೔ͷ಺༰ •SwiftίϯύΠϥ௒ೖ໳ •Swift asyncؔ਺ͷ2ͭͷಛ௃(֓ཁ) •Swift asyncؔ਺ͷ2ͭͷಛ௃(ৄࡉ)

Slide 80

Slide 80 text

ຊ೔ͷ಺༰ •SwiftίϯύΠϥ௒ೖ໳ •Swift asyncؔ਺ͷ2ͭͷಛ௃(֓ཁ) •Swift asyncؔ਺ͷ2ͭͷಛ௃(ৄࡉ)

Slide 81

Slide 81 text

͍͍ͩͨLLVMͷ࿩

Slide 82

Slide 82 text

LLVM IR௒ೖ໳

Slide 83

Slide 83 text

Module LLVM IRͷߏ଄ Function BasicBlock(BB) Instruction ϓϩάϥϜશମΛ؅ཧ͢Δίϯςφ 1ͭͷϓϩάϥϜɻ͍ΘΏΔؔ਺ ॱ൪ʹ࣮ߦ͢Δ໋ྩͷϦετ Ϛγϯ΁ͷ࣮ࡍͷ໋ྩ

Slide 84

Slide 84 text

Function Function Module ͜ΜͳΠϝʔδ if … else BasicBlock Instruction Instruction … BasicBlock Instruction Instruction … if … else BasicBlock Instruction Instruction … BasicBlock Instruction Instruction …

Slide 85

Slide 85 text

Swift asyncؔ਺ͷ2ͭͷಛ௃ •ಛผͳελοΫʹϩʔΧϧঢ়ଶΛอ࣋ •தஅϙΠϯτ(await)Ͱෳ਺ͷؔ਺ʹ෼ׂ

Slide 86

Slide 86 text

࠶։ޙʹඞཁͳ৘ใͷΈอ࣋ ώʔϓϝϞϦ ελοΫ async value

Slide 87

Slide 87 text

Ͳ͏΍ͬͯඞཁ͔Ͳ͏͔Λ ൑அ͍ͯ͠Δʁ

Slide 88

Slide 88 text

•͢΂ͯͷ஋ʢม਺ɺఆ਺ɺؔ਺ɺ໋ྩͳͲʣͷ ڞ௨ͷ਌Ϋϥε •͜ͷ஋Λ࢖༻͍ͯ͠ΔଞͷValueͷϦετ (UseList)Λอ࣋ = def-use chain Value Ϋϥε https://llvm.org/doxygen/classllvm_1_1Value.html LLVM

Slide 89

Slide 89 text

•2ͭͷ BasicBlock A ͱ B ͕༩͑ΒΕͨ৔߹ʹɺA ͔Β B ΁ͷύε͕தஅϙΠϯτ(await)Λ௨ա͢ Δ͔Ͳ͏͔ΛνΣοΫ(தஅInstructionؚ͕·Ε͍ͯΔ͔Ͳ͏ ͔) SuspendCrossingInfoΫϥε https://github.com/swiftlang/llvm-project/blob/next/llvm/include/llvm/Transforms/Coroutines/SuspendCrossingInfo.h LLVM

Slide 90

Slide 90 text

BasicBlock Value ԿΛ͍ͯ͠Δʁ UseList BasicBlock Value BasicBlock Value BasicBlock Value … LLVM SuspendCrossingInfo ؔ਺෼ׂޙʹ ͕BasicBlockΛൺֱ ௒͍͑ͯΔʁ

Slide 91

Slide 91 text

͜ΕͰෆཁͳϝϞϦΛ ࢖Θͳͯ͘ࡁΉ

Slide 92

Slide 92 text

…͸͚ͣͩͲ

Slide 93

Slide 93 text

όά͕͋ΔΒ͍͠ https://github.com/swiftlang/swift/issues/72289

Slide 94

Slide 94 text

ṖͷasyncϑϨʔϜ… Կ΋தஅϙΠϯτΛ௒͑ͳ͍ asyncϑϨʔϜ͕࡞ΒΕ͍ͯΔ ͷʹ https://github.com/swiftlang/swift/issues/72289

Slide 95

Slide 95 text

ݪҼߟ࡯ 💡Spillsʹ஋ؚ͕·Ε͍ͯΔͱ ϝϞϦΛ֬อ͠ͳΕ͹ͳΒͳ͍ swift_task_alloc(※)͕ݺ͹Ε͍ͯΔ͜ͱ͕ݪҼʁ ※ AsyncContextʹಈతͳαΠζ͕ඞཁͳ৔߹ʹݺ͹ΕΔ https://github.com/swiftlang/swift/issues/72289

Slide 96

Slide 96 text

ݪҼߟ࡯ asyncؔ਺͸શ෦͜ΕΛ ݺͿΑ͏ʹͳ͍ͬͯΔ = AsyncContextͷsize͕ staticʹܾ·Βͳ͍ https://github.com/swiftlang/swift/blob/main/lib/IRGen/GenCall.cpp#L166 https://github.com/swiftlang/swift/issues/72289

Slide 97

Slide 97 text

•͜ͷೝࣝͰ߹͍ͬͯΔͷ͔ʁ •Ͳ͏ղܾ͢Δ͔ʁ •தஅϙΠϯτΛ௒͑ͳ͍৔߹͸staticͳ AsyncContextSizeΛ౉͢ʁ(Ͳ͏൑ఆ͢Δʁ) •LLVMଆͰswift_task_allocΛফ͢ʁ Μʙ… https://github.com/swiftlang/swift/issues/72289

Slide 98

Slide 98 text

ͦΕ͸͓͖ͯ͞

Slide 99

Slide 99 text

Swift asyncؔ਺ͷ2ͭͷಛ௃ •ಛผͳελοΫʹϩʔΧϧঢ়ଶΛอ࣋ •தஅϙΠϯτ(await)Ͱෳ਺ͷؔ਺ʹ෼ׂ

Slide 100

Slide 100 text

LLVMʹ͓͚Δίʔυͷ࠷దԽ ม׵લ LLVM IR ม׵ޙ LLVM IR

Slide 101

Slide 101 text

ෳ਺ͷPassʹΑΔ࠷దԽ ม׵લ LLVM IR Pass Pass ม׵ޙ LLVM IR … ղੳ/ ࠷దԽ

Slide 102

Slide 102 text

ؔ਺෼ׂ΋ͦͷ1ͭ ม׵લ LLVM IR Pass Pass ม׵ޙ LLVM IR … ؔ ਺ ෼ ׂ

Slide 103

Slide 103 text

Coroutine Transformation Passes •CoroEarly •CoroSplit •CoroAnnotationElide •CoroElide •CoroCleanup https://llvm.org/docs/Coroutines.html#coroutine-transformation-passes LLVM 💡LLVMͰඇಉظॲཧ(ͳͲ)Λ ѻ͏࢓૊ΈΛCoroutineͱݺͿ

Slide 104

Slide 104 text

ؔ਺෼ׂ͸CoroSplitͰߦ͏ •CoroEarly •CoroSplit •CoroAnnotationElide •CoroElide •CoroCleanup https://llvm.org/docs/Coroutines.html#coroutine-transformation-passes LLVM

Slide 105

Slide 105 text

BasicBlockΛ෼ׂ Function BasicBlock … தஅInstruction … BasicBlock … BasicBlock தஅInstruction … ✂ https://github.com/swiftlang/llvm-project/blob/next/llvm/lib/Transforms/Coroutines/CoroSplit.cpp

Slide 106

Slide 106 text

ຊ೔ͷ಺༰ •SwiftίϯύΠϥ௒ೖ໳ •Swift asyncؔ਺ͷ2ͭͷಛ௃(֓ཁ) •Swift asyncؔ਺ͷ2ͭͷಛ௃(ৄࡉ)

Slide 107

Slide 107 text

৭ʑ࿩͠·͕ͨ͠

Slide 108

Slide 108 text

ࣗ෼Ͱ৮ͬͯΈΔͷ͕Ұ൪ʂ

Slide 109

Slide 109 text

https://zenn.dev/omochimetaru/articles/8a7f35c5e23a24

Slide 110

Slide 110 text

σόοάํ๏ https://github.com/swiftlang/swift/blob/main/docs/DebuggingTheCompiler.md

Slide 111

Slide 111 text

•C++Θ͔Βͳͯ͘΋࠷ॳ͸େৎ෉ •σόοάͯ͠ॲཧͷྲྀΕΛ͔ͭΉ(ೖΓޱΛݟ͚ͭΔ) •සग़ϫʔυͱུޠʹ׳ΕΔ •castʹ࿭Θ͞Εͳ͍ SwiftίϯύΠϥʹڵຯΛ࣋ͬͨํ΁

Slide 112

Slide 112 text

ݸਓతʹࢥ͍ͬͯΔ͜ͱ •SwiftશવΘ͔ΒΜʂָ͍͠ʂ •Swiftʹߩݙֶͯ͠Ϳʂ •ࠔͬͨΒॿ͚͍ͯͩ͘͞🙏

Slide 113

Slide 113 text

• Swift ίϯύΠϥͷΞʔΩςΫνϟ • SwiftίϯύΠϥ։ൃೖ໳ • ͖ͭͶ͞ΜͰ΋Θ͔ΔLLVM ~ίϯύΠϥΛࣗ࡞͢ΔͨΊͷΨΠυϒοΫ~ • SwiftͷύϑΥʔϚϯεৄࡉ • Swiftฒߦॲཧ: ෣୆ཪ • SwiftϦϙδτϦ • LLVMϦϙδτϦ(Apple͕ϑΥʔΫ͍ͯ͠Δόʔδϣϯ) • Async lowering • ෆཁͳasyncϑϨʔϜ͕࡞੒͞Εͯ͠·͏ͱ͍͏issue ࢀߟࢿྉ

Slide 114

Slide 114 text

͋Γ͕ͱ͏͍͟͝·ͨ͠ʂ