Slide 1

Slide 1 text

2021.8.30 Ѩ෦ߞೋ Rustೖֶࣜ Rustͷಛ௃ɺC/C++ͱͷҧ͍ΛͳΜͱͳ͘ཧղ͠Α͏

Slide 2

Slide 2 text

ࣗݾ঺հ ໨త ͳͥRust͔? C/C++ͷ՝୊ ϫʔΫ(Cͷ͍͋·͍ͳಈ࡞/RustͷϞμϯ͞Λମݧ) Rustͷ૊ࠐΈ։ൃ΁ͷద༻ ໨࣍ 2

Slide 3

Slide 3 text

■໊લɿѨ෦ɹߞೋ(͋΂ɹ͜͏͡) ■૊ࠐΈιϑτ΢ΣΞ։ൃ19೥໨ɻ ɹCݴޠɺOSͳ͠(ϕΞϝλϧ)ͷ։ൃۀ຿ܦݧ͕΄ͱΜͲɻ ■GitHub: https://github.com/grace2riku ɹࠓճͷϫʔΫͷιʔείʔυɿhttps://github.com/grace2riku/c_cpp_vs_rust/tree/master ࣗݾ঺հ 3

Slide 4

Slide 4 text

Rustͷֶश੒ՌΛͨ·ʹϥΠτχϯάτʔΫͳͲͰൃ৴͍ͯ͠·͢ɻ ྫ)Rustॳ৺ऀ͕ArduinoΛLνΧͯ͠Έͨ https://speakerdeck.com/grace2riku/rustchu-xin-zhe-gaarduinowoltikasitemita-bb5de094-8ee0-48a6- af6e-a8ce7d430309 ྫ)ArduinoͰϞʔλʔ੍ޚϩδοΫΛ࣮૷ͨ͠࿩ https://speakerdeck.com/grace2riku/arduinodemotazhi-yu-rozitukuwoshi-zhuang-sitahua ࣗݾ঺հ 4

Slide 5

Slide 5 text

ɾRustͬͯ͜ΜͳݴޠͳΜͩʔɺͱͳΜͱͳ͘Θ͔Δ͜ͱɻ ɹॳ৺ऀ޲͚ͷ಺༰Ͱ͢ɻ ɾC/C++ͱ3VTUͷҧ͍͕ͳΜͱͳ͘Θ͔Δ͜ͱɻ ɹ$$ܦݧऀ͕3VTUͷ҆શੑΛཧղ͢Δ͸͡ΊͷาͱͳΕ͹خ͍͠Ͱ͢ɻ ໨త 5

Slide 6

Slide 6 text

ɹ˙ࢿྉͷ࢖͍ํ ɹޙ൒ͷϫʔΫͰ͸$$ͱ3VTUͷίʔυΛॻ͍࣮ͯߦ͠·͢ɻ ɹίʔυɺ࣮ߦ݁ՌΛ௨ͯ͠$$ɾ3VTUͷ஌͕ࣝΞοϓσʔτͰ͖Ε͹خ͍͠ɻ ɹ$$ɾ3VTUͷίʔυΛ࣮ࡍʹखΛಈ͔࣮ͯ͠ߦɺ݁ՌΛ֬ೝ͢Δ͜ͱΛ͓קΊ͠·͢ɻ ɹίʔυͷ࣮ߦ͸ϒϥ΢βͰಈ͘γϛϡϨʔγϣϯ؀ڥΛ࢖͏ͷͰ։ൃ؀ڥͷ४උ͸ෆཁͰ͢ɻ ໨త 6

Slide 7

Slide 7 text

ɾ҆શɾ҆৺ɻ ⇛ଟػೳɺߴػೳɺෳࡶԽ͢Δ૊ࠐΈػثͷཁٻ࢓༷ʹC/C++Ͱཱͪ ޲͔͑Δ͔ɻ࣌୅ʹ߹Θͤͨϓϩάϥϛϯάݴޠͷ࠾༻Λݕ౼͢Δͷ ͸Ͳ͏͔ɻ ɾϞμϯ͔ͩΒɻ ͳͥRust͔? 7

Slide 8

Slide 8 text

ɾCͷ͍͋·͍ͳݴޠ࢓༷(ະఆٛಈ࡞) ɾϝϞϦ؅ཧ ɾC++͸೉͍͠ ɾͦͷଞ C/C++ͷ՝୊ 8

