『基礎から学ぶ 組込みRust』執筆に寄せて〜Nature RemoへのRust導入の展望〜

Nature株式会社ファームウェアエンジニアの中林 (id:tomo-wait-for-it-yuki) です。 本記事では、拙著『基礎から学ぶ 組込みRust』1がC&R研究所様より出版されたので、書籍の紹介やNatureのファームウェア開発にRustを使っていきたい、ということを書きます。 本を書きましたエントリは個人ブログで書いている2ので、それとは少し違った観点から話をしたいと思います。

『基礎から学ぶ 組込みRust』の紹介

2021年5月現在、Rustはすでにマイナーの域を超えたと言って差し支えない状況でしょう。一方、組込みRustはまだまだマイナーな分野です。『基礎から学ぶ 組込みRust』出版をtwitterやブログで告知した際も、「Rustって組込みできたんだ?」という反応が少なくありませんでした。

マイナー扱いから脱するための施策として、認知度を上げ、入門を手厚くする、というのが王道だと思っています。Rustの入門ドキュメントは素晴らしい書籍がたくさん出ています。組込みRustのドキュメントもRust Embedded devices Working Groupが良いドキュメントを用意してくれています。しかし、Rustと組込みRustとの両方を1冊でカバーしている書籍は、これまでありませんでした。ここでなら私も貢献できそうだと感じ、ちょうどよいタイミングで執筆のお声がけをいただいたこともあり、Rustの文法もカバーした組込みRustの入門書を執筆することにしました (このあたりは先日のShinjuku.rs #153のLT4もご参照ください) 。

『基礎から学ぶ 組込みRust』はRustの文法や組込みの基礎から、マイコンモジュール『Wio Terminal』搭載のデバイスを制御するプログラムを作成する内容です (Rustも組込みも未経験だと、少ししんどいかもしれません) 。ボタンとLED/GPIO 、シリアル通信/UART 、タイマ/割り込み、ブザー/PWM 、光センサ/ADC 、加速度センサ/I2C 、LCD/SPI と組込み開発で頻繁に利用する要素のカバー率は高くなっています。 回路図やデータシートの参照方法から始まり、Rustの抽象化されたAPIをどう扱うかまで解説を書いています。書籍内のサンプルをWio Terminalで動かすだけでなく、その先、自身でWio Terminalにデバイスを追加したり、Wio Terminal以外のデバイスで組込みRustをお試しいただける内容になっていると自負しています。

組込みRustにかける思い

少し話が前後しますが、そもそも私が組込みRustに入れ込んで活動している理由について、少し説明します。 現在、組込み開発ではC/C++が圧倒的なシェアを占めています。C/C++を使うことの是非もあると思いますが、私にとってはそれほど重要ではありません。Cで全てを明示的にハンドリングするのが良いと思う人も居れば、C++の強力なテンプレートメタプログラミングを好む人も居るでしょう。組織としてはC/C++に熟練したプログラマに存分に力を発揮してもらって良いプロダクトを作ることを望むと思います。

その一方で、イケてるRustで組込み開発したい人が増えています。私もその1人です。ではRustの何が組込み開発でイケているのでしょう?書籍では、性能、信頼性、生産性を兼ね備える数少ないプログラミング言語であることを理由として挙げています (詳しくは書籍を読んでみてください!) 。せっかくなので、書かなかったことを書きましょう。

それは「Rustでプログラミングするのが楽しいから」です。確かにコンパイル通すのが難しい時があったり、適当に書いて動かすのが難しい時があったりします。ただ、それは本当はプログラム書くってことは、そういう設計について考えることだよね、って気がします。

オライリーから出版されている『プログラミングRust』5 (通称カニ本) の参照について書いてある章に、私の好きな1文があります。

Rustの本質は、プログラムを理解する苦労を、未来から現在に移すことにある。
プログラミングRust p.120 より

つまり、Rustでプログラムを作る、ということは、コンパイルを通す前に良い設計を考えなければならないのだ、ということを言っています (実際はRust的にはイケてないコードや安全なちょっとダメなコード書いてしまったりするのですが、まあ安全性が担保される設計にはしないといけないので許して欲しい) 。

Nature Remoがそうであるように、今や組込み機器のファームウェアもインターネット経由でアップデートできる時代ではありますが、それでも他のソフトウェアよりはアップデートするのが難しいことに変わりはありません。そのような組込み機器の開発に使うプログラミング言語だからこそ、コンパイル前に良い設計を考えなければいけないRustが適している、と思いませんか?思いますね。思いましょう。

Rustが組込み開発におけるC/C++に次ぐ第3の選択肢になる世界を作っていくのは、人生を費やすに値する挑戦だと確信しています。

Nature RemoへのRust導入の展望

Nature Remoのファームウェアは現在C言語で書かれています。しかし、チャンスがあればRust導入へのチャレンジを積極的に行いたいと考えています。プロダクトでの採用事例は、有無を言わさぬ説得力があります。その際、スクラッチからRustで書き直しました!みたいなことができるとセンセーショナルなのですが、もう少し地味なチャレンジを狙っています (結果が地味という意味で、必ずしも技術的にそちらの方が簡単、という意味ではないです)

まず第一に、Nature Remoのファームウェアは良い感じに書かれており、あえて全てをスクラッチから書き直す必要性はあまり感じていません。元々がC言語なので性能上の問題は存在しませんし、メモリリークバッファオーバーランもおおよそ潰してあるので安全性の面でも全面的に書き直すほどのモチベーションはありません。 そのため、全面的に書き直すよりは、使えるものはそのまま使いつつ、新規開発する部分や現時点でどうしても書き換えたいところだけをRustで書くのが理にかなっています。

また、プロダクトのファームウェアをスクラッチからRustで書くことができるのは極々一部で、C/C++の資産を使いたい、というのが大半だと考えています。そのため、C/C++の資産がある中で、小さくRustを導入するケースを作る、というのが、わたしよし、Natureよし、世間よしの三方よしな気がしています。

Rustが組込み開発で当たり前に選択肢になる世界、を目指して、今後もコツコツできることを積み重ねて行きます。 開設したエンジニアリングブログの第2弾で会社で採用していない技術を紹介させてもらえているように、Natureはそのようなチャレンジを応援してくれる会社です。

エンジニア積極採用中です

Natureでは一緒に開発してくれる仲間を募集しています。カジュアル面談等も歓迎なのでその場合はTwitterなどでお声がけくださると嬉しいです。

https://nature.global/careers/job/