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
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
[email protected]
January 18, 2025
Programming
380
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
340
Swift compiler 101 & How async function works
shiz
0
130
複雑さに立ち向かうための ソフトウェア開発入門
shiz
3
2.4k
座談会 「Strict ConcurrencyとSwift 6が開く新時代: 私たちはどう生きるか?」
shiz
5
17k
(非公開スライド追加)座談会 「Strict ConcurrencyとSwift 6が開く新時代: 私たちはどう生きるか?」
shiz
1
800
複雑さに立ち向かうためのコードリーディング入門
shiz
35
15k
Swift Observation
shiz
5
950
Swift Reflection
shiz
1
310
Swift Concurrency Next Step
shiz
7
9.3k
Other Decks in Programming
See All in Programming
Go × SIMDで高速化するベクトル検索 ~ルーフラインモデルでSIMDが効く境界を探れ! ~
po3rin
1
170
From 6 People Classroom Meetup to 100 People Regional Conference / FOSS4G Hiroshima 2026
furukawayasuto
0
120
PyConJP2026_wat_Python × Signal Processing: How to Draw Pictures with Sound Using Spectrogram Art
wat
0
680
[DroidKaigi 2026] Bring your own phones to Gradle Managed Devices
f2lk
0
110
PHPプロジェクトの結合バランスを可視化する #php_night
kajitack
0
230
週末にAI-DLCを本気で回したら$1,600溶けた
hbashimizu
0
130
GraphRAGのKnowledge Graphを 直接!見る/View-GraphRAG's-KnowledgeGraph-directly!
tyumugi1113
1
270
Press start. Python's next generation.
willingc
PRO
3
320
GKE で Pod の見方を変えたら、スケールアウト時の挙動を真に捉えられた話
stkk
0
100
FastAPI の並行処理モデルを完全に理解する
hoto17296
9
3.8k
ALB ログから Trace を気合で繋げる技術
fohte
7
880
変化を抱擁するドキュメントの作り方 - ビジネスルール駆動開発がもたらす、コードとの新しい関係
ioki
2
130
Featured
See All Featured
The SEO Collaboration Effect
kristinabergwall1
1
550
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.8k
16th Malabo Montpellier Forum Presentation
akademiya2063
PRO
0
370
Agile Leadership in an Agile Organization
kimpetersen
PRO
0
230
Between Models and Reality
mayunak
4
450
Stewardship and Sustainability of Urban and Community Forests
pwiseman
0
520
Ten Tips & Tricks for a 🌱 transition
stuffmc
0
210
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
49
10k
Done Done
chrislema
186
16k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
123
22k
Bootstrapping a Software Product
garrettdimon
PRO
306
120k
End of SEO as We Know It (SMX Advanced Version)
ipullrank
3
4.4k
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 ࢀߟࢿྉ
͋Γ͕ͱ͏͍͟͝·ͨ͠ʂ