組み込みRustの学習を開始するには?Rustの概要と環境構築を紹介

Hello_Rust_Worldソフト

OS等の低レイヤーのソフト開発での採用が増えてきて注目されているプログラミング言語のRust。組み込み業界でもC/C++に代わり得る言語として注目を集めつつあります。

この記事では組み込みRustを学習するために、Rustの概要と開発環境構築、評価ボードや参考書籍を紹介します。

なお、開発環境はWindows10上に構築していきます。

こんな方におすすめの記事
  • Rustというプログラミング言語を初めて知った
  • Rustの学習を開始したい
  • 組み込み開発でRustを試してみたい

そもそもRustとは?

概要

Rustとは比較的新しいプログラミング言語です。

メモリ安全性が確保されていながらC/C++と同等の実行速度があるので、C/C++の代替となる可能性を秘めた言語として近年注目されており、大手企業でもOSの開発に使われ始めています。未だに?C/C++が主力言語である組み込み分野もRustの有用性が認識され始めています。

最大の特徴であるメモリ安全性の確保はコンパイル時にチェックできる言語設計がされており、メモリ安全性の無いコードはコンパイルエラーが出るようになっています。3つほど紹介します。

所有権

Rustではポインタやオブジェクトはただ1つの変数のみが所有権をもっています。他の言語と違い”=”による代入はコピーではなく所有権の移動です。下のようなコードはコンパイルエラーになります。

fn main(){
    //"hello"という文字列をメモリに確保、変数s1が所有者になる。
    let s1 = String::from("hello");
    
    //"hello"文字列の所有権をs2に渡す。s1は何も所有していない状態
    let s2 = s1;

    //s1は何も所有していない。ビルドエラーが発生する
    println!("{}", s1);
}

このように、オブジェクトの所有者が1変数に限られることで、非同期処理で知らない間に値が変わってしまったり、デストラクタで2重にメモリ解放してしまうような心配をする必要が無くなります。

ライフタイム

Rustでは、オブジェクトの寿命(ライフタイム)をコンパイラが確認してくれます。下のようなコードはコンパイルできません。

fn main(){
    println!("{}", gen_str());
}

fn gen_str() -> &String{
    let s = String::from("hello");
    
    //sの寿命はgen_str関数内だけ。
    //その参照を戻り値にするのはコンパイルエラー
    return &s;
}

C/C++だと参照(ポインタ)先が有効なメモリ領域なのかどうかはプログラマが注意する必要があります(コンパイルできてしまう)。Rustではそのような事はありません。

Null参照

C/C++の発生するバグに、Nullを有効な値としてアクセスしてしまうというものがあります。Nullのチェックをするコードを記述しなくても何の問題もなくコンパイルが出来てしまいますし、多くの場合では正しく動作するので問題の発見も遅れます。

RustにはNullがありません。その代わりにOption<T>型と言われる型を使います。この型は下記2つの状態をもつ列挙体です。

  • Some:任意の有効な型<T>の値
  • None:有効な値を持っていない

これは下のコードのように使われます。matchという構文はC言語のswitch文に似ています。Rustらしい特徴として、分岐処理が変数(x)の取りうる値すべてを網羅しているかをコンパイラがチェックしてくれます。

つまり、Option<T>型とmatchを使用することで、変数が有効な値をもっていないときの処理を記述忘れすることが無くなります。

fn plus_one(x: Option<i32>) -> Option<i32>{
    match x {
        None => None,
        Some(i) => Some(i+1),
    }
}

Rust開発の環境構築

ここでは、組み込みでないRustの環境構築を紹介します。下記をインストールすればPC上でRustをコンパイルして実行できるようになります。Rustに触れてみたいという方は是非、環境構築してみてください。

組み込みRustの環境構築には、さらに追加でマイコン/ボード固有のソフトやライブラリが必要となります。下の記事では、STマイクロのNucleoシリーズボードで開発環境を構築する方法について記載しています。こちらも参考にしてください。(本記事の環境が出来ていることが前提の記事です。)

その他のマイコンやボードで開発をしたい場合、ターゲット毎にやるべきことが違ってくるので関連書籍などをご参照ください。

2021年現在では、マイコンメーカから正式リリースされた公式のRust開発環境というものは無さそうです。

リンカ

RustはCコンパイラのリンカを使っています。”Build Tools for Visual Studio 2019” をダウンロードしてきて、”C++ Build Tools”というツールのインストールを行います。

Rustツールチェイン

rustup.rs – The Rust toolchain installer から、rustup-init.exe をダウンロード、実行します。

セキュリティ関係でワーニングが出るかもしれませんが、問題無いとして進めます。(会社でやるなら要確認)コンソールが立ち上がりますので、”1”+Enter でデフォルトのインストールをしておきます。

Visual Studio Code

テキストエディタ、デバッグツールとしては、超メジャーなVisual Studio Codeを使うのがおススメです。Visual Studio Code には大量の拡張機能が用意されており、下記の拡張機能をインストールすることでRust開発環境として使用できます。

インストール方法はググれば大量に出てくるので割愛。

VScode拡張機能

Visual Studio Codeの拡張機能としてrust-analyzerをインストールします。VSCodeのWindow左の拡張機能をクリック、rust-analyzerで検索/選択すればインストール画面が出てきます。

git for Windows

Rustはビルドに必要なライブラリやソースコードをGitで取得しに行きますので、Gitのインストールが必要になります。Git for Windowsからインストーラをダウンロード、すべてデフォルトでインストールすればOKです。

ターゲットボード

組み込み開発が目的なので、ボードも用意しないといけません。

Rustの入門としてよく紹介されているのは、STM32Discovery、Nucleoシリーズ、Wio Terminal といったところです。

とりあえず最初は、このあたりのボードを仕入れて公式や書籍のチュートリアルを進めて行けば良いです。

自作ボードやその他マイコンでの開発はその後に始めるのが無難です。

組み込みRust関連書籍

組み込みRustの書籍は2021年現在、下記の3冊ほどあります。

https://amzn.to/32x1Dzg

ウェブアプリケーションなどRustのいろいろな用途が紹介されています。組み込みもその中の1例として紹介されています。Rust開発環境に関する説明も豊富です。

Bitly

組み込みRust開発にターゲットを絞った書籍です。WioTerminalをターゲットとして、環境構築や各種機能の使い方が豊富に書かれています。

Bitly

C/C++に取って代わる(かもしれない)組み込み開発言語として、特集が組まれています。この特集でRustという言語や、組み込みで使われる可能性を始めて知った人も多いのではないでしょうか。

どの書籍も、Rustの言語仕様に関する網羅的な記述はない(書ききれないですからね)ので、公式Webサイトや別途言語仕様にフォーカスした書籍で学習すると良さそうです。私は、最初は”基礎から学ぶ組込みRust”にてWioTerminalを使って学習をしました。

コメント