Slide 1

Slide 1 text

ؔ਺ܕ LT େձ Unboxed objects and polymorphic typing nomaddo@no maddo 2014/3/31

Slide 2

Slide 2 text

Who am I? OCaml, SML#, Emacs Haskell ͸෼͔Γ·ͤΜʜɻ • ౦๺େֶͷେֶӃੜ (M1) • ࿦ཧֶͱ͔ܕཧ࿦ͱ͔ίϯύΠϥͱ͔ษڧͯ͠·͢ • झຯ͸ list-package Ͱ֦ுϓϥάΠϯͷϦετΛோΊΔ͜ͱ • ؋͜ΕͰͳΒࢁ৓ɾැ܂͕޷͖Ͱ͢ • ΠϯλʔϯઌΛ୳͍ͯ͠·͢ʂ 2 / 37

Slide 3

Slide 3 text

౦๺େͬͯͲΜͳͱ͜ʁ 3 / 37

Slide 4

Slide 4 text

౦๺େͬͯͲΜͳͱ͜ʁ A. ࢁͰ͢ 3 / 37

Slide 5

Slide 5 text

౦๺େͬͯͲΜͳͱ͜ʁ A. ࢁͰ͢ 3 / 37

Slide 6

Slide 6 text

౦๺େͬͯͲΜͳͱ͜ʁ A. ࢁͰ͢ • ۽͕ग़Δ • ۽ʹ஫ҙ͠Ζͱϝʔϧ ͕དྷΔ • େֶੜڠͰ۽Α͚ͷླ ͕ച͍ͬͯͨ • ڭһ΋ωλʹ͢Δ 3 / 37

Slide 7

Slide 7 text

ຊ೔࿩͢͜ͱ • ࿦จ঺հ Unboxed objects and polymorphic typing Xavier Leroy (POPL92) http://gallium.inria.fr/~xleroy/publi/ unboxed-polymorphism.pdf Έͳ͞Μ୯७ܕ෇͖ϥϜμܭࢉ͘Β͍Θ͔Γ·͢ΑͶʜʁ ʁ ʁ 4 / 37

Slide 8

Slide 8 text

࿦จ঺հΞ΢τϥΠϯ 1 polymorphic ͳ஋ΛίϯύΠϧ͢Δ೉͠͞ 2 ຊ࿦จͰ΍Γ͍ͨࣄ 3 Formalization 4 Concrete data types 5 ML ͷ࣮૷ͱϕϯνϚʔΫ݁Ռ 5 / 37

Slide 9

Slide 9 text

Ξ΢τϥΠϯ 1 polymorphic ͳ஋ΛίϯύΠϧ͢Δ೉͠͞ 2 ຊ࿦จͰ΍Γ͍ͨࣄ 3 Formalization 4 Concrete data types 5 ML ͷ࣮૷ͱϕϯνϚʔΫ݁Ռ 6 / 37

Slide 10

Slide 10 text

੩తܕ෇͚ͱσʔλදݱ ੩తܕ෇͖ݴޠͰ͸ɺܕ৘ใΛར༻ͯ͠ΑΓΑΓσʔλදݱΛબͿ ͜ͱ͕ग़དྷΔ • ಈతܕ෇͖ݴޠͰ͸ɺ஋͸ uniform ʹදݱ͢Δ͔͠ແ͍ • ͜ͷΑ͏ͳݴޠͰ͸ 1 ϫʔυͰදݱͰ͖ͳ͍σʔλ͸ Box Խ͠ ͯ 1 ϫʔυʹ͢Δඞཁ͕͋Δ • C ͷΑ͏ͳ੩తܕ෇͖ݴޠͰ͸ࣄલʹ஋ͷܕ͕Θ͔͍ͬͯΔͷ Ͱɺͦͷ஋ͷ௕͞΋Θ͔Δɻ • σʔλͷදݱΛޮ཰తͳ΋ͷʹ͢Δ͜ͱ͕ग़དྷΔ box Խ ώʔϓʹΞϩέʔτͯ͠ϙΠϯλͱͯ͠ѻ͏͜ͱ uniform representatin ஋Λ box Խͯ͠ɺ͢΂ͯͷ஋Λ̍ϫʔυͰද͢͜ͱ 7 / 37

Slide 11

Slide 11 text