Slide 9

Slide 9 text

ɾCͷʲະఆٛಈ࡞ʳͱ͸? Cݴޠͷඪ४ن֨Ͱ͋ΔJIS X 3010ɿ2003(ISO/IEC 9899ɿ1999)ΑΓҾ༻ɻ ʲ3.4.3 ະఆٛͷಈ࡞ʢundefined behaviorʣ Մൖੑ͕ͳ͍ए͘͠͸ਖ਼͘͠ͳ͍ϓϩάϥϜߏ੒ཁૉ Λ࢖༻ͨ͠ͱ͖ͷಈ࡞ɼຢ͸ਖ਼͘͠ͳ͍σʔλΛ࢖༻ͨ͠ͱ͖ͷಈ࡞Ͱ͋Γɼ͜ͷن͕֨ԿΒཁٻ Λ՝͞ͳ͍΋ͷɻ ࢀߟ ະఆٛͷಈ࡞ʹରͯ͠ɼͦͷঢ়گΛແࢹͯ͠༧ଌෆՄೳͳ݁ՌΛฦͯ͠΋Α͍ɻ຋༁࣌ຢ͸ϓ ϩάϥϜ࣮ߦ࣌ʹɼจॻԽ͞Εͨɼ؀ڥʹಛ༗ͳํ๏Ͱॲཧͯ͠΋Α͍ʢ਍அϝοηʔδͷൃߦΛ ൐ͬͯ΋൐Θͳͯ͘΋Α͍ɻʣɻ͞Βʹʢ਍அϝοηʔδΛग़ྗ͠ʣ຋༁ຢ͸࣮ߦΛதஅͯ͠΋Α ͍ɻʳ C/C++ͷ՝୊ 9

Slide 10

Slide 10 text

ɾCͷະఆٛಈ࡞ͳͲ͍͋·͍ͳಈ࡞Λ͢ΔίʔυΛRustͰ࣮ߦ ͯ͠Έ·͠ΐ͏ɻ ϫʔΫ(Cͷ͍͋·͍ͳಈ࡞Λମݧ) 10

Slide 11

Slide 11 text

ςʔϚ͸ͪ͜Βɹ˞ϑΝΠϧ֦ுࢠ͸C͸*.c, Rust͸*.rs 1. ੔਺ܕΦʔόʔϑϩʔ: val_overflow.* 2. ະॳظԽม਺ͷࢀর: uninitialized_val.* 3. θϩׂΓ: div_by_zero.* 4. ഑ྻཁૉ֎ΞΫηε: array_index_err.* 5. ϏοτγϑτΦʔόʔϑϩʔ: shift_overflow.* 6. Ϗοτγϑτෛͷ਺: shift_negative.* ϫʔΫ(Cͷ͍͋·͍ͳಈ࡞Λମݧ) 11

Slide 12

Slide 12 text

ϫʔΫͷιʔείʔυ͸࣍ʹஔ͖·ͨ͠ɻ https://github.com/grace2riku/c_cpp_vs_rust/tree/master Code -> Download ZIPΛબ୒ɻ ϫʔΫ(Cͷ͍͋·͍ͳಈ࡞Λମݧ) 12

Slide 13

Slide 13 text

■ϫʔΫͷ؀ڥʹ͍ͭͯ ●C/C++͸࣍ͷΞυϨεͷγϛϡϨʔλ(wandbox)Λ࢖༻͠·͢ɻ ɹhttps://wandbox.org/ ●Rust͸࣍ͷΞυϨεͷγϛϡϨʔλ(Rust Playground)Λ࢖༻͠ ·͢ɻ ɹhttps://play.rust-lang.org/ ϫʔΫ(Cͷ͍͋·͍ͳಈ࡞Λମݧ) 13

Slide 14

Slide 14 text

■ϫʔΫͷ؀ڥʹ͍ͭͯɹCͷઃఆ ●Languages ɹ⇛C ●gcc 11.1.0Λબ୒ ϫʔΫ(Cͷ͍͋·͍ͳಈ࡞Λମݧ) 14

Slide 15

Slide 15 text

