Upgrade to Pro — share decks privately, control downloads, hide ads and more …

社内版SwiftコンパイラにContributeするまで

freddi(Yuki Aki)
October 09, 2020
37

 社内版SwiftコンパイラにContributeするまで

freddi(Yuki Aki)

October 09, 2020
Tweet

Transcript

  1. SwiftίϯύΠϥʹContribute͢Δ·Ͱ
    freddi (LINE Fukuoka)
    Engineer Casual Meetup - Oct. 9 2020

    View Slide

  2. Agenda
    • Contributeͨ͠಺༰ ͷ͸ͳ͠

    • Swift ͷίϯύΠϧϑϩʔ ͷ͸ͳ͠

    • Swift Intermediate Language ͷ͸ͳ͠

    • SILOptimizer ʹ͍ͭͯ

    • (͋ΒͨΊͯ) Contributeͨ͠಺༰ ͷ͸ͳ͠

    View Slide

  3. Agenda
    • Contributeͨ͠಺༰ ͷ͸ͳ͠

    • Swift ͷίϯύΠϧϑϩʔ ͷ͸ͳ͠

    • Swift Intermediate Language ͷ͸ͳ͠

    • SILOptimizer ʹ͍ͭͯ

    • (͋ΒͨΊͯ) Contributeͨ͠಺༰ ͷ͸ͳ͠
    ๻ͷೖ໳ϑϩʔ

    View Slide

  4. Contributeͨ͠಺༰ ͷ͸ͳ͠
    • ̎ͭ Contribute ͨ͠

    • https://github.com/apple/swift/pull/33851

    • ࠷దԽϩδοΫͷϛε

    • https://github.com/apple/swift/pull/31847

    • Docs ͷ BNF Ͱॻ͔Εͨ Grammer ͷϛε

    View Slide

  5. Contributeͨ͠಺༰ ͷ͸ͳ͠
    • https://github.com/apple/swift/pull/33851

    • ࠷దԽϩδοΫͷϛε

    • ʮ෭࡞༻͕͋Δ͔΋஌Εͳ͍ʯϩδοΫͷݕग़ϛε

    • Ұ෦ڧ੍Ϋϥογϡ͕ʮ෭࡞༻ͳ͠ʯʹͳΔϛε

    • ࠷దԽϩδοΫ͕ҙਤͨ͠ͷͰ͸ͳ͘ͳΔՄೳੑ

    View Slide

  6. Contributeͨ͠಺༰ ͷ͸ͳ͠

    View Slide

  7. Contributeͨ͠಺༰ ͷ͸ͳ͠
    • https://github.com/apple/swift/pull/31847

    • υΩϡϝϯτͰղઆ͍ͯ͠Δ Grammer ͷϛε

    • ࣗ෼͕ಡΜͩ SIL ͷίʔυ ͱҧ͏͔Βؾ͍ͮͨ

    • SIL ͷυΩϡϝϯτ͸ͨ·ʹΨόΨό

    View Slide

  8. Contributeͨ͠಺༰ ͷ͸ͳ͠
    • https://github.com/apple/swift/pull/33851

    • ࠷దԽϩδοΫͷϛε ← ࠓ೔͸ͬͪ͜ͷ࿩

    • ͜ͷ มߋͷཧղΛ௨ͯ͡SwiftίϯύΠϥʹೖ໳͢Δ

    View Slide

  9. Swift ͷίϯύΠϧϑϩʔ ͷ͸ͳ͠
    • Swift ͸͜ΜͳϑϩʔͰίϯύΠϧ͞ΕΔ

    • Swift ίϯύΠϥ΍Δͱ਌ͷإΑΓݟΔ͜ͱʹͳΔ

    View Slide

  10. Swift ͷίϯύΠϧϑϩʔ ͷ͸ͳ͠
    • օ͞Μ͓ͳ͡Έ Swift ίʔυ

    View Slide

  11. Swift ͷίϯύΠϧϑϩʔ ͷ͸ͳ͠
    • AST (ந৅ߏจ໦)

    • ϓϩάϥϜΛจ๏ͷߏ଄ʹ฿ͬͨ໦ߏ଄ʹͨ͠΋ͷ

    View Slide

  12. Swift ͷίϯύΠϧϑϩʔ ͷ͸ͳ͠
    • AST (ந৅ߏจ໦)

    • ԋࢉࢠͷ༏ઌ౓ͱ͔΋ߏจ໦ͷߏ଄Ͱܾ·ͬͨΓ

    View Slide

  13. Swift ͷίϯύΠϧϑϩʔ ͷ͸ͳ͠
    • SIL (Swift Intermediate Language)

    • Swift ಛ༗ͷந৅දݱ

    View Slide

  14. Swift ͷίϯύΠϧϑϩʔ ͷ͸ͳ͠
    • SIL (Swift Intermediate Language)

    • ͜͜ͰSwiftಛ༗ͷ ࠷దԽ౳͕ߦΘΕΔ

    • ࠓ೔ͷTopic

    View Slide

  15. Swift ͷίϯύΠϧϑϩʔ ͷ͸ͳ͠
    • LLVM IR => …

    • SIL Λ LLVM IR ʹ௚ͯ͠LLVM ʹ౤͛Δ

    • ͦͷ͋ͱϦϯΧʹ౤͛ΒΕͨΓ

    • όΠφϦ౳ʹͳΔ

    View Slide

  16. Swift Intermediate Language ͷ͸ͳ͠
    • Swift ಛ༗ͷதؒදݱ

    • ͜͜Ͱ Swiftಛ༗ͷ࠷దԽ͕ߦΘΕΔ

    View Slide

  17. Swift Intermediate Language ͷ͸ͳ͠
    • ͲͪΒ΋खݩʹ swiftc ίϚϯυ͕͋Ε͹ੜ੒Մೳ

    View Slide

  18. Swift Intermediate Language ͷ͸ͳ͠
    • ࢼ͠ʹ hello world! Λ SIL Ͱ ੜ੒ͯ͠ΈΔ

    • ࠓճ͸͕࣌ؒͳ͍ͷͰ raw SIL ͚ͩ

    View Slide

  19. Swift Intermediate Language ͷ͸ͳ͠
    • ௕͍ɾಡΈͮΒ͍ʢʁʣ

    View Slide

  20. Swift Intermediate Language ͷ͸ͳ͠
    • SIL͕swiftίʔυΑΓ௕͘ͳΔཧ༝

    • ؔ਺ʢԾ૝ʣςʔϒϧͷ৘ใ

    • ࡉ͔͍ϝϞϦͷ֬อ΍ϦϑΝϨϯεΧ΢ϯτͷ໋ྩ

    • Main ؔ਺ͳͲͷల։

    View Slide

  21. Swift Intermediate Language ͷ͸ͳ͠
    • SIL ͷߏ଄Λେ͖͍ॱʹ

    • SILModule (ιʔείʔυશମ)

    • SILFunction (֤ؔ਺)

    • SILBasicBlock (͍ΘΏΔείʔϓ)

    • SILInstruction (SILίʔυҰจҰจ)

    View Slide

  22. Swift Intermediate Language ͷ͸ͳ͠
    • ͍͍ͩͨ͜ΕΒΛཧղ͢ΔͱSIL͸ͬ͘͟ΓಡΊΔ

    • SIL͕swiftίʔυΑΓ௕͘ͳΔཧ༝

    • SIL ͷߏ଄ͷॱং

    View Slide

  23. Swift Intermediate Language ͷ͸ͳ͠
    • SILModule

    View Slide

  24. SILFunction

    View Slide

  25. SILBasicBlock

    View Slide

  26. SILBasicBlock

    View Slide

  27. SILBasicBlock
    Α͘ΈͨΒ bb0: ͬͯͳ͍ͬͯΔ
    -> basic block ͷུͰ͢
    ৚݅෼ذ౳ͰBasic Block͸૿͑Δ

    View Slide

  28. SILInstruction

    View Slide

  29. Swift Intermediate Language ͷ͸ͳ͠
    • ͜ͷߏ଄Λ஌͍ͬͯΔͱίϯύΠϥͷίʔυͷҰ෦͕

    ಡΊΔΑ͏ʹͳΔ

    • ͦΕ͕ SILOptimizer ͷίʔυ

    View Slide

  30. SILOptimizer ʹ͍ͭͯ
    • SIL (Swift Intermediate Language)

    • ͜͜ͰSwiftಛ༗ͷ ࠷దԽ౳͕ߦΘΕΔ

    View Slide

  31. SILOptimizer ʹ͍ͭͯ

    View Slide

  32. SILOptimizer ʹ͍ͭͯ

    View Slide

  33. SILOptimizer ʹ͍ͭͯ
    • raw SIL ੜ੒ޙɺSILOptimizer ʹΑͬͯ࠷దԽ͞ΕΔ

    • SILOptimizerதͷͨ͘͞Μ͋ΔPassͱ͍͏ϞδϡʔϧͰ
    ͦΕͧΕͷ໨తͷ࠷దԽ͕ߦΘΕΔ

    • ࠓ೔͸ͦͷPassͷίʔυΛಡΉ

    • Passͷίʔυͷجૅ͕٧·͍ͬͯΔ

    View Slide

  34. SILOptimizer ʹ͍ͭͯ
    • ࠓ೔͸ AssumeSingleThreaded ΛಡΉ

    • γϯάϧεϨου͚ͩͰಈ͔͞ΕΔͷʹಛԽ͢ΔΑ͏ʹ
    ͢Δ࠷దԽ

    • ΦϓγϣϯͰൃಈ͞ΕΔ

    • PassͷதͰଟ෼Ұ൪୹͍

    View Slide

  35. SILOptimizer ʹ͍ͭͯ

    View Slide

  36. SILOptimizer ʹ͍ͭͯ
    SILFunctionTransform Λܧঝ
    -> FuncitonΛ૸ࠪ͢ΔPassʹͳΔ

    View Slide

  37. SILOptimizer ʹ͍ͭͯ
    Ծ૝ؔ਺ run Λ࣮૷
    -> Pass ͷ࠷దԽϩδοΫ͸͜͜ʹॻ͘

    View Slide

  38. SILOptimizer ʹ͍ͭͯ
    ίϯύΠϥͷυϥΠόʢίϚϯυʣʹ౉͞ΕͨΦϓγϣϯΛΈΔ

    View Slide

  39. SILOptimizer ʹ͍ͭͯ
    ࠓݟ͍ͯΔؔ਺ΛSILFunctionܕͷ
    σʔλͱͯ͠ड͚औΔ

    View Slide

  40. SILOptimizer ʹ͍ͭͯ
    SILFunction͸SILBasicBlockͷCollection
    ͱͯ͠ѻ͑ΔʢͳͷͰBBʣ

    View Slide

  41. SILOptimizer ʹ͍ͭͯ
    SILBasicBlock͸SILInstructionͷCollection
    ͱͯ͠ѻ͑ΔʢͳͷͰIʣ

    View Slide

  42. SILOptimizer ʹ͍ͭͯ
    ͳͷͰɺ͜͜Ͱ͸ؔ਺಺ͷ
    InstructionΛ૸͍ࠪͯ͠Δ

    View Slide

  43. SILOptimizer ʹ͍ͭͯ
    ֤Instruction͸ܕͰදݱ͞Ε͍ͯΔ
    ΩϟετͰಛఆͷInstruction͔ௐ΂Δ

    View Slide

  44. SILOptimizer ʹ͍ͭͯ
    ϦϑΝϨϯεΧ΢ϯλؔ܎ͷInscrutionͳΒ
    NonAtomicʹ͢Δ

    View Slide

  45. SILOptimizer ʹ͍ͭͯ
    • AssumeSingleThreaded ʹ͍ͭͯ

    • Function಺ͷInstructionΛ૸ࠪ

    • ϦϑΝϨϯεΧ΢ϯλؔ܎ͩͬͨΒnon Atomicʹ͢Δ

    View Slide

  46. SILOptimizer ʹ͍ͭͯ
    • SILOptimizer ͷίʔυΛಡΉͱ͖ͷTips

    • ུޠ͕ଟ͍ͷͰίϯςΫετͰ൑அ͢Δ

    • ෳࡶͳϩδοΫ͸ C++ Λཧղ͔ͯ͠ΒಡΉ

    View Slide

  47. Contributeͨ͠಺༰ ͷ͸ͳ͠
    • ࠓճ௚ͨ͠ͷ͸ɺmayHaveSideEffect ͱ͍͏ؔ਺

    • ʮ෭࡞༻͕͋Δ͔΋஌Εͳ͍ʯInstructionΛݟΔ

    • SILInstruction ܕͷ ϝϯόม਺

    • Dead Code Elimination౳ʹ࢖ΘΕΔ

    View Slide

  48. Contributeͨ͠಺༰ ͷ͸ͳ͠
    • ͜ͷ৚݅ͷ̍൪໨͕ϛε͍ͬͯͨ(mayTrap ؔ਺)

    View Slide

  49. Contributeͨ͠಺༰ ͷ͸ͳ͠

    View Slide

  50. Contributeͨ͠಺༰ ͷ͸ͳ͠
    • ίϯύΠϥ಺ͷInstructionͷछྨͷදݱํ๏

    • ઌఔਃ্͛ͨ͠ܕʹΑΔදݱʢΩϟετʹΑΔ൑ผʣ

    • Enum ʹΑΔදݱʢswitch ͳͲ ʹΑΔ൑ผʣ

    • मਖ਼Օॴ͸ͬͪ͜Ͱදݱ͞Ε͍ͯΔ

    View Slide

  51. Contributeͨ͠಺༰ ͷ͸ͳ͠
    • ͪΐͬͱ̎൪Ίͷ঺հ

    View Slide

  52. Contributeͨ͠಺༰ ͷ͸ͳ͠
    • ϝϞϦΞΫηε͕ى͜Γͦ͏ͳInstructionͷݕ஌ํ๏

    • SILInstruction ͷଐੑΛݟΔ

    • LLVMͷInstruction ͷଐੑΛݟΔ

    • apply Instruction ͳΒݺͼग़͠ઌͷؔ਺ͷଐੑΛݟΔ

    • ͜͜Β΁Μͷॲཧ͸ͯͯ͝͝ͷXϚΫϩ͕ೖͬͨॲཧͳͷ
    ͰׂѪɻڵຯ͕͋ͬͨΒ࣭໰Ͱฉ͍͍ͯͩ͘͞

    View Slide

  53. Contributeͨ͠಺༰ ͷ͸ͳ͠

    View Slide

  54. Contributeͨ͠಺༰ ͷ͸ͳ͠

    View Slide

  55. Contributeͨ͠಺༰ ͷ͸ͳ͠
    • ΋͏গ͠஌Γ͍ͨํ͸ Θ͍Θ͍swiftc #20 ͷ๻ͷࢿྉΛݟ͍ͯͩ͘͞ 







    • 



    https://speakerdeck.com/freddi/mayhavesideeffect

    View Slide

  56. Contributeͨ͠಺༰ ͷ͸ͳ͠
    • ͜ͷमਖ਼ՕॴͳΜͰݟ͚ͭͨͷʁ

    • झຯͰίϯύΠϥίʔυಡΜͰ͍ͨΒۮવΈ͚ͭͨ

    • bug.swift.orgͰόάνέοτʹ͸ͳ͔ͬͨ

    View Slide

  57. Contributeͨ͠಺༰ ͷ͸ͳ͠
    • PRग़ͨ͠ΒɺTest ॻ͍ͨΒϚʔδ͢ΔͱݴΘΕͨ

    • SILͷςετ΋ LLVMͷlitΛ࢖͍ͬͯΔΒ͍͠

    • LLVM Integrated Tester ͷུ

    • ͦΜͳ͜ΜͳͰϚʔδ͞Εͨ

    • ΂ͭʹόάνέοτΛ੾Δඞཁ͸ͳ͍Β͍͠

    View Slide

  58. Contributeͨ͠಺༰ ͷ͸ͳ͠
    • SIL.rst ͱ͍͏υΩϡϝϯτ͕SILʹ͍ͭͯৄ͘͠هࡌ

    • https://github.com/apple/swift/blob/main/docs/SIL.rst

    • ͨͩ͠ɺSIL.rst ͸ΨόΨόͳͷͰContributeνϟϯε͕

    ͨ͘͞Μ͋Δ

    • ͜͜΋मਖ਼Λ౤͛ͨ͜ͱ͕͋Δ

    View Slide

  59. ·ͱΊ
    • SILΛಡΈ͸͡ΊΔͱίϯύΠϥೖ໳΍Γ΍͍͢

    • SIL͕ಡΊΔͱ࠷దԽͷίʔυ͕ಡΊΔΑ͏ʹͳΔ

    • Contributeʹؔͯ͠΋ݫ͍͠ϧʔϧ͸ͳ͍ͷͰ

    ؾܰʹͰ͖Δ

    • ಛʹυΩϡϝϯτΨόΨόͳͷͰContributeͯ͠ΈΑ͏

    View Slide