polymorphismͷ໰୊఺ • ੩తͳܕ৘ใΛίϯύΠϧʹར༻͢ΔͨΊʹ͸ શͯͷ஋ʹ͸ϢχʔΫͳܕ͕͍͍ͭͯͳ͚Ε͹ͳΒͳ͍ • ͔͠͠ɺpolymorphism Λѻ͏ݴޠͰ͸͜Ε͸੒Γཱͨͳ͍ɻ (* int -> int. int ܕ ͷ ஋ ͷ α Π ζ ͸ 1 ϫ ʔ υ *) let succ x = x + 1 (* ’a -> ’a. ’a ܕ ͷ ஋ ͷ α Π ζ ͸ ෼ ͔ Β ͳ ͍ *) let id x = x ͜ΕΛͲ͏΍ͬͯίϯύΠϧ͢Ε͹Α͍ͩΖ͏͔ɻ 8 / 37

Slide 12

Slide 12 text

ղܾࡦ ίϯύΠϧͷઌૹΓ Ada ͷ generic ͷ࣮૷Ͱ࢖ΘΕ͍ͯΔղܾํ๏ ଟ૬తͳ object ͸࢖ΘΕΔ·ͰίϯύΠϧΛઌૹΓ͢Δ σʔλදݱ͸ޮ཰త͕ͩɺίʔυෳ੡Λ͠ͳ͍ͱ͍͚ͳ͍͠ɺ ෼ׂίϯύΠϧͰ͖ͳ͘ͳΔʂ ʢ͍·Ͱ͍͏ C++ͷςϯϓϨʔτͷղܾࡦʣ શͯͷදݱΛ Box Խ͢Δ ଟ͘ͷ ML ܥݴޠͷॲཧܥͰ࠾༻͞Ε͍ͯΔղܾํ๏ γϦΞεʹޮ཰Λଛͳ͏ʂ ྫ͑͹ tuple ͸ৗʹώʔϓʹΞϩέʔτ͠ͳ͍ͱ͍͚ͳ͍ 9 / 37

Slide 13

Slide 13 text

ຊ࿦จͷఏҊ: Mixed Representation ຊ࿦จͰ͸ɺଞͷղܾखஈΛఏҊ͢Δɻ • ୯૬తͳ஋͸ͦΕͧΕͷ Specialized Representation Λ༻͍Δ (σʔλܕ֤ʑͷαΠζͷදݱΛ༻͍Δ) • ଟ૬తͳ஋͸ box Խͯ͠ uniform ʹදݱ͢Δ ઌߦݚڀͱͯ͠ [PeytonJones 91] Ͱ͸ಉ༷ͷදݱΛܗࣜԽ͍ͯ͠Δ ຊ࿦จͰ͸ PeytonJones’ representatin ΁ͷม׵ํ๏΍࣮ࡍͷίϯύ ΠϥͰͷϕϯνϚʔΫ݁Ռʹ͍ͭͯใࠂ͍ͯ͠Δ 10 / 37

Slide 14

Slide 14 text

Ξ΢τϥΠϯ 1 polymorphic ͳ஋ΛίϯύΠϧ͢Δ೉͠͞ 2 ຊ࿦จͰ΍Γ͍ͨࣄ ؔ਺ͷม׵ͷ۩ମྫ 3 Formalization 4 Concrete data types 5 ML ͷ࣮૷ͱϕϯνϚʔΫ݁Ռ 11 / 37

Slide 15

Slide 15 text

Ξ΢τϥΠϯ 1 polymorphic ͳ஋ΛίϯύΠϧ͢Δ೉͠͞ 2 ຊ࿦จͰ΍Γ͍ͨࣄ ؔ਺ͷม׵ͷ۩ମྫ 3 Formalization 4 Concrete data types 5 ML ͷ࣮૷ͱϕϯνϚʔΫ݁Ռ 12 / 37

Slide 16

Slide 16 text

΍Γ͍ͨม׵ͷྫ1 ·ͣɺ؆୯ͳྫ͔ΒݟͯΈΔɻ let make_pair = λx.(x, x) (∗ ∀α. α → α ∗ α ∗) makepair(3.14) ͱ͍͏ؔ਺ద༻Λߟ͑ͯΈΔͱɺ • ଟ૬తͳ෦෼ʹ͘Δ஋͸ box Խ͍ͯ͠Δͱ͢Δ • ͦͷ·· makepair ʹ 3.14 Λ౉͢͜ͱ͸ग़དྷͳ͍ (makepair ͷ α ܕͷҾ਺͸ box Խ͞Ε͍ͯΔ͜ͱΛԾఆ͢Δ) • ฦΓ஋ʹ͸ϑϥοτͳɺbox Խ͞Εͯͳ͍ pair Λฦͯ͠΄͍͠ • ஋Λ box Խͨ͠Γ͢Δɺม׵͕ඞཁͳ͜ͱ͕Θ͔Δ wrap(τ), unwrap(τ) ͱ͍͏ 2 ͭͷΦϖϨʔλΛಋೖ͢Δͱɺ let x = makepair(wrap(float )(3.14)) in (unwrap(float )(fst(x)), unwrap(float )(snd(x))) 13 / 37

