Slide 1

Slide 1 text

੩తܕ෇͚ݴޠ$SZTUBM Crystal The Programming Language with Static Typing Hirofumi Wakasugi (@5t111111)

Slide 2

Slide 2 text

$SZTUBM͸੩తܕ෇͚ͷ ϓϩάϥϛϯάݴޠͰ͢ɻ

Slide 3

Slide 3 text

੩తܕ෇͚ w ม਺ͳͲͷܕ͸ίϯύΠϧ࣌ʹܾఆ͞Ε͍ͯΔ w ܕνΣοΫʹΑͬͯࣄલʹόάΛัଊ͠΍͍͢ w ม਺ͳͲͷܕ͸࣮ࡍͷ࣮ߦ࣌ͷ஋ʹͳΔ w ॊೈͰ࠶ར༻ੑͷߴ͍ϓϩάϥϜΛॻ͖΍͍͢ ಈతܕ෇͚

Slide 4

Slide 4 text

ಈతܕ෇͚ͷ3VCZͱ ੩తܕ෇͚ͷ$SZTUBM Ͳ͕ͬͪ༏ΕͯΔ͔ͱ͔ ͦ͏͍͏࿩͸͠·ͤΜʂ

Slide 5

Slide 5 text

$SZTUBM͕ ੩తܕ෇͚ݴޠͱͯ͠ ͲͷΑ͏ʹಇ͔͘ ୶ʑͱݟ͍͖ͯ·͢ɻ

Slide 6

Slide 6 text

ม਺ͷఆٛ a = 3 b = "we are like crystal, we break easy" c = [1, 2, 3] w ม਺Bͷܕ͸*OU w ม਺Cͷܕ͸4USJOH w ม਺Dͷܕ͸"SSBZ *OU ม਺͸ॳΊͯ஋͕୅ೖ͞Εͨͱ͖ʹએݴ͞ΕΔ

Slide 7

Slide 7 text

ม਺ͷఆٛ w ม਺Bͷܕ͸*OU w ม਺Cͷܕ͸4USJOH w ม਺Dͷܕ͸"SSBZ *OU ม਺͸ॳΊͯ஋͕୅ೖ͞Εͨͱ͖ʹએݴ͞ΕΔ a = 3 b = "we are like crystal, we break easy" c = [1, 2, 3] ܕਪ࿦ 
 5ZQF*OGFSFODF


Slide 8

Slide 8 text

ม਺΁ͷ࠶୅ೖ ͜Ε͸Ͳ͏ͳΔʁ Τϥʔʹͳͬͯ͠·͏ͷʁ ͢Ͱʹએݴ͞Εͯܕ͕ܾ·͍ͬͯΔม਺ʹ୅ೖ͢Δ a = "we are like crystal, it is not easy" a = 100

Slide 9

Slide 9 text

ม਺΁ͷ࠶୅ೖ ผͷܕΛม਺ʹ୅ೖͯ͠΋Τϥʔʹ͸ͳΒͳ͍ ม਺ͷܕ͸୅ೖ͞ΕΔࣜ ஋ ʹΑͬͯܕਪ࿦͞ΕΔ ͢Ͱʹએݴ͞Εͯܕ͕ܾ·͍ͬͯΔม਺ʹ୅ೖ͢Δ a = "we are like crystal, it is not easy" # ここで変数 a は String a = 100 # ここで変数 a は Int32

Slide 10

Slide 10 text

"SSBZͷܕ ͜Ε͸Ͳ͏ͳΔʁ ͍͚ͦ͏͡Όͳ͍ʁ *OUͷ"SSBZʹ4USJOHܕͷཁૉΛ௥Ճ͢Δ a = [1, 2, 3] a << "we are like crystal"

Slide 11

Slide 11 text

"SSBZͷܕ *OUͷ"SSBZʹ4USJOHܕͷཁૉΛ௥Ճ͢Δ a = [1, 2, 3] a << "we are like crystal" no overload matches 'Array(Int32)#<<' with types String Overloads are: - Array(Int32)#<<(value : Int32) a << "we are like crystal" ^~ ͜Ε͸ ίϯύΠϧΤϥʔ &SSPS

Slide 12

Slide 12 text

