Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Embedded-Rust
Search
tomoyuki-nakabayashi
June 17, 2019
Programming
1
3.1k
Embedded-Rust
tomoyuki-nakabayashi
June 17, 2019
Tweet
Share
More Decks by tomoyuki-nakabayashi
See All by tomoyuki-nakabayashi
Nature Remo SDKアップデートの軌跡
tomoyuki
1
1.2k
How to learn Embedded Rust Edition 2021
tomoyuki
0
1.5k
hello-world-on-RTOS
tomoyuki
0
890
Baremetal Rust for RISC-V
tomoyuki
5
1.2k
Other Decks in Programming
See All in Programming
フルサイクルエンジニアリングをAI Agentで全自動化したい 〜構想と現在地〜
kamina_zzz
0
400
AIと一緒にレガシーに向き合ってみた
nyafunta9858
0
180
【卒業研究】会話ログ分析によるユーザーごとの関心に応じた話題提案手法
momok47
0
190
Spinner 軸ズレ現象を調べたらレンダリング深淵に飲まれた #レバテックMeetup
bengo4com
1
230
AI によるインシデント初動調査の自動化を行う AI インシデントコマンダーを作った話
azukiazusa1
1
700
ThorVG Viewer In VS Code
nors
0
770
16年目のピクシブ百科事典を支える最新の技術基盤 / The Modern Tech Stack Powering Pixiv Encyclopedia in its 16th Year
ahuglajbclajep
5
1k
今から始めるClaude Code超入門
448jp
8
8.6k
Package Management Learnings from Homebrew
mikemcquaid
0
210
それ、本当に安全? ファイルアップロードで見落としがちなセキュリティリスクと対策
penpeen
7
2.6k
コントリビューターによるDenoのすゝめ / Deno Recommendations by a Contributor
petamoriken
0
200
Smart Handoff/Pickup ガイド - Claude Code セッション管理
yukiigarashi
0
130
Featured
See All Featured
How to build an LLM SEO readiness audit: a practical framework
nmsamuel
1
640
Joys of Absence: A Defence of Solitary Play
codingconduct
1
290
Gemini Prompt Engineering: Practical Techniques for Tangible AI Outcomes
mfonobong
2
280
Facilitating Awesome Meetings
lara
57
6.7k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
287
14k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
38
2.7k
Marketing Yourself as an Engineer | Alaka | Gurzu
gurzu
0
130
Navigating Team Friction
lara
192
16k
Java REST API Framework Comparison - PWX 2021
mraible
34
9.1k
Tips & Tricks on How to Get Your First Job In Tech
honzajavorek
0
430
Raft: Consensus for Rubyists
vanstee
141
7.3k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.7k
Transcript
組込みRustのすゝめ 中林 智之(connectFree株式会社)@LDScell 2019/06/17 Interface オフ会 ポインタが使えるモダンC++風言語Rust×組み込みの研究 1
アンケート Rust使ったことありますか? 1. まだ! 2. 入門はした 3. 組込み以外で書いている (趣味もOK) 4.
組込みで書いている (趣味もOK) 1.半分強 2. なし 3. 2割弱 4. 3割くらい 2
エグゼクティブサマリ Short Answer by 実践Rust入門〜はじめに〜 > Rustはモダンな機能で開発者の生産性を高めつつ、 > 安全で、ハードウェアの性能を最大限に発揮できる >
数少ないプログラミング言語 3 – エコシステム/ライブラリが不十分 →使えるところに導入していこう! 道を切り拓こう! なぜ組込みでRustなの? 一方、課題も…
諸注意 • 本プレゼンテーションに以下の意図は一切ありません – C, C++の完全否定 – C, C++は古臭くてダメ! –
C, C++を一切使用するな! – 全てをRustで書くべき! • モチベーション – 触ってみてイケると思ったからみんなでやろーぜ! – CS発達の恩恵を活用しよう! 4
自己紹介 • 中林智之 (connectFree株式会社 組込みプログラマ) • Twitter: @LDScell • Interfaceでの記事掲載経験
– なし! – 今後のRust特集で…(お願いします!!!) 5
背景 • C, C++ (特にCの機能) は危険! – コンパイラが安全性を保証しない – 実行時にバグ
/ 脆弱性として顕在化 • 型安全性 – 未定義動作 • メモリ安全性 – メモリリーク、ダングリングポインタ • スレッド安全性 – データ競合 6
そうは言うけど 組込みって C/C++しか 選択肢ないで しょ? 7
• 組込み開発でもプログラミング言語が選 べる時代になりつつある • LLVMが登場 – GCCに匹敵するコンパイラ実装の敷 居が下がった 朗報 8
LLVM ↑フロントエンドを 頑張れば、新しいプログラミング言語が作 れる 9 Compiler Infrastructure LLVM 中間表現 最適化
機械語生成 フロントエンド
主な支援企業 Mozilla 利点 性能、生産性、安全性 言語仕様 難しい メモリ管理 多くをコンパイラが保証 その他 型安全、メモリ安全、スレッド
安全で、資源効率はCに匹敵 10
性能 (時間の都合上省略!) 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!
生産性 (時間の都合上省略!) • 気になる方向けのキーワード – cargo (パッケージマネージャ) – clippy (lint)
– rustfmt (フォーマッタ) – 代数的データ型 (Enum) とパターンマッチ – トレイト / ジェネリクス – ビルトインのユニットテストフレームワーク
Rust安全性の ヒ・ミ・ツ♡ 13
コンパイラが 鬼!!! 悪いコードはいねぇがぁ~ 14
Rustコンパイラが鬼な理由 • 強い型付けシステム – C言語より圧倒的に型に対して厳しい • 所有権システム – ガベージコレクタなしでメモリを管理 –
メモリ安全性がコンパイル時に保証 • メモリの2重解放を起こさない • ダングリングポインタを作らない • マルチスレッドでデータ競合を起こさない – リソースの自動解放 • メモリ、ファイルなどが不要になると、リソースを速やか に、一度だけ解放 15
所有権システムの重要要素 • 所有権 • 借用 • ライフタイム
所有権 • C言語では、複数の場所から変数を書き換え ることが可能 • *v1も*v2も同じ値を変更でき、バグの温床に なることも… 17 int32_t *v1
= malloc(sizeof(int32_t)); *v1 = 42; int32_t *v2 = v1; *v1 += 1; *v2 += 1; // value is `44`
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ではできない!
所有権 • 値を変更できる唯一の所有者が存在 • マルチスレッドでも同様 • 同時に複数箇所から値を書き換えるコードはコ ンパイルエラー 19 let
mut v1 = Box::new(42); let mut v2 = v1; *v1 += 1; // compile error *v2 += 1;
所有権 • 値を変更できる唯一の所有者が存在 • マルチスレッドでも同様 • 同時に複数箇所から値を書き換えるコードはコ ンパイルエラー 20 所有権が
v2に移動 v1は値を 変更できない let mut v1 = Box::new(42); let mut v2 = v1; *v1 += 1; // compile error *v2 += 1;
借用 • 参照を作って所有権を貸すこと • 関数の引数渡しを便利にする 21 let mut v1 =
Box::new(42); { let v2 = &mut v1; // *v1 += 1; // compile error **v2 += 1; } *v1 += 1;
借用 • 借用のルール – 誰かが書き換える可能性がある変数は、他の誰 も読むことすらできない – 誰も書き換えない変数は、複数の場所から読む ことができる 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); }
ライフタイム • 生存期間を終えた値(資源)は破棄される • 動的確保したメモリも、自動的に解放される (メモリリークを起こさない) • 生存期間を終えた変数へのアクセスはコンパ イルエラー(ダングリングポインタを作らない) 23
{ let mut v1 = Box::new(42); } // ここでメモリが解放される
どのくらい安全なの? • C – 言語仕様の穴をMISRA-Cなどで補填(ツラい。お金 かかるし) • メモリリークやダングリングポインタは別途 • Rust
Rustで普通にプログラミングするだけでMISRA-Cのルールを90%満 足できる – コンパイラ検査+公式lintツール (OSS) – メモリリークやダングリングポインタは発生しない 24 基本
組込みRustの課題 • C言語とのギャップが大きく、学習コストが高 い – シンタックス – セマンティクス • エコシステム
– 商用レベルのRTOSがない – C/C++ほど資産がない • C/C++の資産を使いながら、新規開発部分 や最重要部分をRustで実装する 25
ゼロから始める組込みRust 1. 実践Rust入門 第一部 基礎編 – Rust自体への入門 2. Discovery –
STM32F3DiscoveryでLチカから 3. The Embedded Rust Book / Embedonomicon – ちょっとずつディープに
まとめ • 組込み開発でも言語が選べる時代に • 現状、Rustが有力候補 • Rustは – 安全で –
生産性が高く – ハードウェアの性能を最大限発揮できる • 導入可能なところから使っていこう! 27
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 – などなど
Rust学習リソース • Rustの日本語ドキュメント https://doc.rust-jp.rs/ • 書籍 – プログラミングRust (通称カニ本) –
実践Rust入門 (通称バイシクルブック) – プログラミングRust 公式ガイド
組込み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