Slide 17

Slide 17 text

΍Γ͍ͨม׵ͷྫ2 (* map_pair : ∀α, β. (α → β) → α × α → β × β *) let map pair = λ f. λ x. (f(fst(x), f(snd(x)))) let int pair = map pair int of float (3.14, 2.718) ม׵ޙ let int pair = let y = map pair (λ x. wrap(int) (int of float (unwrap(float)(x)))) (wrap(float)(3.14), wrap(float)(2.718)) in (unwrap(int)(fst(y)), unwrap(int)(snd(y))) ଟ૬తͳ஋͸ box Խ͞Ε͍ͯΔ͜ͱʹ஫ҙɻ ଟ૬ؔ਺ͷݺͼग़͠ଆͰ unbox ͯ͠΍Δɻ 14 / 37

Slide 18

Slide 18 text

Ξ΢τϥΠϯ 1 polymorphic ͳ஋ΛίϯύΠϧ͢Δ೉͠͞ 2 ຊ࿦จͰ΍Γ͍ͨࣄ 3 Formalization 4 Concrete data types 5 ML ͷ࣮૷ͱϕϯνϚʔΫ݁Ռ 15 / 37

Slide 19

Slide 19 text

Formalization ͜ͷষͰѻ͏͜ͱ͸Լͷ௨Γɻ ࢒೦Ͱ͕͕࣌ؒ͢ͳ͍ͷͰඈ͹͠·͢ʂ ʂ ʂ • ม׵લͱม׵ޙͷݴޠͷఆٛ • ݴޠͷม׵نଇ • ม׵ͯ͠΋ܕ͕ͭ͘͜ͱ • ม׵ͯ͠΋ϓϩάϥϜͷҙຯ͕ࣦΘΕͳ͍͜ͱ 16 / 37

Slide 20

Slide 20 text

ѻ͏ݴޠͷఆٛ ୯७ܕ෇͖ϥϜμܭࢉʹܕεΩʔϜɺlet ߏจΛ௥Ճͨ͠ݴޠ • a ͸ source language, a’ ͸ target language • i ͸ int ͷ஋ɺf ͸ float ͷ஋ • τ ͸ܕɺσ ͸ ܕεΩʔϜ • Gen(τ, E) ͸ τ ͷࣗ༝ͳม਺Λ ∀ Ͱଋറͨ͠ܕεΩʔϜ 17 / 37

Slide 21

Slide 21 text

ܕ෇͚نଇ 18 / 37

Slide 22

Slide 22 text

ܕ෇͚ͷྫ E′ = E + x : α E′′ = E + id : ∀α.α → α ρ = α ← int (E + x : α)(x) = α Dom(∅) ⊆ ∅ E + x : α ⊢ x : α E ⊢ λx.x : α → α E′′(id) = ∀α.α → α Dom(ρ) ⊆ {α} E′′ ⊢ id : ρ(α → α) = int → int E′′ ⊢ 14 : int E′′ = E + id : ∀α.α → α ⊢ id 14 : int E ⊢ λx.x : α → α E + id : Gen(α → α, E) ⊢ id 14 : int E ⊢ let id = λx.x in id 14 : int 19 / 37

Slide 23

Slide 23 text

ม׵نଇ1 ܕΛ֦ு͠·͢ τ′ ::= α | int | float | τ1 ′ → τ2 ′ | τ1 ′ ∗ τ2 ′ | [τ′] [τ′] ͸ wrap ͞Εͨ஋ͷܕ E ⊢ a : τ => a′ Ͱ a ʹ τ ܕ͕ͭ͘ͱ͖ɺ ߲ a ͸ a’ ʹม׵Ͱ͖Δ 20 / 37

Slide 24

Slide 24 text

ม׵نଇ2 Gρ ͱ Sρ ͸ Dual Ͱ͢Ͷʔ 21 / 37

Slide 25

Slide 25 text

͍ࣔͨ͜͠ͱ1ɿม׵ͯ͠΋ܕ͕ͭ͘ʂ ͨͩ͠ɺtarget language ͷܕ෇͚نଇʹҎԼΛՃ͑Δ 22 / 37

Slide 26

Slide 26 text

