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
Swiftコンパイラ超入門+async関数の仕組み
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
[email protected]
January 18, 2025
Programming
390
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Swiftコンパイラ超入門+async関数の仕組み
2025/1/17 わいわいswiftc
[email protected]
January 18, 2025
More Decks by
[email protected]
See All by
[email protected]
TSPLのすすめ
shiz
1
360
Swift compiler 101 & How async function works
shiz
0
150
複雑さに立ち向かうための ソフトウェア開発入門
shiz
3
2.5k
座談会 「Strict ConcurrencyとSwift 6が開く新時代: 私たちはどう生きるか?」
shiz
5
17k
(非公開スライド追加)座談会 「Strict ConcurrencyとSwift 6が開く新時代: 私たちはどう生きるか?」
shiz
1
820
複雑さに立ち向かうためのコードリーディング入門
shiz
35
15k
Swift Observation
shiz
5
960
Swift Reflection
shiz
1
310
Swift Concurrency Next Step
shiz
7
9.4k
Other Decks in Programming
See All in Programming
AWS CDKのカスタムリソースでContinuum(旧Security Agent)を実装した話 | Implementing Continuum (formerly Security Agent) via AWS CDK Custom Resource
akihisaikeda
2
160
[2026-10-14](C)Re:ゼロから始める異世界生活〜始まりの終わりと終わりの始まり〜
tosite
0
150
個人開発者よ、Honoを使え(おじさんver)
tanahiro2010
2
270
AIに “答え“を書かせるのを やめてみた
___akari11
0
130
続・コーディングルールの鮮度を保ちたい / keep-fresh-go-internal-conventions-again
handlename
0
110
コードレビューのボトルネックを"する側"と"される側"の両面から解消する
yub0n
2
1.7k
ジョジョの世界をXRで再現する
mofurune
0
180
R8 の設定見直しでアプリサイズ削減
andpad
0
230
Apple Intelligenceとオンデバイス時代の到来
yahir0
0
110
AI時代のコードレビューは人に向けるな、仕組みに向けろ
texmeijin
5
3.7k
Atomic Design, Enforced: Scaling Mobile Design Systems (next.app devCon / droidCon Berlin 2026)
steliosf
PRO
0
180
最近”作らせてる” ローカルAIアプリの話
akit37
0
490
Featured
See All Featured
Gemini Prompt Engineering: Practical Techniques for Tangible AI Outcomes
mfonobong
2
590
Building Better People: How to give real-time feedback that sticks.
wjessup
371
20k
Claude Code のすすめ
schroneko
67
230k
The Mindset for Success: Future Career Progression
greggifford
PRO
0
540
The #1 spot is gone: here's how to win anyway
tamaranovitovic
4
1.2k
JAMstack: Web Apps at Ludicrous Speed - All Things Open 2022
reverentgeek
1
640
The untapped power of vector embeddings
frankvandijk
2
1.9k
Accessibility Awareness
sabderemane
1
260
How to Align SEO within the Product Triangle To Get Buy-In & Support - #RIMC
aleyda
2
1.8k
Embracing the Ebb and Flow
colly
88
5.2k
Documentation Writing (for coders)
carmenintech
77
5.6k
A Soul's Torment
seathinner
8
3.8k
Transcript
2025/01/17 Θ͍Θ͍swiftc shiz SwiftίϯύΠϥೖ asyncؔͷΈ +
ࣗݾհ •shiz(ͣ͠) X: @stzn3 GitHub: @stzn •Ԭࡏॅ iOSΤϯδχΞ ຊͷࣥච 4XJGUݴޠΨΠυͷ༁
৽ץग़͠·͢ •λΠτϧ: ετϦʔτίʔμʔ •20252݄ൃച༧ఆ •ݱ(ετϦʔτ)Ͱੜ͖ൈͨ͘Ίͷٕࣝज़ ͕٧·͍ͬͯΔ https://amzn.asia/d/dfD9BxU
ຊͷ༰ •SwiftίϯύΠϥೖ •Swift asyncؔͷ2ͭͷಛ(֓ཁ) •Swift asyncؔͷ2ͭͷಛ(ৄࡉ)
༻ͨ͠swiftlang/swiftͷtag •swift-DEVELOPMENT-SNAPSHOT-2024-12-22-a •Swift6.2
ຊͷ༰ •SwiftίϯύΠϥೖ •Swift asyncؔͷ2ͭͷಛ(֓ཁ) •Swift asyncؔͷ2ͭͷಛ(ৄࡉ)
ίϯύΠϥͱʁ
ίϯύΠϥ •ϓϩάϥϛϯάݴޠͰॻ͔ΕͨίʔυΛɺʮί ϯϐϡʔλ͕࣮ࡍʹ࣮ߦͰ͖Δܗʯʹม͢Δ ϓϩάϥϜ
ίϯύΠϥ͕ߦ͏ओͳॲཧ •ࣈ۟ղੳ: ιʔείʔυΛτʔΫϯʹղ͠ɺߏจతʹղੳ͘͢͢͠Δ •ߏจղੳ: τʔΫϯΛجʹߏจنଇΛνΣοΫ͠ɺߏΛղੳɻASTΛੜ •ҙຯղੳ: มͷܕείʔϓΛ֬ೝ͠ɺҙຯతʹਖ਼͍͔͠νΣοΫ •IRੜ: ίϯύΠϥ͕࠷దԽ͘͢͠ΔͨΊͷίʔυΛੜ •࠷దԽ:
ੑೳΛ্ͤ͞ΔͨΊʹɺIRΛΑΓૣ͘(খ͘͞)ม͢Δ •ίʔυੜ: ػցޠΛੜ͠ɺCPU͕࣮ߦՄೳͳܗࣜʹม 💡 ίϯύΠϥʹΑͬͯߦ͏͜ͱมΘΔ
ίϯύΠϥ͕ߦ͏ओͳॲཧ • ࣈ۟ղੳ: ιʔείʔυΛτʔΫϯʹղ͠ɺߏจతʹղੳ͘͢͢͠Δ • ߏจղੳ: τʔΫϯΛجʹߏจنଇΛνΣοΫ͠ɺߏΛղੳɻASTΛੜ • ҙຯղੳ:
มͷܕείʔϓΛ֬ೝ͠ɺҙຯతʹਖ਼͍͔͠νΣοΫ •IRੜ: ίϯύΠϥ͕࠷దԽ͘͢͠ΔͨΊͷίʔυΛੜ • ࠷దԽ: ੑೳΛ্ͤ͞ΔͨΊʹɺIRΛΑΓૣ͘(খ͘͞)ม͢Δ • ίʔυੜ: ػցޠΛੜ͠ɺCPU͕࣮ߦՄೳͳܗࣜʹม 💡 ίϯύΠϥʹΑͬͯߦ͏͜ͱมΘΔ
ίϯύΠϥ͕ߦ͏ओͳॲཧ •ࣈ۟ղੳ: ιʔείʔυΛτʔΫϯʹղ͠ɺίʔυΛߏจతʹղੳ͘͢͠ •ߏจղੳ: τʔΫϯΛجʹߏจنଇΛνΣοΫ͠ɺϓϩάϥϜͷߏΛղੳɻASTΛੜ •ҙຯղੳ: มͷܕείʔϓΛ֬ೝ͠ɺϓϩάϥϜ͕ҙຯతʹਖ਼͍͔͠νΣοΫ •IRੜ: ίϯύΠϥ͕࠷దԽ͘͢͠ΔͨΊͷίʔυΛੜ •࠷దԽ:
ੑೳΛ্ͤ͞ΔͨΊʹɺෆཁͳܭࢉͷআޮͷྑ͍ΞϧΰϦζϜม •ίʔυੜ: ػցޠΛੜ͠ɺCPU͕࣮ߦՄೳͳܗࣜʹม •ίʔυϦϯΫ: ιʔεϑΝΠϧϥΠϒϥϦΛ݁߹͠ɺ࠷ऴతͳ࣮ߦՄೳϑΝΠϧΛੜ 💡 શͯΛඞͣߦ͏ͱ͍͏Θ͚Ͱͳ͍
IRͱʁ •Intermediate Representation /தؒදݱ •ϓϩάϥϛϯάݴޠͷίʔυΛػցޠʹม͢ ΔաఔͰੜ͢Δதؒతͳίʔυ
IRͱʁ • Intermediate Representation /தؒදݱ • ϓϩάϥϛϯάݴޠͷίʔυΛػցޠʹม͢ΔաఔͰੜ͢Δ தؒతͳίʔυ •ͳͥඞཁʁ •
ߏ͕γϯϓϧͰίʔυΛ࠷దԽ͍͢͠ • ৭ʑͳλʔήοτͷίʔυΛੜ(e.g. Apple SiliconͷMacOS༻) • ίϯύΠϥϓϩηεͷʹΑΔ࠶ར༻ੑͱ։ൃޮ্
Swi f ίϯύΠϥʁ
SwiftίϯύΠϥͷओͳॲཧ 1. Parse(ࣈ۟ɾߏจղੳ) 2. Sema(ҙຯղੳ) 3. SILGen(IRੜ) 4.SILOptimizer(࠷దԽ) 5. IRGen(IRੜ)
6.LLVM(࠷దԽɺίʔυੜ) https://qiita.com/rintaro/items/3ad640e3938207218c20 ❶ ❷ ❸ ❹ ❺ ❻
SwiftίϯύΠϥʹ͍ͭͯΓ͚ͨΕ https://qiita.com/rintaro/items/3ad640e3938207218c20
͍͔ͭ͘ิ
SwiftίϯύΠϥͷओͳύΠϓϥΠϯ 1. Parse(ࣈ۟ɾߏจղੳ) 2. Sema(ҙຯղੳ) 3.SILGen(IRੜ) 4.SILOptimizer(࠷దԽ) 5.IRGen(IRੜ) 6.LLVM(࠷దԽɺίʔυੜ) https://qiita.com/rintaro/items/3ad640e3938207218c20
💡࣮ࡍASTͳͲͬͱଟ͘ͷIRΛੜ͍ͯ͠Δ
SILGen •SILΛੜ͢Δ •SIL: Swift Intermediate Language •SwiftͷݴޠߏΛөͨ͠IR •ܕνΣοΫSwiftಛ༗ͷ࠷దԽΛߦ͏ ϓνใ: ࠷ۙSILʹ͍ͭͯͷυΩϡϝϯτ͕ཧ͞Εͨ
IRGen •LLVM IRΛੜ͢Δ •࠷ऴతͳػցޠΛੜ͢ΔաఔͰ࠷దԽ͠ ͘͢͢ΔͨΊʹੜ͞ΕΔLLVM༻ͷIR
LLVMʁ
SwiftίϯύΠϥͷओͳύΠϓϥΠϯ 1. Parse(ࣈ۟ɾߏจղੳ) 2. Sema(ҙຯղੳ) 3. SILGen(IRੜ) 4.SILOptimizer(࠷దԽ) 5. IRGen(IRੜ)
6.LLVM(࠷దԽɺίʔυੜ) https://qiita.com/rintaro/items/3ad640e3938207218c20
LLVM •SwiftͰͳ͍ •ίϯύΠϥͷόοΫΤϯυͱݺΕΔ෦ •LLVM IR͔Β͞·͟·ͳλʔήοτͷػցޠΛੜ •λʔήοτʹԠͨ͡࠷దԽΛͯ͘͠ΕΔ •൚༻తʹΘΕ͍ͯΔ(C++ɺRustɺ ActionScript…)
LLVMʹ͍ͭͯΓ͚ͨΕ 💡ͪΐͬͱݹ͍ใ͋Δ
LLVM IR •࠷ऴతͳػցޠΛੜ͢ΔաఔͰ࠷దԽ͢͠ ͘͢ΔͨΊʹੜ͞ΕΔLLVM༻ͷIR
SILͱLLVM IR Swift SIL LLVM IR
SILͱLLVM IR Swift SIL LLVM IR string integer Array i64
i32 ptr
ຊͷ༰ •SwiftίϯύΠϥೖ •Swift asyncؔͷ2ͭͷಛ(֓ཁ) •Swift asyncؔͷ2ͭͷಛ(ৄࡉ)
ຊͷ༰ •SwiftίϯύΠϥೖ •Swift asyncؔͷ2ͭͷಛ(֓ཁ) •Swift asyncؔͷ2ͭͷಛ(ৄࡉ)
SwiftͷύϑΥʔϚϯεৄࡉ Swift asyncؔͷ2ͭͷಛ
ಛผͳελοΫʹϩʔΧϧঢ়ଶΛอ࣋ தஅϙΠϯτ(await)Ͱෳͷؔʹׂ Swift asyncؔͷ2ͭͷಛ SwiftͷύϑΥʔϚϯεৄࡉ
Swift asyncؔͷ2ͭͷಛ •ಛผͳελοΫʹϩʔΧϧঢ়ଶΛอ࣋ •தஅϙΠϯτ(await)Ͱෳͷؔʹׂ
Swift asyncؔͷ2ͭͷಛ •ಛผͳελοΫʹϩʔΧϧঢ়ଶΛอ࣋ •தஅϙΠϯτ(await)Ͱෳͷؔʹׂ
ελοΫϝϞϦ ಉظ(sync)ؔͷΈ ελοΫϝϞϦ্ͷ ίʔϧελοΫ(※) ίʔϧελοΫ func1 func2 func3 εϨου ※
ؔͷݺͼग़͠ΓΛ ཧ͢ΔελοΫ(σʔλߏ)
ิ: ελοΫ(σʔλߏ) ελοΫ ཁૉ LIFO(Last-In, First-OutʗޙೖΕઌग़͠)ͷಛੑΛ࣋ͭσʔλߏ ཁૉ ελοΫ ཁૉ ཁૉ
ޙೖΕ(Last-In) ઌग़͠(First-Out)
ิ: ελοΫ(σʔλߏ) ελοΫ ཁૉ LIFO(Last-In, First-OutʗޙೖΕઌग़͠)ͷಛੑΛ࣋ͭσʔλߏ ཁૉ ελοΫ ཁૉ ཁૉ
ޙೖΕ(Last-In) ઌग़͠(First-Out) ⚠ώʔϓϝϞϦͰελοΫ(σʔλߏ)༻Մೳ
ίʔϧελοΫ func1 func2 func3 εϨου ελοΫϑϨʔϜ Ҿ ϩʔΧϧม ؔͷΓΞυϨε ݺͼग़͠ݩͷࢀর
εϨου ಉظ(sync)ؔ syncݺͼग़͠ syncऴྃ ίʔϧελοΫ func1 func2 sync ίʔϧελοΫ func1
func2 εϨου sync ऴΘͬͨΒ ফ͑Δ
asyncؔͰߟ͑ͯΈΔ
ݺͼग़࣌͠ಉ͡ asyncݺͼग़͠ ίʔϧελοΫ func1 func2 εϨου async
ίʔϧελοΫ func1 func2 εϨου async தஅ࣌ʹऔΓग़͢ඞཁ͕͋Δ asyncݺͼग़͠ await ίʔϧελοΫ func1
func2 εϨου async async ফ͑Δ… ͍ͬͯΔؒʹ ଞͷॲཧΛ͍ͤͨ͞
ίʔϧελοΫ func1 func2 εϨου async ࠶։࣌ʹ·ͨඞཁ asyncݺͼग़͠ ίʔϧελοΫ func1 func2
εϨου async ίʔϧελοΫ func1 func2 func3 εϨου ࠶։࣌ async Ͳ͏͠Α͏… await ⚠ಉ͡εϨουͱ ݶΒͳ͍
ͦ͜Ͱ
ಛผͳελοΫʹ ϩʔΧϧঢ়ଶΛอ࣋ 💡͜͜Ͱݴ͏ελοΫσʔλߏͷ
async ώʔϓϝϞϦ ελοΫϝϞϦ Ұ෦ΛผͷελοΫʹୀආ εϨου func1 func2 async ίʔϧελοΫ ελοΫ
ώʔϓϝϞϦ্ͷ ελοΫ
࠶։ޙʹඞཁͳใͷΈ async ελοΫ ίʔϧελοΫ async a b
async ελοΫ ίʔϧελοΫ async asyncϑϨʔϜ தஅ(await)લ·Ͱ͔͠ Θͳ͍ใ ࠶։ޙʹඞཁͳใ
ελοΫϝϞϦ ࠶։࣌ʹίʔϧελοΫʹ͢ ελοΫ εϨου ⚠ผεϨου ͷՄೳੑ͋Γ ώʔϓϝϞϦ func4 func5 async
ίʔϧελοΫ
Task Task͕ඇಉظॲཧΛཧ
Task TaskAllocatorͰϝϞϦཧ TaskAllocator
ώʔϓϝϞϦ ใΛ֨ೲ͢ΔϝϞϦΛ֬อ Task TaskAllocator ϝϞϦྖҬ 💡Taskͷ࡞࣌ʹߦ͍ͬͯΔ Task TaskAllocator ϝϞϦྖҬ
ώʔϓϝϞϦ Task TaskAllocator ϝϞϦྖҬ Task TaskAllocator ϝϞϦྖҬ async ඞཁʹԠͯ͡ϝϞϦׂΓͯ
ώʔϓϝϞϦ Task TaskAllocator ϝϞϦྖҬ async ϝϞϦྖҬ Γͳ͚ΕՃ
ώʔϓϝϞϦ Task TaskAllocator ϝϞϦྖҬ async ϝϞϦྖҬ Γͳ͚ΕՃ Stack discipline +
Bump pointer allocation Slab ࿈ଓͨ͠ϝϞϦྖҬ ޮతʹϝϞϦΛׂΓͯΔͨΊͷΈ StackAllocatorͷ࣮(TaskAllocatortypealiasΈ͍ͨͳͷ)
ώʔϓϝϞϦ Task ޮԽͷ TaskAllocator ϝϞϦྖҬ async StackAllocatorͷ࣮(TaskAllocatortypealiasΈ͍ͨͳͷ) Slab ࿈ଓͨ͠ϝϞϦྖҬ Stack
discipline + Bump pointer allocation ޮతʹϝϞϦΛׂΓͯΔͨΊͷΈ
Swift asyncؔͷ2ͭͷಛ •ಛผͳελοΫʹϩʔΧϧঢ়ଶΛอ࣋ •தஅϙΠϯτ(await)Ͱෳͷؔʹׂ
Swift asyncؔͷ2ͭͷಛ •ಛผͳελοΫʹϩʔΧϧঢ়ଶΛอ࣋ •தஅϙΠϯτ(await)Ͱෳͷؔʹׂ
ؔΛׂʁʁʁ Ͳ͏͍͏͜ͱʁ
awaitͰؔΛׂͤ͞Δ 💡ͦΕͧΕΛ෦ؔͱݺͿ hoge1 hoge2
ิ: rampؔ&resumeؔ •rampؔ: ࠷ॳͷawait·Ͱ࣮ߦ •resumeؔ: awaitҎ߱ͷॲཧΛ࣮ߦ
hoge1 hoge2 resumeؔawait͝ͱʹ࡞ hoge3
hoge1 ࠶։࣌ʹawaitҎ߱ͷॲཧΛݺͼग़͢ await hoge2 https://github.com/swiftlang/swift/blob/main/docs/SIL/Types.md#async-functions asyncϑϨʔϜ ࠶։ޙͷॲཧ
hoge1 ࠶։࣌ʹawaitҎ߱ͷॲཧΛݺͼग़͢ await hoge2 https://github.com/swiftlang/swift/blob/main/docs/SIL/Types.md#async-functions asyncϑϨʔϜ ࠶։ޙͷॲཧ 💡͜ͷதஅͯ͠࠶։͢ΔΈΛ ContinuationͱݺͿ 💡ίʔϧελοΫ্Ͱ
Ͳ͔͜Β࣮ߦ͢ΕΑ͍͔ͷใ
͞Βʹ2ͭͷಛ •ඌ࠶ؼ(tail call) •AsyncContext
͞Βʹ2ͭͷಛ •ඌ࠶ؼ(tail call) •AsyncContext
hoge1 await await hoge2 asyncϑϨʔϜ ࠶։ޙͷॲཧ ؔϙΠϯλ ΞυϨεΛ͢
hoge1 ॲཧ͕ऴΘͬͨΒݺͼग़͢ await await hoge2 asyncϑϨʔϜ ࠶։ޙͷॲཧ 💡ඌ࠶ؼ(tail call)ͱ͍͏ख๏Λ͍ͬͯΔ ؔϙΠϯλ
ݺͼग़͠
hoge1 ඌ࠶ؼ(tail call) await await hoge2 asyncϑϨʔϜ ࠶։ޙͷॲཧ 💡ελοΫΛΘͳͯ͘ࡁΉ(ϝϞϦ࠷దԽ) ؔϙΠϯλ
ݺͼग़͠
͞Βʹ2ͭͷಛ •ඌ࠶ؼ(tail call) •AsyncContext
Task Taskશମͷใ asyncϑϨʔϜ asyncϑϨʔϜ asyncϑϨʔϜ 1ͭͷඇಉظؔͷใ AsyncContext
hoge1 await hoge2 asyncϑϨʔϜ ࠶։ޙͷॲཧ AsyncContext ϙΠϯλ AsyncContextͷϙΠϯλΛ࣋ͪճΔ ϙΠϯλܦ༝Ͱ ඞཁͳใΛऔಘ
AsyncContext ϙΠϯλ AsyncContext ϙΠϯλ
ׂؔ Ͳ͜ͰߦͬͯΔͷ͔ʁ
ׂؔLLVM͕ߦ͍ͬͯΔ 1. Parse(ࣈ۟ɾߏจղੳ) 2. Sema(ҙຯղੳ) 3. SILGen(IRੜ) 4. SILOptimizer(࠷దԽ) 5.
IRGen(IRੜ) 6.LLVM(࠷దԽɺίʔυੜ) https://qiita.com/rintaro/items/3ad640e3938207218c20 ͜͜
Async lowering https://llvm.org/docs/Coroutines.html#async-lowering
ݩʑSwi f ͷͨΊʹ Ճ࣮ͨ͠
Swi f ༻ͷ࣮ͳͥඞཁͩͬͨʁ •ΦʔόʔϔουΛ࠷খݶʹ͑ΔͨΊ • ෆཁͳॲཧͷলུ എܠ: ݩʑC++ʹద࣮ͨ͠ & SwiftͰͷΘΕํ͕ҟͳΔ(ྫ:
forϧʔϓ) • Swiftଆʹ͓͚Δߴͳ࠷దԽΛॏࢹ • Swiftಠࣗͷݺͼग़͠نʹରԠ • কདྷతͳݴޠػೳͷ֦ுʹରԠ • ݺͼग़͠ଆʹΑΔॊೈͳϝϞϦཧ(Task͕࢘ྩౝ)
Coroutine Representations and ABIs in LLVM
⚠ Returned-Continuation Lowering → Async Lowering LLVMͷϓϩϙʔβϧ
ຊͷ༰ •SwiftίϯύΠϥೖ •Swift asyncؔͷ2ͭͷಛ(֓ཁ) •Swift asyncؔͷ2ͭͷಛ(ৄࡉ)
ຊͷ༰ •SwiftίϯύΠϥೖ •Swift asyncؔͷ2ͭͷಛ(֓ཁ) •Swift asyncؔͷ2ͭͷಛ(ৄࡉ)
͍͍ͩͨLLVMͷ
LLVM IRೖ
Module LLVM IRͷߏ Function BasicBlock(BB) Instruction ϓϩάϥϜશମΛཧ͢Δίϯςφ 1ͭͷϓϩάϥϜɻ͍ΘΏΔؔ ॱ൪ʹ࣮ߦ͢Δ໋ྩͷϦετ Ϛγϯͷ࣮ࡍͷ໋ྩ
Function Function Module ͜ΜͳΠϝʔδ if … else BasicBlock Instruction Instruction
… BasicBlock Instruction Instruction … if … else BasicBlock Instruction Instruction … BasicBlock Instruction Instruction …
Swift asyncؔͷ2ͭͷಛ •ಛผͳελοΫʹϩʔΧϧঢ়ଶΛอ࣋ •தஅϙΠϯτ(await)Ͱෳͷؔʹׂ
࠶։ޙʹඞཁͳใͷΈอ࣋ ώʔϓϝϞϦ ελοΫ async value
Ͳ͏ͬͯඞཁ͔Ͳ͏͔Λ அ͍ͯ͠Δʁ
•ͯ͢ͷʢมɺఆɺؔɺ໋ྩͳͲʣͷ ڞ௨ͷΫϥε •͜ͷΛ༻͍ͯ͠ΔଞͷValueͷϦετ (UseList)Λอ࣋ = def-use chain Value Ϋϥε https://llvm.org/doxygen/classllvm_1_1Value.html
LLVM
•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
BasicBlock Value ԿΛ͍ͯ͠Δʁ UseList BasicBlock Value BasicBlock Value BasicBlock Value
… LLVM SuspendCrossingInfo ׂؔޙʹ ͕BasicBlockΛൺֱ ͍͑ͯΔʁ
͜ΕͰෆཁͳϝϞϦΛ Θͳͯ͘ࡁΉ
…͚ͣͩͲ
όά͕͋ΔΒ͍͠ https://github.com/swiftlang/swift/issues/72289
ṖͷasyncϑϨʔϜ… ԿதஅϙΠϯτΛ͑ͳ͍ asyncϑϨʔϜ͕࡞ΒΕ͍ͯΔ ͷʹ https://github.com/swiftlang/swift/issues/72289
ݪҼߟ 💡Spillsʹؚ͕·Ε͍ͯΔͱ ϝϞϦΛ֬อ͠ͳΕͳΒͳ͍ swift_task_alloc(※)͕ݺΕ͍ͯΔ͜ͱ͕ݪҼʁ ※ AsyncContextʹಈతͳαΠζ͕ඞཁͳ߹ʹݺΕΔ https://github.com/swiftlang/swift/issues/72289
ݪҼߟ asyncؔશ෦͜ΕΛ ݺͿΑ͏ʹͳ͍ͬͯΔ = AsyncContextͷsize͕ staticʹܾ·Βͳ͍ https://github.com/swiftlang/swift/blob/main/lib/IRGen/GenCall.cpp#L166 https://github.com/swiftlang/swift/issues/72289
•͜ͷೝࣝͰ߹͍ͬͯΔͷ͔ʁ •Ͳ͏ղܾ͢Δ͔ʁ •தஅϙΠϯτΛ͑ͳ͍߹staticͳ AsyncContextSizeΛ͢ʁ(Ͳ͏ఆ͢Δʁ) •LLVMଆͰswift_task_allocΛফ͢ʁ Μʙ… https://github.com/swiftlang/swift/issues/72289
ͦΕ͓͖ͯ͞
Swift asyncؔͷ2ͭͷಛ •ಛผͳελοΫʹϩʔΧϧঢ়ଶΛอ࣋ •தஅϙΠϯτ(await)Ͱෳͷؔʹׂ
LLVMʹ͓͚Δίʔυͷ࠷దԽ มલ LLVM IR มޙ LLVM IR
ෳͷPassʹΑΔ࠷దԽ มલ LLVM IR Pass Pass มޙ LLVM IR …
ղੳ/ ࠷దԽ
ׂؔͦͷ1ͭ มલ LLVM IR Pass Pass มޙ LLVM IR …
ؔ ׂ
Coroutine Transformation Passes •CoroEarly •CoroSplit •CoroAnnotationElide •CoroElide •CoroCleanup https://llvm.org/docs/Coroutines.html#coroutine-transformation-passes LLVM
💡LLVMͰඇಉظॲཧ(ͳͲ)Λ ѻ͏ΈΛCoroutineͱݺͿ
ׂؔCoroSplitͰߦ͏ •CoroEarly •CoroSplit •CoroAnnotationElide •CoroElide •CoroCleanup https://llvm.org/docs/Coroutines.html#coroutine-transformation-passes LLVM
BasicBlockΛׂ Function BasicBlock … தஅInstruction … BasicBlock … BasicBlock தஅInstruction
… ✂ https://github.com/swiftlang/llvm-project/blob/next/llvm/lib/Transforms/Coroutines/CoroSplit.cpp
ຊͷ༰ •SwiftίϯύΠϥೖ •Swift asyncؔͷ2ͭͷಛ(֓ཁ) •Swift asyncؔͷ2ͭͷಛ(ৄࡉ)
৭ʑ͠·͕ͨ͠
ࣗͰ৮ͬͯΈΔͷ͕Ұ൪ʂ
https://zenn.dev/omochimetaru/articles/8a7f35c5e23a24
σόοάํ๏ https://github.com/swiftlang/swift/blob/main/docs/DebuggingTheCompiler.md
•C++Θ͔Βͳͯ͘࠷ॳେৎ •σόοάͯ͠ॲཧͷྲྀΕΛ͔ͭΉ(ೖΓޱΛݟ͚ͭΔ) •සग़ϫʔυͱུޠʹ׳ΕΔ •castʹΘ͞Εͳ͍ SwiftίϯύΠϥʹڵຯΛ࣋ͬͨํ
ݸਓతʹࢥ͍ͬͯΔ͜ͱ •SwiftશવΘ͔ΒΜʂָ͍͠ʂ •Swiftʹߩݙֶͯ͠Ϳʂ •ࠔͬͨΒॿ͚͍ͯͩ͘͞🙏
• Swift ίϯύΠϥͷΞʔΩςΫνϟ • SwiftίϯύΠϥ։ൃೖ • ͖ͭͶ͞ΜͰΘ͔ΔLLVM ~ίϯύΠϥΛࣗ࡞͢ΔͨΊͷΨΠυϒοΫ~ • SwiftͷύϑΥʔϚϯεৄࡉ
• Swiftฒߦॲཧ: ཪ • SwiftϦϙδτϦ • LLVMϦϙδτϦ(Apple͕ϑΥʔΫ͍ͯ͠Δόʔδϣϯ) • Async lowering • ෆཁͳasyncϑϨʔϜ͕࡞͞Εͯ͠·͏ͱ͍͏issue ࢀߟࢿྉ
͋Γ͕ͱ͏͍͟͝·ͨ͠ʂ