■ϫʔΫͷ؀ڥʹ͍ͭͯɹCͷઃఆ ●Cͷόʔδϣϯ͸ʲC99ʳΛબ୒ ※C99બ୒ͷཧ༝ ࢓ࣄͰ࢖͍ͬͯΔϚΠίϯͷίϯύΠϥ͕ C99४ڌͩͬͨͨΊɻ ϫʔΫ(Cͷ͍͋·͍ͳಈ࡞Λମݧ) 15

Slide 16

Slide 16 text

■ϫʔΫͷ؀ڥʹ͍ͭͯɹCͷઃఆ ᶃίʔυೖྗΤϦΞ ᶄίϯύΠϧɾίʔυ࣮ߦϘλϯ ᶅ࣮ߦ݁Ռදࣔ ΢ΥʔχϯάɾίϯύΠϧΤϥʔ ͕͋Ε͹දࣔɻ ϫʔΫ(Cͷ͍͋·͍ͳಈ࡞Λମݧ) 16 ᶃ ᶄ ᶅ

Slide 17

Slide 17 text

■ϫʔΫͷ؀ڥʹ͍ͭͯɹRustͷઃఆ ●σϑΥϧτ͔Βઃఆมߋෆཁɻ ᶃίʔυೖྗΤϦΞ ᶄ࣮ߦ݁Ռදࣔ ΢ΥʔχϯάɾίϯύΠϧΤϥʔ ͕͋Ε͹දࣔɻ ϫʔΫ(Cͷ͍͋·͍ͳಈ࡞Λମݧ) 17 ᶃ ᶄ

Slide 18

Slide 18 text

■ϫʔΫͷ؀ڥʹ͍ͭͯɹRustͷઃఆ σϑΥϧτͷઃఆ ɾStable version: 1.54 ɾEdition 2018 ϫʔΫ(Cͷ͍͋·͍ͳಈ࡞Λମݧ) 18

Slide 19

Slide 19 text

ςʔϚ͸ͪ͜Βɹ˞ϑΝΠϧ֦ுࢠ͸C͸*.c, C++͸*.cpp, Rust͸*.rs 1. enum, switch: enum_switch.* ɹCͱRustͷίʔυΛൺֱɻ ɹenumܕͷൺֱɻCͷswitchɾRustͷmatchࣜͷൺֱɻ 2. ଟଶ: polymorphism.* ɹC++ͱRustͷίʔυΛൺֱɻ ϫʔΫ(RustͷϞμϯ͞Λମݧ) 19

Slide 20

Slide 20 text

1. enum, switch: enum_switch.* ɹenumܕͷൺֱɻCͷswitchɾRustͷmatchࣜͷൺֱɻ ●ࢼͯ͠Έͯ΄͍͜͠ͱ ɾC:switchɾRust:matchจͷ৚݅Λͻͱͭ࡟আ࣮ͯ͠ߦɻ ɾprint_shape(Circle);ͷҾ਺CircleΛ0(·ͨ͸೚ҙͷ੔਺஋)ʹม ߋ࣮ͯ͠ߦɻ ϫʔΫ(RustͷϞμϯ͞Λମݧ) 20

Slide 21

Slide 21 text

2. ଟଶ: polymorphism.* ɾC++ͱRustͰଟଶΛ࣮૷ɻιʔείʔυΛൺֱͯ͠Έͯͩ͘͞ ͍ɻɹ ɾΫϥεਤͱ؆୯ͳઆ໌Λ࣍ϖʔδʹهࡌɻ ϫʔΫ(RustͷϞμϯ͞Λମݧ) 21

Slide 22

Slide 22 text

2. ଟଶ: polymorphism.*ɹ ɾଟଶͷઆ໌Ͱ͋Γͦ͏ͳαϯϓϧϓϩάϥϜΛ ɹC, RustͰͦΕͧΕ࣮૷ɻ ɾਤܗͱԁɾࡾ֯ܗɾਖ਼ํܗͷΫϥεɻ ɹShapeɿந৅Ϋϥε ɹCircle, Triangle, Square: ShapeΛ۩৅Խͨ͠Ϋϥε ɾprint_type(), calc_area(): ۩৅ԽΫϥεͰ࣮ߦ݁Ռ͕มΘΔɻ ϫʔΫ(RustͷϞμϯ͞Λମݧ) 22 ଟଶͷαϯϓϧίʔυͷΫϥεਤ

Slide 23

Slide 23 text

