Slide 1

Slide 1 text

組込みRustのすゝめ 中林 智之(connectFree株式会社)@LDScell 2019/06/17 Interface オフ会 ポインタが使えるモダンC++風言語Rust×組み込みの研究 1

Slide 2

Slide 2 text

アンケート Rust使ったことありますか? 1. まだ! 2. 入門はした 3. 組込み以外で書いている (趣味もOK) 4. 組込みで書いている (趣味もOK) 1.半分強 2. なし 3. 2割弱 4. 3割くらい 2

Slide 3

Slide 3 text

エグゼクティブサマリ Short Answer by 実践Rust入門〜はじめに〜 > Rustはモダンな機能で開発者の生産性を高めつつ、 > 安全で、ハードウェアの性能を最大限に発揮できる > 数少ないプログラミング言語 3 – エコシステム/ライブラリが不十分 →使えるところに導入していこう!  道を切り拓こう! なぜ組込みでRustなの? 一方、課題も…

Slide 4

Slide 4 text

諸注意 • 本プレゼンテーションに以下の意図は一切ありません – C, C++の完全否定 – C, C++は古臭くてダメ! – C, C++を一切使用するな! – 全てをRustで書くべき! • モチベーション – 触ってみてイケると思ったからみんなでやろーぜ! – CS発達の恩恵を活用しよう! 4

Slide 5

Slide 5 text

自己紹介 • 中林智之 (connectFree株式会社 組込みプログラマ) • Twitter: @LDScell • Interfaceでの記事掲載経験 – なし! – 今後のRust特集で…(お願いします!!!) 5

Slide 6

Slide 6 text

背景 • C, C++ (特にCの機能) は危険! – コンパイラが安全性を保証しない – 実行時にバグ / 脆弱性として顕在化 • 型安全性 – 未定義動作 • メモリ安全性 – メモリリーク、ダングリングポインタ • スレッド安全性 – データ競合 6

Slide 7

Slide 7 text

そうは言うけど 組込みって C/C++しか 選択肢ないで しょ? 7

Slide 8

Slide 8 text

• 組込み開発でもプログラミング言語が選 べる時代になりつつある • LLVMが登場 – GCCに匹敵するコンパイラ実装の敷 居が下がった 朗報 8

Slide 9

Slide 9 text

LLVM ↑フロントエンドを 頑張れば、新しいプログラミング言語が作 れる 9 Compiler Infrastructure LLVM 中間表現 最適化 機械語生成 フロントエンド

Slide 10

Slide 10 text

主な支援企業 Mozilla 利点 性能、生産性、安全性 言語仕様 難しい メモリ管理 多くをコンパイラが保証 その他 型安全、メモリ安全、スレッド 安全で、資源効率はCに匹敵 10

Slide 11

Slide 11 text

性能 (時間の都合上省略!) C言語に匹敵するというベンチマーク結果 • The Computer Language Benchmarks Game (Rust vs C) https://benchmarksgame-team.pages.debian.net/benchmarksgame/faster/rust.html • NIC Driver https://github.com/ixy-languages/ixy-languages Rust is blazingly fast and memory-efficient!

Slide 12

Slide 12 text

生産性 (時間の都合上省略!) • 気になる方向けのキーワード – cargo (パッケージマネージャ) – clippy (lint) – rustfmt (フォーマッタ) – 代数的データ型 (Enum) とパターンマッチ – トレイト / ジェネリクス – ビルトインのユニットテストフレームワーク

Slide 13

Slide 13 text

Rust安全性の ヒ・ミ・ツ♡ 13

Slide 14

Slide 14 text

コンパイラが 鬼!!! 悪いコードはいねぇがぁ~ 14

Slide 15

Slide 15 text

Rustコンパイラが鬼な理由 • 強い型付けシステム – C言語より圧倒的に型に対して厳しい • 所有権システム – ガベージコレクタなしでメモリを管理 – メモリ安全性がコンパイル時に保証 • メモリの2重解放を起こさない • ダングリングポインタを作らない • マルチスレッドでデータ競合を起こさない – リソースの自動解放 • メモリ、ファイルなどが不要になると、リソースを速やか に、一度だけ解放 15

Slide 16

Slide 16 text

所有権システムの重要要素 • 所有権 • 借用 • ライフタイム

Slide 17

Slide 17 text

所有権 • C言語では、複数の場所から変数を書き換え ることが可能 • *v1も*v2も同じ値を変更でき、バグの温床に なることも… 17 int32_t *v1 = malloc(sizeof(int32_t)); *v1 = 42; int32_t *v2 = v1; *v1 += 1; *v2 += 1; // value is `44`

