Share
Embed
Transcript
47 slides
-
ࣗݾհ Yuki Takahashi @ukitaka ▸ iOS Engineer @ Mercari Fukuoka
Office ▸ SwiftͷίϯύΠϥɺಛʹܕγεςϜʹڵຯ͕͋Γ·͢ɻ ▸ ͨ·ʹϒϩάQiitaΛॻ͍ͯ·͢ɻ -
ࠓͷςʔϚ SwiftͷܕγεςϜʹೖ͢Δ ▸ Swiftͷܕͷ͜ͱΛͬͱਂ͘Γ͍ͨਓΛλʔ ήοτͱͯ͠ɺSwiftίϯύΠϥͷ࣮ΛಡΈ࢝ ΊΒΕΔͱ͜Ζ·Ͱ͍࣋ͬͯ͘͜ͱΛඪ ▸ 2ํ͔ΒͷΞϓϩʔν ▸ SwiftίϯύΠϥͷ࣮ΛಡΉ
▸ SwiftͷܕγεςϜͷཧΛΔ → શମΛ၆ᛌ͠ɺ࠷ॳͷҰาͷ͓ख͍ -
SwiftͷܕγεςϜͷಛΛΔ SwiftͷܕγεςϜͷಛ ▸ ܕਪ ▸ δΣωϦΫε ▸ αϒλΠϐϯά ▸ ଘࡏܕ
(Existential type) ▸ ܕΫϥεɾݶఆܕ (Qualified type) -
SwiftͷܕγεςϜͷಛΛΔ ܕਪ ▸ Hindley-MilnerϥΠΫͳ੍(Constraint)ϕʔεͷܕਪ ▸ ྫ͑มͷܕΛ໌ࣔ͠ͳͯ͘ࠨล͔Βਪͯ͘͠ΕΔ ▸ ӈล͔Βࠨล͍͚Δ ▸ ೖʹݶΒͣɺ͍Ζ͍Ζͳͱ͜ΖͰܕΛ໌ࣔ͠ͳͯ͘Α͍
❌ ؔͷҾɾฦͷܕলུͰ͖ͳ͍ɺ1expression/1statementʹด͍ͯ͡Δ -
SwiftͷܕγεςϜͷಛΛΔ δΣωϦΫε ▸ ίʔυੜϑΣʔζ·ͰؚΊͨίϯύΠϥͷ࣮ ͱͯ͠໘ന͍ ▸ ܕγεςϜͱͯ͋͠Δҙຯཧ௨Γ ▸ ܕਪΛͬͯଟ૬ੑΛ࣮ݱ͢Δ ▸
ͨͩ͠ܕύϥϝʔλʹର͢Δ੍पΓޙड़ͷ ݶఆܕ(Qualified type)ͱؔ࿈ͯ͘͠Δ -
SwiftͷܕγεςϜͷಛΛΔ ଘࡏܕ (Existential Type) ▸ = ܕͱͯ͠ͷprotocol ▸ SwiftଘࡏܕΛ͋Δҙຯతʹѻ͑Δ͍͠ ݴޠ
▸ ଘࡏܕͩͱҙࣝͤͣʹ͑Δݴޠઃܭ ▸ Opening existential͕ಋೖ͞ΕΔͱଘࡏܕͱ ͳʹ͔ΛΒͳ͍ͱཧղͮ͠Β͍͜ͱ͋Δ ͔͠Εͳ͍ → গͳ͘ͱprotocolܕ = ଘࡏܕͰ͋Δͱ͍͏͜ͱΛ ಄ͷย۱ʹஔ͍͓ͯ͘ͱྑ͍ -
SwiftͷܕγεςϜͷಛΛΔ ܕΫϥεɾݶఆܕ(Qualified Type) ▸ = ܕύϥϝʔλͷ੍ͱͯ͠ͷprotocol ▸ T: Equatable ▸
Conditional Conformance ▸ ݶఆܕʮܕΫϥεΛܕγεςϜͰѻ͏ʯͨΊͷ ཧ ▸ ܕ্ͷड़ޠʹΑ੍ͬͯΛ͔͚Δ ▸ Jones, Mark P. Qualified Types: Theory and Practice. Cambridge University Press, 1994. -
SwiftͷܕγεςϜͷಛΛΔ αϒλΠϐϯά ▸ αϒλΠϐϯάࣗମଞͷݴޠʹݟΒΕΔ͕ɺSwiftͷͦΕ͔ͳΓಛత ▸ classͱͦͷܧঝ͚ؔͩͰͳ͍ ▸ Optionalʹର͢ΔαϒλΠϐϯά ▸ TT?ͷαϒλΠϓ
▸ Existentialʹର͢ΔαϒλΠϐϯά ▸ T <: U, U: P 㱺 T <: P → ҉มΛࢧ͑ΔΈ -
SwiftͷܕγεςϜͷಛΛΔ SwiftͷܕγεςϜ͕͍࣋ͬͯͳ͍ͷ (ൈਮ) ❌ શͳܕਪ ❌ ߴΧΠϯυଟ૬ (Haskell, ScalaͳͲ) ❌
Rank2Ҏ্ͷଟ૬ ❌ ҙͷδΣωϦοΫͳܕʹର͢Δڞมɾมͷࢦఆ → Կ͔ͱͷτϨʔυΦϑͳͷͰɺ͋Δ͔Βྑ͍ͱ͍͏Θ͚Ͱͳ͍ Swift͜ͷลΓͷόϥϯε͕ͱΕ͍ͯΔྑ͍ݴޠ -
Swiftͷܕਪͱͦͷσόοάํ๏ΛΔ ίϯύΠϥͷίʔυΛಡΉલʹ ▸ ͍͖ͳΓίϯύΠϥͷίʔυΛಡΉͷͪΐͬͱେม ▸ ·ͣσόοάͷͨΊͷίϚϯυΛ͓ͬͯ͘ͱίʔυΛಡ·ͣʹڍಈΛ֬ೝͰ͖Δ ▸ લఏࣝͱͯ͠ίϯύΠϧͱASTͷϑΣʔζΛ֬ೝ͓ͯ͘͠ Swift AST
AST (typed) lib/Parse lib/Sema ͕͜͜ܕʹؔ͢ΔΞϨίϨ͕ߦΘΕΔͱ͜Ζ -
Swiftͷܕਪͱͦͷσόοάํ๏ΛΔ ASTΛग़ྗ͢ΔίϯύΠϥΦϓγϣϯ2ͭ % swiftc -help OVERVIEW: Swift compiler USAGE: swiftc
[options] <inputs> MODES: -dump-ast Parse and type-check input file(s) and dump AST(s) -dump-parse Parse input file(s) and dump AST(s) Swift AST AST (typed) -dump-parse -dump-ast lib/Sema -
Swiftͷܕਪͱͦͷσόοάํ๏ΛΔ ASTΛग़ྗ͢ΔίϯύΠϥΦϓγϣϯ2ͭ % swiftc -help OVERVIEW: Swift compiler USAGE: swiftc
[options] <inputs> MODES: -dump-ast Parse and type-check input file(s) and dump AST(s) -dump-parse Parse input file(s) and dump AST(s) Swift AST AST (typed) Γ͍ͨͷ͜ͷաఔͷdumpํ๏ lib/Sema -
Swiftͷܕਪͱͦͷσόοάํ๏ΛΔ -debug-constraints ▸ ܕਪɺܕݕࠪͷաఔΛग़ྗ͢ΔΦϓγϣϯ ▸ Constraints = ܕਪ࣌ʹ͏ʮAͱBͷܕಉ͡ʯͷΑ͏ͳ੍(Constraint)ͷ͜ͱ ▸ ܕγεςϜlib/SemaΛཧղ͢Δ্Ͱͷ࠷ॏཁίϯύΠϥΦϓγϣϯ
Swift AST AST (typed) lib/Parse lib/Sema -debug-constraints -
Swiftͷܕਪͱͦͷσόοάํ๏ΛΔ ܕਪɾܕݕࠪͷྲྀΕΛΔ 1. ܕ͕໌ࣔ͞Ε͍ͯͳ͍ͱ͜ΖΛܕม(Type Variable)Ͱ͓͘ 2. ܕมͷ੍(Constraint)Λੜ͢Δ 3. ੍Λղ͍ͯղ(Solution)Λݟ͚ͭΔ 4.
ͦͷղΛݩͷASTʹద༻ͭͭ͠ඞཁͳॻ͖͑(Rewrite)Λߦ͏ -
Swiftͷܕਪͱͦͷσόοάํ๏ΛΔ ܕਪɾܕݕࠪͷྲྀΕΛΔ let i: Int = Int2048(_builtinIntegerLiteral: 42) 4. ͦͷղΛݩͷASTʹద༻ͭͭ͠ඞཁͳॻ͖͑(Rewrite)Λߦ͏
Ϧςϥϧ͕ؔbuiltinݺͼग़͠ʹ ܕ͕ܾ·ͬͨঢ়ଶ ※ ASTΛ۩จ๏ʹͨ͠Πϝʔδ -
Swiftͷܕਪͱͦͷσόοάํ๏ΛΔ ܕਪɾܕݕࠪͷྲྀΕΛΔ 1. ܕ͕໌ࣔ͞Ε͍ͯͳ͍ͱ͜ΖΛܕม(Type Variable)Ͱ͓͘ 2. ܕมͷ੍(Constraint)Λੜ͢Δ 3. ੍Λղ͍ͯղ(Solution)Λݟ͚ͭΔ 4.
ͦͷղΛݩͷASTʹద༻ͭͭ͠ඞཁͳॻ͖͑(Rewrite)Λߦ͏ → ͜ͷྲྀΕͰग़ྗ͞Ε͍ͯΔ -
SwiftͷܕγεςϜͷ࣮ΛಡΉ ओཁͳΫϥε ▸ TypeChecker → ܕݕࠪ୲ ▸ TypeCheck*.cppʹׂ࣮͕͞Ε͍ͯΔ ▸ ConstraintSystem
→ ܕਪ୲ ▸ CS*.cpp ʹׂ࣮͕͞Ε͍ͯΔ -
SwiftͷܕγεςϜͷ࣮ΛಡΉ ConstraintSystemͷࣄ - ੍ੜ ▸ createTypeVariableͰܕมΛ࡞Δ ▸ addConstraintͰ੍Λੜˍཧ͢ Δ ▸
ConstraintKindͰ੍ͷछྨΛࢦఆ ▸ ੍ConstraintGraphͱݺΕΔά ϥϑͰཧ ੍ੜͷྫ -
SwiftͷܕγεςϜͷཧΛΔ SwiftͷܕγεςϜͷཧΛΔ ▸ ཧΛΕ࣮͕ಡΈ͘͢ͳΔ ▸ SwiftίϯύΠϥͷ࣮ෳࡶʹབྷΈ߹͍ͬͯΔ͕ɺجຊతʹ͍͔ͭ͘ͷτϐοΫ ͷू·Γɻͦͯ͠୯ମͰݟΔͱཧ௨Γ࣮͞Ε͍ͯΔ߹͕ଟ͍ɻ ▸ ֓೦Λ͍ͬͯΔ͚ͩͰ͍ͩͿೖΓ͍͢ ▸
Opening existentialͷΑ͏ʹͦͦ֓೦ΛΒͳ͍ͱҙຯ͕Θ͔Βͳ͍ͷ͋Δ → ৄࡉͳղઆͰ͖ͳ͍ͷͰɺֶͼํͷΈհ -
SwiftͷܕγεςϜͷཧΛΔ ܕγεςϜೖ(TaPL) ▸ Types and Programming Language (TaPL) ▸ ܕͳ͠ͷϥϜμܭࢉͷΑ͏ͳجૅతͳͱ͜Ζ͔
Βঃʑʹݱͷϓϩάϥϛϯάݴޠ͕࣋ͭΑ͏ ͳػೳΛ͚Ճ͍͑ͯ͘ ▸ 1ষແྉͰެ։͞Ε͍ͯΔʂʮܕʯͱԿ͔Λ Δʹ࠷ߴͷࢿྉ → SwiftΛΔͨΊʹͲ͏ಡΊྑ͍ʁ -
SwiftͷܕγεςϜͷཧΛΔ TaPLͷา͖ํ ▸ લఏͱͯ͠ɺͯ͢ͷষΛಡΉඞཁͳ͍ ▸ 9ষ·Ͱجૅͱͯ͠ಡΜͰ͓͘ͱΑͦ͞͏ ▸ લʮཧͷষ → OCamlʹΑΔ࣮ͷষʯͷ
܁Γฦ͠ͳͷͰ࣮ΛSwiftͰͬͯΈΔͱ͍͏ ͷྑ͍ख ▸ ઌ΄ͲݟͨΑ͏ͳSwiftͷܕγεςϜͷಛΛ ѻ͍ͬͯΔͷ15ষɺ22ষɺ24ষ͋ͨΓ ܕγεςϜೖ−ϓϩάϥϛϯάݴޠͱܕͷཧ− ংจΑΓҾ༻ -
SwiftͷܕγεςϜͷཧΛΔ ୈ22ষ ܕ࠶ߏங ▸ ܕ࠶ߏங = ܕਪ ▸ ܕਪͱSwift͕࣋ͭΑ͏ͳδΣωϦΫεʹ͍ͭ ͯऔΓѻ͍ͬͯΔষ
▸ SwiftͷδΣωϦοΫͳؔܕਪͱηοτͰ ఏڙ͞Ε͍ͯΔػೳ (letଟ૬) ͱ͍͏͜ͱ͕Θ͔ Δ The secret life of types in Swift https://medium.com/@slavapestov/the-secret-life-of-types-in-swift-ff83c3c000a5 ܕγεςϜೖ−ϓϩάϥϛϯάݴޠͱܕͷཧ− ୈ22ষʮܕ࠶ߏஙʯΑΓҾ༻ -
SwiftͷܕγεςϜͷཧΛΔ ୈ15ষ ෦ܕ͚ ▸ ෦ܕ͚ = αϒλΠϐϯά ▸ ͋Δܕͱ͋Δܕ͕αϒλΠϓؔͰ͋Δ͔Ͳ͏ ͔ɺͦͷܕγεςϜͰͷʮܾΊʯͷͩͱ
͍͏͜ͱ͕Θ͔ΕΑͦ͞͏ ▸ 15.5અͷʮܕڧ੍ҙຯʯͷͱ͜Ζ·͞ʹ SwiftίϯύΠϥͰߦΘΕ͍ͯΔ͜ͱ͕ॻ͍ͯ͋ ΔͷͰඞಡ ܕγεςϜೖ−ϓϩάϥϛϯάݴޠͱܕͷཧ− ୈ15ষʮ෦ܕ͚ʯΑΓҾ༻ -
SwiftͷܕγεςϜͷཧΛΔ ୈ24ষ ଘࡏܕ ▸ λΠτϧ௨Γଘࡏܕ(Existential type)Λѻ͏ষ ▸ ଘࡏܕ͕ʮ͋ΔܕͱͦͷܕΛͬͨܕʯͷɺ ଘࡏܕͷʮ͋Δܕ͕۩ମతʹͳʹ͔ +
ͦͷ ʯͷϖΞͰ͋Δͱ͍͏ͱ͜Ζ͔͑ͭ͞ΊΕ Swiftͷଘࡏܕා͘ͳ͍ ϖΞͬΆ͍งғؾ ܕγεςϜೖ−ϓϩάϥϛϯάݴޠͱܕͷཧ− ୈ24ষʮଘࡏܕʯΑΓҾ༻ -
SwiftͷܕγεςϜͷཧΛΔ Swiftʹؔ͋Γͦ͏Ͱؔͳ͍ষ ▸ ୈ23ষ શশܕ ▸ ͍ΘΏΔδΣωϦΫεͷ͜ͱͩͱࢥͬͯಡΉͱϋϚΔ ▸ Swift͜ͷষͰऔΓ্͛ΒΕ͍ͯΔΑ͏ͳλΠϓͷڧྗͳδΣωϦΫεΛ࣋ͨͳ͍ ▸
ୈ26ষ ༗քྔԽ ▸ ͺͬͱݟ T: EquatableͷΑ͏ͳ੍ʹ͍ͭͯͷཧతഎܠ͕ॻ͍ͯ͋ΔΑ͏ʹΈ͑Δ͕ɺ࣮ؔ ͳ͍ (see: ݶఆܕ) ▸ ༗քྔԽαϒλΠϐϯάʹΑ੍ͬͯΛ͔͚Δɺݶఆܕܕ্ͷड़ޠͰ੍Λ͔͚Δͱ͍͏ҧ͍