ੋඇɺ࣮ࡍʹखΛಈ͔ͯ͠ιʔείʔυΛγϛϡϨʔγϣϯͯ͠ Έ͍ͯͩ͘͞ɻ ͦͯ͠C/C++ͱRustͷίʔυʹ͍ͭͯߟ࡯ͯ͠ΈΔͱྑ͍ͱ͓΋ ͍·͢ɻ ※ຊॻ຤ඌʹιʔείʔυͷ࣮ߦ݁ՌΛهࡌ͠·͢ɻγϛϡϨʔ γϣϯ࣮ߦޙʹ֬ೝ͍͚ͨͩΕ͹ͱࢥ͍·͢ɻ ϫʔΫ(Cͷ͍͋·͍ͳಈ࡞Λମݧ) 23

Slide 24

Slide 24 text

͍͋·͍ͳίʔυ͕͋ͬͨͱ͖ɺίϯύΠϥʹ๬Ή͜ͱɻ ɹ1. ίϯύΠϥΤϥʔʹͯ͠ཉ͍͠ɻ ɹ2. ΢Υʔχϯά͸ग़ͯ͠ཉ͍͠ɻ ɹ3. ͍͋·͍ͳίʔυΛ࣮ߦͨ͠Β࣮ߦ࣌Τϥʔʹͯ͠ཉ͍͠ɻ ɹ4. ͍͋·͍ͳίʔυΛ࣮ߦ͠ɺ͍͋·͍ͳಈ࡞Λߦ͏ɻ ⾨͜͜ʹࢸΔલʹόάʹؾ͖ͮ௚͍ͨ͠!!! ɾιʔείʔυͷ࣮ߦલʹ͍͋·͍ͳίʔυʹؾ͖ͮɺमਖ਼͍ͨ͠ɻ΋࣮͠ߦͯ͠΋࣮ߦ࣌Τϥʔʹ͠ ͯཉ͍͠ɻ͍͋·͍ͳίʔυ͕૊Έࠐ·Ε΋ؾ͔ͮͣɺϦϦʔε͞Εͯ͠·͏͜ͱ΄Ͳා͍͜ͱ͸ͳ ͍ɻ ։ൃऀ͕ίϯύΠϥʹ๬Ή͜ͱ 24

Slide 25

Slide 25 text

ɾଟ͘ͷຊɺϒϩάͰRustΛARM Cortex-MίΞͰಈ͔͢νϡʔ τϦΞϧ͕ܝࡌ͞Ε͍ͯΔɻ࣮ػͰ֬ೝ͍ͨ͠৔߹ɺARM Cortex-MͷλʔήοτϘʔυ͕ݸਓతʹ͓͢͢Ίɻ ɾ࣮ػͷલʹखܰʹࢼͯ͠Έ͍ͨ৔߹ɺQEMUͰࢼͯ͠ΈΔͷ΋ ྑ͍͔΋͠ͳ͍ɻ ɾArduinoͰಈ͔ͨ͠ࣄྫ΋͋Δɻ Rustͷ૊ࠐΈ։ൃ΁ͷద༻ 25

Slide 26

Slide 26 text

ɾॴ༗ݖγεςϜɿίϯύΠϧͰ͖ͨΒϝϞϦ҆શੑΛอূɻ ɾCargoɿϏϧυπʔϧɾύοέʔδϚωʔδϟ ɹςετɾυΩϡϝϯτɾͦͷଞଟ͘ͷػೳɻ ɾC FFIɿRust㱻Cͷ૬ޓݺͼग़͠Մೳɻ ·ͩ·ͩ͋ΔΑɺRustͷັྗ——— 26

Slide 27

Slide 27 text

͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠ɻ ऴΘΓ 27

Slide 28

Slide 28 text

ɹҎ߱ʹϫʔΫͷC/C++, Rustͷιʔείʔυ ͷγϛϡϨʔγϣϯ࣮ߦ݁ՌΛهࡌ͠·͢ɻ γϛϡϨʔγϣϯ࣮ߦ֬ೝޙʹݟΔ͜ͱΛ͓ קΊ͠·͢ɻ ϫʔΫͷ࣮ߦ݁Ռ 28

Slide 29

Slide 29 text