Slide 18

Slide 18 text

int32_t *v1 = malloc(sizeof(int32_t)); *v1 = 42; int32_t *v2 = v1; *v1 += 1; *v2 += 1; // value is `44` 所有権 • C言語では、複数の場所から変数を書き換え ることが可能 • Cで*v1も*v2も同じ値を変更でき、バグの温 床に 18 Rustではできない!

Slide 19

Slide 19 text

所有権 • 値を変更できる唯一の所有者が存在 • マルチスレッドでも同様 • 同時に複数箇所から値を書き換えるコードはコ ンパイルエラー 19 let mut v1 = Box::new(42); let mut v2 = v1; *v1 += 1; // compile error *v2 += 1;

Slide 20

Slide 20 text

所有権 • 値を変更できる唯一の所有者が存在 • マルチスレッドでも同様 • 同時に複数箇所から値を書き換えるコードはコ ンパイルエラー 20 所有権が v2に移動 v1は値を 変更できない let mut v1 = Box::new(42); let mut v2 = v1; *v1 += 1; // compile error *v2 += 1;

Slide 21

Slide 21 text

借用 • 参照を作って所有権を貸すこと • 関数の引数渡しを便利にする 21 let mut v1 = Box::new(42); { let v2 = &mut v1; // *v1 += 1; // compile error **v2 += 1; } *v1 += 1;

Slide 22

Slide 22 text

借用 • 借用のルール – 誰かが書き換える可能性がある変数は、他の誰 も読むことすらできない – 誰も書き換えない変数は、複数の場所から読む ことができる 22 let mut v1 = Box::new(42); { let v2 = &mut v1; // println!("v1: {}", *v1); println!("v2: {}", **v2); } let mut v1 = Box::new(42); { let v2 = &v1; println!("v1: {}", *v1); println!("v2: {}", **v2); }

Slide 23

Slide 23 text

ライフタイム • 生存期間を終えた値(資源)は破棄される • 動的確保したメモリも、自動的に解放される (メモリリークを起こさない) • 生存期間を終えた変数へのアクセスはコンパ イルエラー(ダングリングポインタを作らない) 23 { let mut v1 = Box::new(42); } // ここでメモリが解放される

Slide 24

Slide 24 text

どのくらい安全なの? • C – 言語仕様の穴をMISRA-Cなどで補填(ツラい。お金 かかるし) • メモリリークやダングリングポインタは別途 • Rust Rustで普通にプログラミングするだけでMISRA-Cのルールを90%満 足できる – コンパイラ検査+公式lintツール (OSS) – メモリリークやダングリングポインタは発生しない 24 基本

Slide 25

Slide 25 text

組込みRustの課題 • C言語とのギャップが大きく、学習コストが高 い – シンタックス – セマンティクス • エコシステム – 商用レベルのRTOSがない – C/C++ほど資産がない • C/C++の資産を使いながら、新規開発部分 や最重要部分をRustで実装する 25

Slide 26

Slide 26 text

ゼロから始める組込みRust 1. 実践Rust入門 第一部 基礎編 – Rust自体への入門 2. Discovery – STM32F3DiscoveryでLチカから 3. The Embedded Rust Book / Embedonomicon – ちょっとずつディープに

Slide 27

Slide 27 text

まとめ • 組込み開発でも言語が選べる時代に • 現状、Rustが有力候補 • Rustは – 安全で – 生産性が高く – ハードウェアの性能を最大限発揮できる • 導入可能なところから使っていこう! 27

Slide 28

Slide 28 text

More Information • Rust公式ページ https://www.rust-lang.org/ • Rust Embedded devices WG https://github.com/rust-embedded/wg • Rust-JP Slack https://rust-jp.slack.com/ • twitter – #rust_jp – #shinjukurs – などなど

Slide 29

Slide 29 text

Rust学習リソース • Rustの日本語ドキュメント https://doc.rust-jp.rs/ • 書籍 – プログラミングRust (通称カニ本) – 実践Rust入門 (通称バイシクルブック) – プログラミングRust 公式ガイド

Slide 30

Slide 30 text

組込みRust和訳ドキュメント • The Embedded Rust Book – https://tomoyuki-nakabayashi.github.io/book/ (環境構築、ベストプラクティス集、マニュアル集) • Discovery – https://tomoyuki-nakabayashi.github.io/discov ery/ (STM32F3DiscoveryでLチカ / GDB利用方法など) • The Embedonomicon – https://tomoyuki-nakabayashi.github.io/embed onomicon/ (リンカセクション操作したりマニアックなアレコレ) 30