ૢ࡞తҙຯ࿦ͷఆٛ1 syntax Λఆٛͨ͠ΒͦΓΌsemantics ΋ఆٛ͠·͢ΑͶʁ ·ͣ͸ value ͷఆٛʜ v ::= i|f| < v > |v1, v2|clos(k, λx.a, e)|op op ::= add|... 23 / 37

Slide 27

Slide 27 text

ૢ࡞తҙຯ࿦ͷఆٛ2 24 / 37

Slide 28

Slide 28 text

25 / 37

Slide 29

Slide 29 text

͍ࣔͨ͜͠ͱɿ2ͭͷݴޠͷҙຯ͕Ұॹ 26 / 37

Slide 30

Slide 30 text

equalityͷఆٛ ΋ͱͷݴޠͱม׵ޙͷݴޠͷ౳͠͞ʂ 27 / 37

Slide 31

Slide 31 text

Ξ΢τϥΠϯ 1 polymorphic ͳ஋ΛίϯύΠϧ͢Δ೉͠͞ 2 ຊ࿦จͰ΍Γ͍ͨࣄ 3 Formalization 4 Concrete data types 5 ML ͷ࣮૷ͱϕϯνϚʔΫ݁Ռ 28 / 37

Slide 32

Slide 32 text

͠ΜͲ͍࿩1 ML Ͱ͸Ϣʔβ͕৽͍͠ܕΛ࡞Δ͜ͱ͕ग़དྷΔ ΋͏ͪΐ ͬͱෳࡶͳσʔλߏ଄ͷٞ࿦Λ͢Δ ૬มΘΒͣ List, Array ͸ Flat ʹͰ͖ͳ͍!!! (* list ͷ ఆ ٛ *) datatype ’a list = Nil | Cons of ’a * ’a list fun length Nil = 0 (* length : ’a list -> int *) | length (Cons e, l) = 1 + length l Cons(3.14, Nil) ͸ϑϥοτʹѻ͑Ε͹ۭؒޮ཰Αͦ͞͏ ͔͠͠ length ؔ਺ʹ͜ͷϦετΛ౉͢͜ͱΛߟ͑Δͱ·͍ͣ 29 / 37

Slide 33

Slide 33 text

͠ΜͲ͍࿩2 • length: ’a list → int ͷ’a ʹ୅ೖ͞ΕΔܕͷαΠζ͸ෆ໌ • ࠷ॳͷ make_pair ͷྫͰ͸ α ∗ α ܕͷ஋͔Β fst,snd Ͱ஋ΛऔΓ ग़ͯ͠΋͏Ұ౓ pair Λ࡞͍ͬͯΔ • List ΋’a list ΛҾ਺ʹͱΔଟ૬ؔ਺ʹ౉͢ͱ͖ʹɺ࡞Γͳ͓ͤ ͹ྑ͍ʁ ⇒ ࡞Γ௚͢ͷ͸࣌ؒతʹ΋ۭؒతʹ΋ίετ͕ॏ͍ʜ List ͷΑ͏ͳߏ଄͸ flat ʹͰ͖ͳ͍ʜɻͭΒ͍ɻͭΒ͍ɻ Table: flat list Table: a little nested list 30 / 37

Slide 34

Slide 34 text

͠ΜͲ͍࿩3 • ࠓ౓͸ α ∗ α list → ... ͱ͍͏ؔ਺Λߟ͑ͯΈΔ • float ∗ float list Λ౉͢͜ͱΛߟ͑ΔɻͳΔ΂͘ tuple ΋ϑϥο τʹ͍͕ͨ͠ɺؔ਺͕ཁٻ͢Δܗ͸Լͷ௨Γ • ͜ͷέʔεͰ͸ tuple ΋࡞Γ௚͢ͷͰ͸ͳ͘ box Խͯ͠͠·ͬ ͨ΄͏͕ྑ͍? 31 / 37

Slide 35

Slide 35 text

Ξ΢τϥΠϯ 1 polymorphic ͳ஋ΛίϯύΠϧ͢Δ೉͠͞ 2 ຊ࿦จͰ΍Γ͍ͨࣄ 3 Formalization 4 Concrete data types 5 ML ͷ࣮૷ͱϕϯνϚʔΫ݁Ռ 32 / 37

Slide 36

Slide 36 text