ςʔϚ͸ͪ͜Βɹ˞ϑΝΠϧ֦ுࢠ͸C͸*.c,Rust͸*.rs ˒1. ੔਺ܕΦʔόʔϑϩʔ: val_overflow.* 2. ະॳظԽม਺ͷࢀর: uninitialized_val.* 3. θϩׂΓ: div_by_zero.* 4. ഑ྻཁૉ֎ΞΫηε: array_index_err.* 5. ϏοτγϑτΦʔόʔϑϩʔ: shift_overflow.* 6. Ϗοτγϑτෛͷ਺: shift_negative.* ϫʔΫ(Cͷ͍͋·͍ͳಈ࡞Λମݧ) 29

Slide 30

Slide 30 text

˒1. ੔਺ܕΦʔόʔϑϩʔ: val_overflow.* Cͷ৔߹ ⇛C͸warning, ࣮ߦՄೳɻ ϫʔΫ(Cͷ͍͋·͍ͳಈ࡞Λମݧ) 30

Slide 31

Slide 31 text

˒1. ੔਺ܕΦʔόʔϑϩʔ: val_overflow.* Rustͷ৔߹ ⇛ίϯύΠϧΤϥʔ, ࣮ߦෆՄೳɻ ϫʔΫ(Cͷ͍͋·͍ͳಈ࡞Λମݧ) 31

Slide 32

Slide 32 text

ςʔϚ͸ͪ͜Βɹ˞ϑΝΠϧ֦ுࢠ͸C͸*.c,Rust͸*.rs 1. ੔਺ܕΦʔόʔϑϩʔ: val_overflow.* ˒2. ະॳظԽม਺ͷࢀর: uninitialized_val.* 3. θϩׂΓ: div_by_zero.* 4. ഑ྻཁૉ֎ΞΫηε: array_index_err.* 5. ϏοτγϑτΦʔόʔϑϩʔ: shift_overflow.* 6. Ϗοτγϑτෛͷ਺: shift_negative.* ϫʔΫ(Cͷ͍͋·͍ͳಈ࡞Λମݧ) 32

Slide 33

Slide 33 text

˒2. ະॳظԽม਺ͷࢀর: uninitialized_val.* Cͷ৔߹ ⇛C͸warning, ࣮ߦՄೳɻ ϫʔΫ(Cͷ͍͋·͍ͳಈ࡞Λମݧ) 33

Slide 34

Slide 34 text

˒2. ະॳظԽม਺ͷࢀর: uninitialized_val.* Rustͷ৔߹ ⇛ίϯύΠϧΤϥʔ, ࣮ߦෆՄೳɻ ϫʔΫ(Cͷ͍͋·͍ͳಈ࡞Λମݧ) 34

Slide 35

Slide 35 text

ςʔϚ͸ͪ͜Βɹ˞ϑΝΠϧ֦ுࢠ͸C͸*.c,Rust͸*.rs 1. ੔਺ܕΦʔόʔϑϩʔ: val_overflow.* 2. ະॳظԽม਺ͷࢀর: uninitialized_val.* ˒3. θϩׂΓ: div_by_zero.* 4. ഑ྻཁૉ֎ΞΫηε: array_index_err.* 5. ϏοτγϑτΦʔόʔϑϩʔ: shift_overflow.* 6. Ϗοτγϑτෛͷ਺: shift_negative.* ϫʔΫ(Cͷ͍͋·͍ͳಈ࡞Λମݧ) 35

Slide 36

Slide 36 text

˒3. θϩׂΓ: div_by_zero.* Cͷ৔߹ ⇛C͸warning, ࣮ߦՄೳ⇛ྫ֎ൃੜɻ ϫʔΫ(Cͷ͍͋·͍ͳಈ࡞Λମݧ) 36

Slide 37

Slide 37 text

˒3. θϩׂΓ: div_by_zero.* Rustͷ৔߹ ⇛ίϯύΠϧΤϥʔ, ࣮ߦෆՄೳɻ ϫʔΫ(Cͷ͍͋·͍ͳಈ࡞Λମݧ) 37

Slide 38

Slide 38 text

ςʔϚ͸ͪ͜Βɹ˞ϑΝΠϧ֦ுࢠ͸C͸*.c,Rust͸*.rs 1. ੔਺ܕΦʔόʔϑϩʔ: val_overflow.* 2. ະॳظԽม਺ͷࢀর: uninitialized_val.* 3. θϩׂΓ: div_by_zero.* ˒4. ഑ྻཁૉ֎ΞΫηε: array_index_err.* 5. ϏοτγϑτΦʔόʔϑϩʔ: shift_overflow.* 6. Ϗοτγϑτෛͷ਺: shift_negative.* ϫʔΫ(Cͷ͍͋·͍ͳಈ࡞Λମݧ) 38

