Upgrade to Pro — share decks privately, control downloads, hide ads and more …

20210830_Rust入学式.pdf

84931a5617d844ecfda982721de3a9e9?s=47 k-abe
August 30, 2021

 20210830_Rust入学式.pdf

2021.8.30 社内向け勉強会資料。
RustとC/C++のソースコードを実行し、比較する。

84931a5617d844ecfda982721de3a9e9?s=128

k-abe

August 30, 2021
Tweet

More Decks by k-abe

Other Decks in Programming

Transcript

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

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

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

  4. 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

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

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

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

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

  9. ɾCͷʲະఆٛಈ࡞ʳͱ͸? Cݴޠͷඪ४ن֨Ͱ͋ΔJIS X 3010ɿ2003(ISO/IEC 9899ɿ1999)ΑΓҾ༻ɻ ʲ3.4.3 ະఆٛͷಈ࡞ʢundefined behaviorʣ Մൖੑ͕ͳ͍ए͘͠͸ਖ਼͘͠ͳ͍ϓϩάϥϜߏ੒ཁૉ Λ࢖༻ͨ͠ͱ͖ͷಈ࡞ɼຢ͸ਖ਼͘͠ͳ͍σʔλΛ࢖༻ͨ͠ͱ͖ͷಈ࡞Ͱ͋Γɼ͜ͷن͕֨ԿΒཁٻ

    Λ՝͞ͳ͍΋ͷɻ ࢀߟ ະఆٛͷಈ࡞ʹରͯ͠ɼͦͷঢ়گΛແࢹͯ͠༧ଌෆՄೳͳ݁ՌΛฦͯ͠΋Α͍ɻ຋༁࣌ຢ͸ϓ ϩάϥϜ࣮ߦ࣌ʹɼจॻԽ͞Εͨɼ؀ڥʹಛ༗ͳํ๏Ͱॲཧͯ͠΋Α͍ʢ਍அϝοηʔδͷൃߦΛ ൐ͬͯ΋൐Θͳͯ͘΋Α͍ɻʣɻ͞Βʹʢ਍அϝοηʔδΛग़ྗ͠ʣ຋༁ຢ͸࣮ߦΛதஅͯ͠΋Α ͍ɻʳ C/C++ͷ՝୊ 9
  10. ɾCͷະఆٛಈ࡞ͳͲ͍͋·͍ͳಈ࡞Λ͢ΔίʔυΛRustͰ࣮ߦ ͯ͠Έ·͠ΐ͏ɻ ϫʔΫ(Cͷ͍͋·͍ͳಈ࡞Λମݧ) 10

  11. ςʔϚ͸ͪ͜Βɹ˞ϑΝΠϧ֦ுࢠ͸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
  12. ϫʔΫͷιʔείʔυ͸࣍ʹஔ͖·ͨ͠ɻ https://github.com/grace2riku/c_cpp_vs_rust/tree/master Code -> Download ZIPΛબ୒ɻ ϫʔΫ(Cͷ͍͋·͍ͳಈ࡞Λମݧ) 12

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

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

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

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

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

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

  19. ςʔϚ͸ͪ͜Βɹ˞ϑΝΠϧ֦ுࢠ͸C͸*.c, C++͸*.cpp, Rust͸*.rs 1. enum, switch: enum_switch.* ɹCͱRustͷίʔυΛൺֱɻ ɹenumܕͷൺֱɻCͷswitchɾRustͷmatchࣜͷൺֱɻ 2.

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

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

  22. 2. ଟଶ: polymorphism.*ɹ ɾଟଶͷઆ໌Ͱ͋Γͦ͏ͳαϯϓϧϓϩάϥϜΛ ɹC, RustͰͦΕͧΕ࣮૷ɻ ɾਤܗͱԁɾࡾ֯ܗɾਖ਼ํܗͷΫϥεɻ ɹShapeɿந৅Ϋϥε ɹCircle, Triangle,

    Square: ShapeΛ۩৅Խͨ͠Ϋϥε ɾprint_type(), calc_area(): ۩৅ԽΫϥεͰ࣮ߦ݁Ռ͕มΘΔɻ ϫʔΫ(RustͷϞμϯ͞Λମݧ) 22 ଟଶͷαϯϓϧίʔυͷΫϥεਤ
  23. ੋඇɺ࣮ࡍʹखΛಈ͔ͯ͠ιʔείʔυΛγϛϡϨʔγϣϯͯ͠ Έ͍ͯͩ͘͞ɻ ͦͯ͠C/C++ͱRustͷίʔυʹ͍ͭͯߟ࡯ͯ͠ΈΔͱྑ͍ͱ͓΋ ͍·͢ɻ ※ຊॻ຤ඌʹιʔείʔυͷ࣮ߦ݁ՌΛهࡌ͠·͢ɻγϛϡϨʔ γϣϯ࣮ߦޙʹ֬ೝ͍͚ͨͩΕ͹ͱࢥ͍·͢ɻ ϫʔΫ(Cͷ͍͋·͍ͳಈ࡞Λମݧ) 23

  24. ͍͋·͍ͳίʔυ͕͋ͬͨͱ͖ɺίϯύΠϥʹ๬Ή͜ͱɻ ɹ1. ίϯύΠϥΤϥʔʹͯ͠ཉ͍͠ɻ ɹ2. ΢Υʔχϯά͸ग़ͯ͠ཉ͍͠ɻ ɹ3. ͍͋·͍ͳίʔυΛ࣮ߦͨ͠Β࣮ߦ࣌Τϥʔʹͯ͠ཉ͍͠ɻ ɹ4. ͍͋·͍ͳίʔυΛ࣮ߦ͠ɺ͍͋·͍ͳಈ࡞Λߦ͏ɻ ⾨͜͜ʹࢸΔલʹόάʹؾ͖ͮ௚͍ͨ͠!!!

    ɾιʔείʔυͷ࣮ߦલʹ͍͋·͍ͳίʔυʹؾ͖ͮɺमਖ਼͍ͨ͠ɻ΋࣮͠ߦͯ͠΋࣮ߦ࣌Τϥʔʹ͠ ͯཉ͍͠ɻ͍͋·͍ͳίʔυ͕૊Έࠐ·Ε΋ؾ͔ͮͣɺϦϦʔε͞Εͯ͠·͏͜ͱ΄Ͳා͍͜ͱ͸ͳ ͍ɻ ։ൃऀ͕ίϯύΠϥʹ๬Ή͜ͱ 24
  25. ɾଟ͘ͷຊɺϒϩάͰRustΛARM Cortex-MίΞͰಈ͔͢νϡʔ τϦΞϧ͕ܝࡌ͞Ε͍ͯΔɻ࣮ػͰ֬ೝ͍ͨ͠৔߹ɺARM Cortex-MͷλʔήοτϘʔυ͕ݸਓతʹ͓͢͢Ίɻ ɾ࣮ػͷલʹखܰʹࢼͯ͠Έ͍ͨ৔߹ɺQEMUͰࢼͯ͠ΈΔͷ΋ ྑ͍͔΋͠ͳ͍ɻ ɾArduinoͰಈ͔ͨ͠ࣄྫ΋͋Δɻ Rustͷ૊ࠐΈ։ൃ΁ͷద༻ 25

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

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

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

  29. ςʔϚ͸ͪ͜Βɹ˞ϑΝΠϧ֦ுࢠ͸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
  30. ˒1. ੔਺ܕΦʔόʔϑϩʔ: val_overflow.* Cͷ৔߹ ⇛C͸warning, ࣮ߦՄೳɻ ϫʔΫ(Cͷ͍͋·͍ͳಈ࡞Λମݧ) 30

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

  32. ςʔϚ͸ͪ͜Βɹ˞ϑΝΠϧ֦ுࢠ͸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
  33. ˒2. ະॳظԽม਺ͷࢀর: uninitialized_val.* Cͷ৔߹ ⇛C͸warning, ࣮ߦՄೳɻ ϫʔΫ(Cͷ͍͋·͍ͳಈ࡞Λମݧ) 33

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

  35. ςʔϚ͸ͪ͜Βɹ˞ϑΝΠϧ֦ுࢠ͸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
  36. ˒3. θϩׂΓ: div_by_zero.* Cͷ৔߹ ⇛C͸warning, ࣮ߦՄೳ⇛ྫ֎ൃੜɻ ϫʔΫ(Cͷ͍͋·͍ͳಈ࡞Λମݧ) 36

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

  38. ςʔϚ͸ͪ͜Βɹ˞ϑΝΠϧ֦ுࢠ͸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
  39. ˒4. ഑ྻཁૉ֎ΞΫηε: array_index_err.* Cͷ৔߹ ⇛C͸࣮ߦՄೳɻ഑ྻཁૉ֎΁ΞΫηε͢Δɻ ϫʔΫ(Cͷ͍͋·͍ͳಈ࡞Λମݧ) 39

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

  41. ςʔϚ͸ͪ͜Βɹ˞ϑΝΠϧ֦ுࢠ͸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
  42. ˒5. ϏοτγϑτΦʔόʔϑϩʔ: shift_overflow.* Cͷ৔߹ ⇛C͸warningɻ࣮ߦՄೳɻ ϫʔΫ(Cͷ͍͋·͍ͳಈ࡞Λମݧ) 42

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

  44. ςʔϚ͸ͪ͜Βɹ˞ϑΝΠϧ֦ுࢠ͸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
  45. ˒6. Ϗοτγϑτෛͷ਺: shift_negative.* Cͷ৔߹ ⇛C͸warningɻ࣮ߦՄೳɻ ϫʔΫ(Cͷ͍͋·͍ͳಈ࡞Λମݧ) 45

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

  47. ςʔϚ͸ͪ͜Βɹ˞ϑΝΠϧ֦ுࢠ͸C͸*.c, C++͸*.cpp, Rust͸*.rs 1. enum, switch: enum_switch.* ɹCͱRustͷίʔυΛൺֱɻ ɹenumܕͷൺֱɻCͷswitchɾRustͷmatchࣜͷൺֱɻ 2.

    ଟଶ: polymorphism.* ɹC++ͱRustͷίʔυΛൺֱɻ ϫʔΫ(RustͷϞμϯ͞Λମݧ) 47