GalliumίϯύΠϥͷ࣮૷1 Mixed representation Λ࠾༻ͨ͠ίϯύΠϥΛ࣮૷ ͦͷ࢓༷ʹ͍ͭͯड़΂͍ͯ͘ • unwraped integer ͸ unboxed ͳ 32bit ௕ͷσʔλɺwrap ͯ͠΋ 1 ϫʔυͰࡁΉ͕ GC ͷͨΊ box Խ • 8bit ੔਺͕ char, boolean, enum ͷͨΊʹଘࡏ wrap ͞Εͯ΋ unboxed ͷ·· • unit ͸ 0 ݸཁૉͷλϓϧͰ warp ͞Εͨ unit ͸ಛผͳఆ਺ • closure ͸ 2 ϫʔυ௕ͷ wrap ͞Εͯͳ͍දݱͱͯ͠ѻ͏ ʢ࣮ߦίʔυྻ΁ͷϙΠϯλͱɺ؀ڥ΁ͷϙΠϯλʣ • Array ͷཁૉ͸શͯ wrap ͞Ε͍ͯΔ • tuple ͸ཁૉ͕ 4 ͭҎ্ͷͱ͖͸ unboxed Ͱ͸ѻΘͳ͍ • Ϣʔβʔఆٛͷσʔλߏ଄͸લʹٞ࿦ͨ͠Α͏ʹѻ͏ 33 / 37

Slide 37

Slide 37 text

GalliumίϯύΠϥͷ࣮૷2 ࡉ͔͍࿩͕ଟ͍ͷͰɺେ੾ͦ͏ͳ෦෼͚ͩॻ͖·͢ • Gallium compiler ͷόοΫΤϯυ͸ C-- C--͸ C ͔Β struct ͱ union ൈ͍ͯ GC ͱྫ֎Λαϙʔτ • ΦϦδφϧͷ෦෼͸ɺλάແ͠ͷ஋͕ϙΠϯλ͔ͦΕҎ֎͔۠ ผ͢ΔͨΊʹɺܕ৘ใΛ༻͍Δ͜ͱ ʢݹయత GC ͸λάʹΑΓϙΠϯλ͔ͦΕҎ֎͔۠ผ͢Δʣ 34 / 37

Slide 38

Slide 38 text

ϕϯνϚʔΫ݁Ռ1 Gallium0 ͸ Gallium ͱόοΫΤϯυɾίʔυδΣωϨʔλΛڞ༗͠ ͯΔ͕ݹయతͳ boxed data representatin Λ࠾༻͍ͯ͠Δ 35 / 37

Slide 39

Slide 39 text

ϕϯνϚʔΫ݁Ռ2 • test1, 2 ͸਺஋ܭࢉͰ Unboxed ͳ int ͱ float ͷޮՌ͕ݱΕ͍ͯΔ • 5,6,8 Ͱ΋ box Խ͞Εͳ͍දݱͷϝϦοτΛڗडͰ͖͍ͯΔ • ͜ΕΒ͸ཁૉ͕શͯ box Խ͞ΕΔߏ଄ʹΞΫηε͢Δς ετ • ஋ͷड͚౉͠ʹ unboxed tuple, closure Λѻ͑ͨӨڹͰ͸ • test7 ͷ࿩ • ଟ૬తͰߴ֊ͳؔ਺Λଟ༻ͨ͠৔߹ɺuniform ͳදݱͷ΄ ͏͕ޮ཰͕ྑ͍ • ม׵ίʔυ͕୔ࢁૠೖ͞ΕΔͨΊɺ test7 ͸࿐ࠎʹͦͷӨ ڹ͕ग़͍ͯΔ • test7 ͸ int list Λ quad quad (λx.x + 1), quad = λf.λx.f(fx) ͰϚοϓ͢Δςετ 36 / 37

Slide 40

Slide 40 text

·ͱΊ • ੩తͳܕ৘ใΛίϯύΠϧʹ׆༻͠ɺͳΔ΂͘ unboxed ͳදݱ Λ༻͍Δγϯϓϧͳํ๏ΛఏҊ • ͦΕͰ΋ list ΍ array ͷཁૉ͸ box Խͤ͟ΔΛಘͳ͍͕ɺ unboxed ͳ tupleɺclosure ͳͲͷ༗༻ੑΛ֬ೝͨ͠ • ਺஋ܭࢉͰ͸໨֮·͘͠ޮ཰͕޲্͠ɺߴ֊ؔ਺Λଟ͘࢖͏ͱ ͖ʹ͸ޮ཰͕ѱ͍ࣄ͕Θ͔ͬͨ • ୯७ܕ෇͖ϥϜμܭࢉʴ let ଟ૬͕෼͔Δͱ࿦จಡΊ·͢!ʂ ʂ ʂ • ࿦จಡΉͷָ͍͠ʂ ʂ ʂ(’ Т’ ) ࡾ (’ Т’) ࡾ ( ’ Т’) 37 / 37