Slide 39

Slide 39 text

˒4. ഑ྻཁૉ֎ΞΫηε: array_index_err.* Cͷ৔߹ ⇛C͸࣮ߦՄೳɻ഑ྻཁૉ֎΁ΞΫηε͢Δɻ ϫʔΫ(Cͷ͍͋·͍ͳಈ࡞Λମݧ) 39

Slide 40

Slide 40 text

˒4. ഑ྻཁૉ֎ΞΫηε: array_index_err.* Rustͷ৔߹ ⇛࣮ߦՄೳɻ࣮ߦ࣌Τϥʔɻpanic!Λ࢖͑͹࣮ߦ࣌Τϥʔ಺༰͕Θ͔Δɻ ϫʔΫ(Cͷ͍͋·͍ͳಈ࡞Λମݧ) 40

Slide 41

Slide 41 text

ςʔϚ͸ͪ͜Βɹ˞ϑΝΠϧ֦ுࢠ͸C͸*.c,Rust͸*.rs 1. ੔਺ܕΦʔόʔϑϩʔ: val_overflow.* 2. ະॳظԽม਺ͷࢀর: uninitialized_val.* 3. θϩׂΓ: div_by_zero.* 4. ഑ྻཁૉ֎ΞΫηε: array_index_err.* ˒5. ϏοτγϑτΦʔόʔϑϩʔ: shift_overflow.* 6. Ϗοτγϑτෛͷ਺: shift_negative.* ϫʔΫ(Cͷ͍͋·͍ͳಈ࡞Λମݧ) 41

Slide 42

Slide 42 text

˒5. ϏοτγϑτΦʔόʔϑϩʔ: shift_overflow.* Cͷ৔߹ ⇛C͸warningɻ࣮ߦՄೳɻ ϫʔΫ(Cͷ͍͋·͍ͳಈ࡞Λମݧ) 42

Slide 43

Slide 43 text

˒5. ϏοτγϑτΦʔόʔϑϩʔ: shift_overflow.* Rustͷ৔߹ ⇛ίϯύΠϧΤϥʔ, ࣮ߦෆՄೳɻ ϫʔΫ(Cͷ͍͋·͍ͳಈ࡞Λମݧ) 43

Slide 44

Slide 44 text

ςʔϚ͸ͪ͜Βɹ˞ϑΝΠϧ֦ுࢠ͸C͸*.c,Rust͸*.rs 1. ੔਺ܕΦʔόʔϑϩʔ: val_overflow.* 2. ະॳظԽม਺ͷࢀর: uninitialized_val.* 3. θϩׂΓ: div_by_zero.* 4. ഑ྻཁૉ֎ΞΫηε: array_index_err.* 5. ϏοτγϑτΦʔόʔϑϩʔ: shift_overflow.* ˒6. Ϗοτγϑτෛͷ਺: shift_negative.* ϫʔΫ(Cͷ͍͋·͍ͳಈ࡞Λମݧ) 44

Slide 45

Slide 45 text

˒6. Ϗοτγϑτෛͷ਺: shift_negative.* Cͷ৔߹ ⇛C͸warningɻ࣮ߦՄೳɻ ϫʔΫ(Cͷ͍͋·͍ͳಈ࡞Λମݧ) 45

Slide 46

Slide 46 text

˒6. Ϗοτγϑτෛͷ਺: shift_negative.* Rustͷ৔߹ ⇛ίϯύΠϧΤϥʔ, ࣮ߦෆՄೳɻ ϫʔΫ(Cͷ͍͋·͍ͳಈ࡞Λମݧ) 46

Slide 47

Slide 47 text

ςʔϚ͸ͪ͜Βɹ˞ϑΝΠϧ֦ுࢠ͸C͸*.c, C++͸*.cpp, Rust͸*.rs 1. enum, switch: enum_switch.* ɹCͱRustͷίʔυΛൺֱɻ ɹenumܕͷൺֱɻCͷswitchɾRustͷmatchࣜͷൺֱɻ 2. ଟଶ: polymorphism.* ɹC++ͱRustͷίʔυΛൺֱɻ ϫʔΫ(RustͷϞμϯ͞Λମݧ) 47