ۭͷ"SSBZ ܕΛࢦఆͤͣʹۭͷ"SSBZΛએݴ͢Δ͜ͱ͸Ͱ͖ͳ͍ a = [] # Syntax Error a = [] of Int32 # OK! ͱ͍͏͜ͱ͸ɺ ҟͳΔܕͷཁૉΛؚΉ"SSBZ͸ ࡞Εͳ͍ʁ

Slide 13

Slide 13 text

6OJPOܕ "SSBZ͸(FOFSJDܕͰ͋Γɺ 6OJPOܕΛؚΉ ཁૉ ͷܕΛࢦఆͰ͖Δ
 )BTIͳͲɺଞͷίϯςφ ίϨΫγϣϯ ܕ΋ಉ༷ ܕͷ૊Έ߹ΘͤΛදݱ͢Δ6OJPOܕ a = [1, 2, 3, "we are like crystal"] #=> Array(String | Int32) a = [] of String | Int32 #=> Array(String | Int32)

Slide 14

Slide 14 text

(FOFSJDܕ ޙͰઆ໌͠·͢͠·ͤΜ

Slide 15

Slide 15 text

ϝιουݺͼग़͠ ͜Ε͸Ͳ͏ͳΔʁ Τϥʔʹͳͬͯ͠·͏ͷʁ ͋Δܕ Ϋϥε ʹଘࡏ͠ͳ͍ϝιουΛݺͼग़ͨ͠৔߹ a = 3 a.size

Slide 16

Slide 16 text

ϝιουݺͼग़͠ ͋Δܕ Ϋϥε ʹଘࡏ͠ͳ͍ϝιουΛݺͼग़ͨ͠৔߹ a = 3 a.size undefined method 'size' for Int32 a.size ^~~~ ͜Ε͸ ίϯύΠϧΤϥʔ &SSPS

Slide 17

Slide 17 text

ϝιουҾ਺ def put_size(x) puts x.size end put_size("crystal") put_size(5) undefined method 'size' for Int32 puts x.size ^~~~ &SSPS Ҿ਺Ͱ౉͞ΕͨΦϒδΣΫτʹϝιου͕ͳ͍

Slide 18

Slide 18 text

ܕ੍໿ def put_size(x : String) puts x.size end put_size(5) no overload matches 'put_size' with types Int32 Overloads are: - put_size(x : String) put_size(5) ^~~~~~~~ &SSPS Ҿ਺ʹܕΞϊςʔγϣϯΛࢦఆ͠ܕΛ੍໿͢Δ

Slide 19

Slide 19 text

ܕ੍໿͕͋Δͱ҆৺ͩͶʂ
 Ҿ਺͸ͲΜͲΜܕ੍໿͠Α͏ʂ

Slide 20

Slide 20 text

3FϝιουҾ਺ def put_size(x) puts x.size end put_size("crystal") put_size([1, 2, 3]) Ҿ਺Ͱ౉͞ΕͨΦϒδΣΫτʹϝιου͕͋Δ ͑ͬʁ

Slide 21

Slide 21 text

3FϝιουҾ਺ def put_size(x) puts x.size end put_size("crystal") put_size([1, 2, 3]) Ҿ਺Ͱ౉͞ΕͨΦϒδΣΫτʹϝιου͕͋Δ 7 3 3FTVMU Τϥʔͳ͘ਖ਼ৗऴྃ͢Δ

Slide 22

Slide 22 text

3FϝιουҾ਺ def put_size(x) puts x.size end put_size("crystal") put_size([1, 2, 3]) Ҿ਺Ͱ౉͞ΕͨΦϒδΣΫτʹϝιου͕͋Δ 7 3 3FTVMU Τϥʔͳ͘ਖ਼ৗऴྃ͢Δ ໌֬ʹܕ੍໿͕͞Ε͍ͯ ͳ͚Ε͹ɺ͋Δܕ͕ݺͼ ग़͞ΕΔϝιουʹԠ౴ ͢Δͱ͖ɺίϯύΠϥͷ ܕνΣοΫ͸௨Δɻ

Slide 23

Slide 23 text

μοΫλΠϐϯάతͳܕγεςϜ ܕͦͷ΋ͷ΍ͦͷܧঝؔ܎ʹґଘ͠ͳ͍ɺ ॊೈੑΛ࣋ͬͨ੩తܕ෇͚ʹͳ͍ͬͯΔ γάωΠνϟ͕ಛʹॏཁͰ͋Δͱ͍͏఺Ͱɺ
 4USVDUVSBM4VCUZQJOH ߏ଄త෦෼ܕ෇͚  ͱݴͬͯ΋Α͍͔΋

Slide 24

Slide 24 text

3F3FϝιουҾ਺ def put_size(x) puts x.size end put_size("crystal") put_size(5) undefined method 'size' for Int32 puts x.size ^~~~ &SSPS ܕ੍໿Λ͠ͳͯ͘΋ίϯύΠϧ࣌ʹΤϥʔ͕ัଊ͞ΕΔ ෆඞཁͳܕ੍໿͸ ॊೈੑΛܽ͘

Slide 25

Slide 25 text

Πϯελϯεม਺ Πϯελϯεม਺΋୅ೖ͞ΕΔ஋͔Βܕਪ࿦͞ΕΔ class Person getter name def initialize(@name) end end barney = Person.new "Barney" barney.name #=> "Barney" barney.name.size #=> 6

Slide 26

Slide 26 text

barney = Person.new "Barney" barney.name.size one = Person.new 1 3FΠϯελϯεม਺ Πϯελϯεม਺ʹҟͳΔܕΛ༩͑ͯॳظԽ ͳΜ͔͓͔͍͠ͱ͋͜Δʁ

Slide 27

Slide 27 text

barney = Person.new "Barney" barney.name.size one = Person.new 1 3FΠϯελϯεม਺ Πϯελϯεม਺ʹҟͳΔܕΛ༩͑ͯॳظԽ undefined method 'size' for Int32 (compile-time type is (String | Int32)) barney.name.size #=> 4 ^~~~ ͜Ε͸ ίϯύΠϧΤϥʔ &SSPS

Slide 28

Slide 28 text

JGWBSJT@B ʜ JT@B ͰܕΛνΣοΫ੍͠ݶ͢Δ if a.is_a?(String) # ここでは a が # String で「ある」ことが保証される else # ここでは a が # String では「ない」ことが保証される end ίϯύΠϧ࣌ϦϑϨΫγϣϯʹΑΔܕͷอূ

Slide 29

Slide 29 text

JGWBSSFTQPOET@UP ʜ SFTQPOET@UP ͰԠ౴ΛνΣοΫ੍͠ݶ͢Δ if a.responds_to?(:size) # ここでは a が # size に応答「する」ことが保証される else # ここでは a が # size に応答「しない」ことが保証される end ίϯύΠϧ࣌ϦϑϨΫγϣϯʹΑΔϝιουԠ౴ͷอূ

Slide 30

Slide 30 text

3F3FΠϯελϯεม਺ JT@B ΍SFTQPOET@UP Ͱ੍ݶ͢Δ if (name = barney.name).is_a?(String) name.size #=> 4 end if (name = barney.name).responds_to?(:size) name.size #=> 4 end Πϯελϯεม਺ͷ৔߹͸ɺ্هͷΑ͏ʹҰ౓ม਺ʹ୅ೖ͢Δඞཁ͕͋Δ

Slide 31

Slide 31 text

BT BTͰܕΛ੍ݶ͢Δ͜ͱ΋Ͱ͖Δ name = barney.name as String name.size #=> 4 w BT͸࣮ߦ࣌ʹνΣοΫΛߦ͏ w ର৅͕4USJOHͰͳ͔ͬͨ৔߹ʹ͸ྫ֎͕ൃੜ w BT͸ΩϟετͰ͸ͳ͍ ผͷܕ΁ͷม׵͸͠ͳ͍

Slide 32

Slide 32 text

OJMBCMF ͋Δܕ͕/JMܕΛ࣋ͭՄೳੑ a = [] of String? a.class #=> Array(String?) a << "crystal" #=> ["crystal"] a << nil #=> ["crystal", nil] w 4USJOH ͸ܕ͕/JMܕΛ࣋ͭ͜ͱΛҙຯ͢Δ w 4USJOHc/JM ͱ͍͏6OJPOܕͱಉ༷

Slide 33

Slide 33 text

OJMBCMFΠϯελϯεม਺ JOJUJBMJ[FͰॳظԽ͞Εͳ͍Πϯελϯεม਺ class Person getter name property address def initialize(@name) end end barney = Person.new "Barney" barney.address = "Manchester" barney.address.size

Slide 34

Slide 34 text

OJMBCMFΠϯελϯεม਺ JOJUJBMJ[FͰॳظԽ͞Εͳ͍Πϯελϯεม਺ barney = Person.new "Barney" barney.address = "Manchester" barney.address.size undefined method 'size' for Nil (compile-time type is String?) barney.address.size ^~~~ &SSPS ͜Ε͸ ίϯύΠϧΤϥʔ JOJUJBMJ[FͰॳظԽ͞Εͳ͍Πϯελϯεม਺͸/JMܕΛ࣋ͭ

Slide 35

Slide 35 text

3FOJMBCMFΠϯελϯεม਺ Πϯελϯεม਺ΛJOJUJBMJ[Fͷ֎ଆͰॳظԽ͢Δ class Person getter name property address @address = "nowhere" def initialize(@name) end end barney = Person.new "Barney" barney.address = "Manchester" barney.address.size #=> 10

Slide 36

Slide 36 text

Πϯελϯεม਺ͷܕࢦఆ Πϯελϯεม਺ΛܕΞϊςʔγϣϯͰࢦఆ͢Δ class Person … @address :: String … end w !BEESFTTʹ4USJOHҎ֎ͷܕΛ୅ೖ͢ΔͱΤϥʔ w ܕͷσϑΥϧτ஋͸ଘࡏ͠ͳ͍ͷͰॳظԽ͸ඞཁ

Slide 37

Slide 37 text

·ͱΊ w $SZTUBM㱠3VCZ w தͰ΋੩తܕ෇͚ʹΑΔҧ͍͸ඇৗʹେ͖͍ ͦΕͰ΋ɺ We love Ruby's efficiency for writing code. ͱ͍͏ͷ͕$SZTUBMͷग़ൃ఺ͷͭͰ͋ΔΑ͏ʹɺ 3VCZͷॊೈੑ΍ੜ࢈ੑɺؾ͍͍࣋ͪॻ͖ຯΛҡ࣋ͯ͠ ੩తܕ෇͚ʹ͠Α͏ͱ͢Δ޻෉͕ਵॴʹݟΒΕΔɻ

Slide 38

Slide 38 text

࿩ͤͳ͔ͬͨ࿩୊ͨͪ w (FOFSJDܕ (FOFSJDT  w ྫ֎ॲཧ಺Ͱͷܕਪ࿦ͷಇ͖ w Ϋϩʔδϟ಺Ͱͷม਺ͷܕ w ϚΫϩʹ͓͚Δܕ৘ใ΁ͷΞΫηε w UZQFPGɺ0CKFDUUSZͳͲͷϝιου w FUDFUD

Slide 39

Slide 39 text

IUUQKBDSZTUBMMBOHPSHEPDT ࠓ೔࿩ͤͳ͔ͬͨ಺༰΋υΩϡϝϯτʹهࡌ͕͋Γ·͢

Slide 40

Slide 40 text

υΩϡϝϯτΛ͍ͭ΋VQUPEBUFʹ͢ΔͨΊʹ ຋༁Λख఻ͬͯ͘ΕΔํΛืू͍ͯ͠·͢ (JU)VC IUUQTHJUIVCDPNDSZTUBMKQKBDSZTUBMMBOHPSH (JUUFS IUUQTHJUUFSJNDSZTUBMKQKBDSZTUBMMBOHPSH ΋͘͠͸@5t111111·Ͱ௚઀͓஌Β͍ͤͩ͘͞ʂ 4MBDL IUUQDSZTUBMQJOFNPF

Slide 41

Slide 41 text

ຊεϥΠυதͷαϯϓϧίʔυ ͓Αͼͦͷग़ྗ಺༰͸ ͢΂ͯ$SZTUBMͰ֬ೝ͍ͯ͠·͢ ͝੩ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠ɻ