$30 off During Our Annual Pro Sale. View Details »

理論から入門するswift/lib/Sema - わいわいswiftc #1

ukitaka
March 30, 2018

理論から入門するswift/lib/Sema - わいわいswiftc #1

https://iosdiscord.connpass.com/event/82436/
での発表資料です。

ukitaka

March 30, 2018
Tweet

More Decks by ukitaka

Other Decks in Programming

Transcript

  1. ཧ࿦͔Βೖ໳͢Δ
    swift/lib/Sema
    Θ͍Θ͍swiftc #1
    @ukitaka

    View Slide

  2. twitter: @ukitaka_
    github: @ukitaka
    Yuki Takahashi

    View Slide

  3. ࣗݾ঺հ
    ❤ ؔ਺ܕϓϩάϥϛϯάɺDDD
    ✏ ܕγεςϜɺίϯύΠϥ
    ௿ϨΠϠʔ

    View Slide

  4. ϒϩάॻ͍ͯΔ
    https://blog.waft.me

    View Slide

  5. ษڧ͕ͯΒ࡞ͬͨ΋ͷ
    • SwiftͰܕγεςϜ / ܕਪ࿦Λॻ͍ͯΈͨΓ
    • ukitaka/TypeSystems
    • ukitaka/AlgorithmW.swift
    • SILOptimizerΛࣗ࡞ͯ͠ΈͨΓ
    • ukitaka/sil-opt-scala

    View Slide

  6. contribute͸…

    View Slide

  7. ࣗݾ঺հऴΘΓ

    View Slide

  8. ࠓ೔ͷ࿩

    View Slide

  9. swift/lib/Sema

    View Slide

  10. swift/lib/Sema
    • Sema = Semantic Analysis (ҙຯղੳ)
    • ओʹܕਪ࿦ɾܕݕࠪΛ୲౰͢ΔϞδϡʔϧ
    • ίʔυྔҰ൪ଟ͍
    • ΊͪΌΊͪΌෳࡶ

    View Slide

  11. ܕͷ࿩ָͦ͠͏…Ͱ΋
    Ͳ͔͜ΒखΛ෇͚Α͏…

    View Slide

  12. swift/lib/Sema
    • ෳࡶʹབྷΈ߹ͬͯ͸͍Δ͕ɺ͍͔ͭ͘ͷτϐο
    Ϋͷू·Γɻͦͯ͠୯ମͰݟΔͱཧ࿦௨Γ࣮
    ૷͞Ε͍ͯΔ৔߹͕ଟ͍ɻ
    • ֓೦Λ஌͍ͬͯΔ͚ͩͰ΋͍ͩͿೖΓ΍͍͢
    • ͳͷͰ… ʮཧ࿦͔Βೖ໳͢Δʯ

    View Slide

  13. ࠓ೔ѻ͏τϐοΫ
    • δΣωϦοΫͳؔ਺ (letଟ૬)ͱܕਪ࿦
    • αϒλΠϐϯάͱܕڧ੍ҙຯ࿦
    • ଘࡏܕ (࣌ؒͷ౎߹Ͱলུ)

    View Slide

  14. ଘࡏܕͷղઆ͸QiitaͰ…

    View Slide

  15. δΣωϦοΫͳؔ਺(letଟ૬)
    ͱܕਪ࿦

    View Slide

  16. Generics in Swift
    • δΣωϦΫεपΓͷ࣮૷͸ͱʹ͔͘೉͍͠…
    • ͔͠͠(੍໿Λؚ·ͳ͍)δΣωϦοΫͳؔ਺ͩ
    ͚ͳΒܕਪ࿦ؚΊཧ࿦΋࣮૷΋ͦΜͳʹ೉͘͠
    ͳ͍
    • δΣωϦοΫͳؔ਺ͱͦͷܕਪ࿦ΛݟΔ͜ͱͰɺ
    SemaϞδϡʔϧΛ၆ᛌ͢Δ

    View Slide

  17. δΣωϦοΫͳؔ਺

    View Slide

  18. = ଟ૬ͳؔ਺

    View Slide

  19. ଟ૬ੑͱ͸…

    View Slide

  20. ଟ૬ੑ(polymorphism)
    • ϓϩάϥϜͷҰ෦෼ΛɺҟͳΔจ຺Ͱ͸ҟͳ
    Δܕͱͯ͠༻͍Δ͜ͱΛՄೳʹ͢Δ֤छݴޠ
    ػೳ

    View Slide

  21. ଟ૬ੑ(polymorphism)
    Bool → Bool
    ಉ͡idؔ਺Ͱ΋ɺҟͳΔจ຺Ͱ͸ҟͳΔܕ
    Int → Int

    View Slide

  22. ଟ૬ͳؔ਺͸SwiftͰ͸
    Ͳ͏࣮ݱ͞Ε͍ͯΔʁ

    View Slide

  23. ଟ૬ͳؔ਺ͱܕਪ࿦
    • ࣮͸ଟ૬ͳؔ਺ͱܕਪ࿦͸͋ΔҙຯηοτͰ
    ఏڙ͞Ε͍ͯΔػೳ
    • ܕਪ࿦Λ࢖ͬͯϙϦϞʔϑΟζϜΛ࣮ݱ
    • δΣωϦοΫͳؔ਺Λ஌Δʹ͸ܕਪ࿦΋஌Δ
    ඞཁ͕͋Δ

    View Slide

  24. Swiftʹ͓͚Δ
    (ϩʔΧϧ)ܕਪ࿦

    View Slide

  25. ܕਪ࿦ͷେ·͔ͳྲྀΕ
    1. ܕ͕໌ࣔ͞Ε͍ͯͳ͍ͱ͜ΖΛܕม਺(Type
    Variable)Ͱ͓͘
    2. ܕม਺ͷ੍໿(Constraint)Λੜ੒͢Δ
    3. ੍໿Λղ͘

    View Slide

  26. ܕਪ࿦ͷେ·͔ͳྲྀΕ
    • ܕ͕ܾ·͍ͬͯͳ͍ͱ͜ΖΛܕม਺Ͱ͓͘
    Type Variables:
    #0 = $T0 [inout allowed]
    #1 = $T1 [inout allowed]
    $ swift -frontend -typecheck -debug-constraints test.swift
    $T1 $T0

    View Slide

  27. • ੍໿(Constraint)Λੜ੒͢Δ
    ܕਪ࿦ͷେ·͔ͳྲྀΕ
    $T0 literal conforms to ExpressibleByIntegerLiteral
    $T0 conv $T1
    $ swift -frontend -typecheck -debug-constraints test.swift
    $T0 ͸੔਺Ϧςϥϧ
    $T0 ͸$T1ʹม׵Ͱ͖Δ

    View Slide

  28. ܕਪ࿦ͷେ·͔ͳྲྀΕ
    • ੍໿Λղ͘
    Active bindings: $T0 := Int
    (trying $T0 := Int
    ($T1 bindings=(supertypes of) Int)
    Active bindings: $T1 := Int
    (trying $T1 := Int
    (found solution 0 0 0 0 0 0 0 0 0 0 0 0 0)
    )
    )
    $ swift -frontend -typecheck -debug-constraints test.swift

    View Slide

  29. ܕਪ࿦ͷେ·͔ͳྲྀΕ
    • ੍໿Λղ͘
    ---Solution---
    Fixed score: 0 0 0 0 0 0 0 0 0 0 0 0 0
    Type variables:
    $T1 as Int
    $T0 as Int
    $ swift -frontend -typecheck -debug-constraints test.swift
    Int Int

    View Slide

  30. δΣωϦοΫͳؔ਺ͷ৔߹

    View Slide

  31. ܕਪ࿦ͷେ·͔ͳྲྀΕ(࠶ܝ)
    1. ܕ͕໌ࣔ͞Ε͍ͯͳ͍ͱ͜ΖΛܕม਺(Type
    Variable)Ͱ͓͘ ←ଟ૬ͳؔ਺ͷ࣮ݱʹ͸͜͜ʹϙΠϯτ
    2. ܕม਺ͷ੍໿(Constraint)Λੜ੒͢Δ
    3. ੍໿Λղ͘

    View Slide

  32. δΣωϦοΫͳؔ਺ͷܕਪ࿦

    View Slide

  33. δΣωϦοΫͳؔ਺ͷܕਪ࿦
    ಺෦తͳܕͷදݱ: <τ_0_0> τ_0_0 → τ_0_0
    ݟͨ໨ͷܕ: A → A
    Aͱ͍͏໊લ͸ࣺͯΒΕͯdepthͱindexʹΑΔ໊ແ͠දݱʹͳ͍ͬͯΔ

    View Slide

  34. δΣωϦοΫͳؔ਺ͷܕਪ࿦
    ग़ݱͷͨͼʹτ_0_0ʹ৽͍͠ܕม਺ΛׂΓ౰ͯΔ
    Opened types:
    opens τ_0_0 -> $T1
    opens τ_0_0 -> $T4
    $ swift -frontend -typecheck -debug-constraints test.swift
    ͜Ε͕ଟ૬ੑΛ࣮ݱ͍ͯ͠ΔϙΠϯτ
    $T1 -> $T1 $T4 -> $T4

    View Slide

  35. δΣωϦοΫͳؔ਺ͷܕਪ࿦
    Type Variables:
    #0 = $T0 as ($T1) -> $T1
    #1 = $T1
    #2 = $T2
    #3 = $T3 as ($T4) -> $T4
    #4 = $T4
    #5 = $T5
    #6 = $T6
    $ swift -frontend -typecheck -debug-constraints test.swift

    View Slide

  36. δΣωϦοΫͳؔ਺ͷܕਪ࿦
    • ͋ͱ͸ಉ͡Α͏ʹ੍໿ੜ੒ͯ͠ղ͚ͩ͘
    ---Solution---
    Fixed score: 0 0 0 0 0 0 0 0 0 0 0 0 0
    Type variables:
    $T6 as (Int, Bool)
    $T3 as (Bool) -> Bool
    $T4 as Bool
    $T0 as (Int) -> Int
    $T1 as Int
    $T5 as Bool
    $T2 as Int
    $ swift -frontend -typecheck -debug-constraints test.swift

    View Slide

  37. δΣωϦοΫͳؔ਺ͷܕਪ࿦
    • ग़ݱͷͨͼʹ৽͍͠ܕม਺ΛׂΓ౰্ͯͨͰɺ
    ܕΛਪ࿦͢Δ͜ͱʹΑͬͯଟ૬ੑΛ࣮ݱͯ͠
    ͍Δɻ
    • ͜ΕΛletଟ૬ͱݺͿ

    View Slide

  38. δΣωϦοΫͳؔ਺ͱܕਪ࿦
    The secret life of types in Swift
    https://medium.com/@slavapestov/the-secret-life-of-types-in-swift-ff83c3c000a5

    View Slide

  39. ΋͏গ࣮͠૷دΓͷ࿩

    View Slide

  40. ܕνΣοΫؔ࿈ͷओཁͳΫϥε
    • ίʔυྔଟ͍͚ͲɺओͳΫϥε͸2ͭͷΈ
    • TypeChecker → ܕݕࠪ୲౰
    • ConstraintSystem → ܕਪ࿦୲౰
    • TypeChecker͕Expr͝ͱʹConstraintSystemΛ
    ΠϯελϯεԽͯ͠࢖͍ͬͯΔΠϝʔδ

    View Slide

  41. TypeChecker / ConstraintSystem

    View Slide

  42. ܕม਺ɺ੍໿ੜ੒ͷྫ

    View Slide

  43. ੍໿ͷ୯ҰԽ (solve)

    View Slide

  44. ੍໿ͷ୯ҰԽ (solve)
    • جຊతʹ͸ީิΛͲΜͲΜࢼ͍ͯ͘͠
    • PotentialBindings ( e.g. ੔਺Ϧςϥϧ͔ͩΒIntͩΖ͏ )
    • Overloadͷީิͨͪ
    • ConstraintGraphͱ͍͏(ϋΠύʔ)άϥϑͰ੍໿
    Λ؅ཧ
    • େ·͔ʹ͸BindingΛ௥Ճ → άϥϑΛ੔ཧͷ܁Γฦ͠

    View Slide

  45. ղͷద༻(apply)ͱASTॻ͖׵͑
    • ExprRewriter͕ܕ෇͖ͷAST΁ͱॻ͖׵͑Δ

    View Slide

  46. letଟ૬Λ࣮ݱ͍ͯ͠Δ෦෼
    δΣωϦοΫͳؔ਺ͳΒ
    ܕύϥϝʔλʹ
    ϑϨογϡͳܕม਺Λ
    ׂΓ౰ͯΔͱ͍͏
    ཧ࿦ͦͷ··ͷ࣮૷ɻ

    View Slide

  47. ·ͱΊ
    • ଟ૬ͳؔ਺͕ܕਪ࿦ʹΑ࣮ͬͯݱ͞Ε͍ͯΔ
    ༷ࢠΛݟͨ
    • ConstraintSystem͕ܕਪ࿦Λ͢Δͷେ·͔ͳ
    ྲྀΕΛΈͨ

    View Slide

  48. ͓·͚: ੍໿෇͖ͷδΣωϦΫε͸ʁ
    • ࣮૷ͱͯ͠͸جຊతʹ͸ಉ͡
    • TʹׂΓ౰ͯΒΕͨܕม਺ʹ $T1 conforms to
    EquatableͷΑ͏ͳ੍໿͕ՃΘΔ͘Β͍
    • ͔͠͠എܠʹ͋Δཧ࿦͸·ͨผ…

    View Slide

  49. ͓·͚: ੍໿෇͖ͷδΣωϦΫε͸ʁ
    • ݶఆܕ (Qualified type)
    • TaPLʹ͸໊લ͔͠ࡌͬͯͳ͍
    • Jones, Mark P. Qualified Types: Theory and Practice. Cambridge
    University Press, 1994.
    • Haskellͷ Eq a => a -> a -> Bool
    • ༗քྔԽ(bounded qualification)Ͱ͸ͳ͍

    View Slide

  50. αϒλΠϐϯάͱ
    ܕڧ੍ҙຯ࿦

    View Slide

  51. ΫΠζ
    • Swiftʹ͓͍ͯɺT͸ OptionalͷαϒλΠ
    ϓ͔ʁʁ

    View Slide

  52. T is subtype of Optional
    • ౴͑: αϒλΠϓɻ
    • αϒλΠϐϯάنଇ͸υΩϡϝϯτʹ͸ॻ͍
    ͍ͯͳ͍͕ɺιʔείʔυதͷίϝϯτʹͪΐ
    ͪ͜ΐ͜ఆٛ͞Ε͍ͯΔɻ(͢΂͕ͯॻ͍ͯ͋ΔΘ͚
    Ͱ͸ͳ͍)
    • lib/Sema/CSSimplify.cpp Λࢀর

    View Slide

  53. T is subtype of Optional

    View Slide

  54. αϒλΠϓؔ܎
    • ͲΜͳαϒλΠϓؔ܎Λ࣋ͨͤΔ͔͸ͦͷݴޠͰ
    ͷܾΊͷ໰୊
    • ྫ͑͹ Int < Float ͱ͔ Int < String ͱ͔࣋ͨͤͯ
    ΋(੔߹ੑ͕औΕΔͷͳΒ) ྑ͍
    • Swift͸OptionalΛָʹѻ͏࢓૊Έͱͯ͠ ɺ
    T < OptionalΛ࠾༻͍ͯ͠Δ

    View Slide

  55. ଞʹ͸ͲΜͳ
    αϒλΠϓؔ܎͕͋Δʁ

    View Slide

  56. Optional-to-optional

    View Slide

  57. Metatype

    View Slide

  58. Existential

    View Slide

  59. αϒλΠϓ͔ͩΒ
    ͳΜͰ΋OKʁ

    View Slide

  60. ྫ: Existential

    View Slide

  61. ࣮ߦ࣌ͷϝϞϦ্ͷදݱ͕
    ҧ͏Մೳੑ͕͋Δ

    View Slide

  62. ͜ͷ໰୊ʹର͢ΔΞϓϩʔν
    αϒλΠϐϯάͷ࣮૷ํࣜ͸େ͖͘෼͚ͯ2ͭ
    1. inclusiveͳ࣮૷
    • ڞ௨ͷ࣮ߦ࣌ͷදݱΛ࢖͏
    • JavaͳͲ
    2.coerciveͳ࣮૷
    • ม׵ॲཧ(ܕڧ੍)ΛڬΈࠐΉ
    ← Swift͸ͬͪ͜

    View Slide

  63. ܕڧ੍ҙຯ࿦(coercion semantics)
    • ؆୯ʹݴ͏ͱɺ̍ͭͷαϒλΠϐϯάنଇʹ͍ͭͯɺ1
    ͭͷม׵ॲཧ(ܕڧ੍)͕ଘࡏ͢Δɻ
    • TypeChecker͸ɺͲͷαϒλΠϓؔ܎Λ࢖ͬͯܕνΣο
    ΫΛ௨͔ͨ͠Λه࿥͓͍ͯͯ͠ɺ͋ͱͰ࣮ࡍͷม׵ॲཧ
    Λૠೖ͢Δɻ
    • lib/Sema/CSApply.cppͷExprRewriterͱ͍͏Ϋϥε
    Λࢀߟɻ

    View Slide

  64. ྫ: Optionalͷ৔߹

    View Slide

  65. ྫ: Optionalͷ৔߹

    View Slide

  66. ྫ: Optionalͷ৔߹
    Constraint restrictions:
    Int to Optional is [value-to-optional]
    $ swift -frontend -typecheck -debug-constraints test.swift

    View Slide

  67. ྫ: Optionalͷ৔߹
    $ swiftc -dump-ast test.swift
    (inject_into_optional implicit type=‘Optional’ …
    (declref_expr type=‘Int' … ) )

    View Slide

  68. ྫ: Optionalͷ৔߹
    $ swiftc -emit-sil test.swift
    %9 = load %3 : $*Int
    %10 = enum $Optional, #Optional.some!enumelt.1, %9 : $Int
    store %10 to %8 : $*Optional
    %12 = integer_literal $Builtin.Int32, 0
    %13 = struct $Int32 (%12 : $Builtin.Int32)
    ͭ·ΓରԠ͢Δܕڧ੍͸ʮ.someͰแΉʯ

    View Slide

  69. Classͷ৔߹

    View Slide

  70. ྫ: Classͷ৔߹

    View Slide

  71. ྫ: Classͷ৔߹
    Constraint restrictions:
    Dog to Animal is [superclass]
    $ swift -frontend -typecheck -debug-constraints test.swift

    View Slide

  72. ྫ: Classͷ৔߹
    $ swiftc -dump-ast test.swift
    (derived_to_base_expr implicit type=‘Animal’ …
    (declref_expr type=‘Dog' … ) )

    View Slide

  73. ྫ: Classͷ৔߹
    $ swiftc -emit-sil test.swift

    %10 = load %3 : $*Dog
    strong_retain %10 : $Dog
    %12 = upcast %10 : $Dog to $Animal
    store %12 to %9 : $*Animal
    %14 = integer_literal $Builtin.Int32, 0
    %15 = struct $Int32 (%14 : $Builtin.Int32)
    ͭ·ΓରԠ͢Δܕڧ੍͸ʮΞοϓΩϟετʯ

    View Slide

  74. ྫ:Existentialͷ৔߹
    աఔ͸লུ
    (erasure_expr implicit type=‘Animal’ …
    (declref_expr type=‘Dog' … ) )
    ରԠ͢Δܕڧ੍͸ʮଘࡏܕ΁ͷύοέʔδԽʯ
    ( = type erase)

    View Slide

  75. Swiftʹ͓͚Δʮ҉໧ม׵ʯ
    • Α͘ʮ҉໧ม׵ʯͳͲͱݺ͹ΕΔΞϨͷਖ਼ମ
    ͸΄΅΄΅αϒλΠϓؔ܎ʹج͍ͮͨܕڧ੍
    • ҉໧ม׵͋Δͱ͜ΖʹαϒλΠϐϯά͋Γ

    View Slide

  76. ࣮૷Λগ͚ͩ͠ݟΔ

    View Slide

  77. αϒλΠϐϯάʙܕڧ੍
    • ConstraintSystemͷConstraintRestrictionsʹ
    ࢖ͬͨαϒλΠϓؔ܎౳͕ه࿥͞ΕΔ
    • ExprRewriter::coerceToTypeͰܕڧ੍

    View Slide

  78. ExprRewriter::coerceToType
    ܕڧ੍(coercion)ͷॲཧΛ͍ͯ͠Δؔ਺

    View Slide

  79. ExprRewriter::coerceToType
    ConversionRestrictionKindʹԠͨ͡ॲཧ
    ͨͱ͑͹ValueToOptionalͳΒInjectIntoOptionalͱ͍͏
    ܕڧ੍Λૠೖ

    View Slide

  80. αϒλΠϐϯά·ͱΊ
    • αϒλΠϐϯά͸نଇʹΑͬͯఆٛ͞Ε͍ͯΔ
    • ͦΕͧΕنଇʹରԠ͢Δܕڧ੍͕ଘࡏ͢Δ
    • TypeChecker/ConstraintSystem͸ɺͲͷαϒ
    λΠϓؔ܎Λ࢖ͬͯܕνΣοΫΛ௨͔ͨ͠Λ֮
    ͓͍͑ͯͯɺ͋ͱͰ࣮ࡍͷม׵ॲཧΛૠೖ͢Δɻ

    View Slide

  81. ͓ΘΓ

    View Slide