Rust 言語による開発
Rust言語は速度,並列処理性,安全性を言語仕様として保証する C/C++ を置き替えるシステムプログラミングに適した言語を目指している.2006年から開発が始まり2015年に 1.0版がリリースされている.
2021年2月8日にはオープンソースのプログラミング言語 Rust とその周辺環境を支援する独立非営利団体 Rust
Foundation が設立されている.
Rust の公式サイト(www.rust.lang.org) では,Rust
のインストール方法,学習用ドキュメント,各種ツールなどが紹介されている.また,日本語のドキュメントもこちらのサイト(doc.rust-jp.rs)
からアクセスできる.
Rust は初心者向けの言語ではなく学習コストの高い言語であるが,OS
などのシステムプログラムが書けるプログラミング言語はどうあるべきかの理解を深めさせてくれる言語である.また,Rust は言語としての理想形や機能の網羅性を追求するよりも,効率性や実用性を重視する言語を目指している.
-
Rust 言語の特徴
-
マルチパラダイムプログラミング言語 (→ Rust 言語仕様)
・文法の表面的な記述は手続き型プログラミング,ブロックコードのまとまりの意味論は関数型プログラミング,型システムを用いたオブジェクト構造はオブジェクト指向プログラミングのパラダイム特性を持つ.
・特定のプログラミングパラダイムのみを使用するのではなく,適材適所で必要なパラダイムを使用してコードを記述する.
-
コンパイラ言語
・実行時の性能は
C 言語と同等程度に高速(Rust は,メモリ管理を明示的に行っており,ガベージコレクションによるメモリアドレスの変更等の問題もないため C 言語との連携も可能)
・静的型付言語であり,コンパイル時に型チェックが行われる.
・Borrow checker (借入チェッカー) により,コンパイル時にポインタ参照,変数のライフタイムや使用範囲が検査されるため,実行時のエラーを大幅に減らすことができる.
・メモリ安全およびデータ競合安全をコンパイラが保証する.
・主要なプラットホーム(Windows, macOS, Linux
など)に対応している.
・C 言語との仕様の違いは多いが,C 言語コードを Rust 言語に変換するのは比較的容易である (→ C 言語と Rust言語 ).なお,C
コードの Rust への変換をサポートするツールを開発しているプロジェクト (C2Rust) もある.
-
安全性
・変数に「寿命」を与えることで,解放された変数にアクセスすることを防ぐ.また,変数に「所有権」を与えることで複数の箇所からメモリを書き替えることを防ぐ.
-
ゼロコスト抽象化
・ポリモーフィズムなどの抽象化の仕組みが実行時の追加コスト (メモリ使用量の増加や実行速度の低下などのオーバーヘッド) なしに実現される.
-
よく言われる短所
-
継承がないなど一般的なオブジェクト指向言語ではない.
マルチパラダイムな言語であり,オブジェクト指向的な実装も可能である.ただし,Java や C++ のクラスとは少し違った書き方になる.(→ Rust
オブジェクト指向設計)
-
学習コストが高い
システムプログラムの低レベルの処理を安全に書くための仕組みの理解が必要.一般AP向けの言語ではない.しかし,一度習熟すれば C 言語よりコンパクトなコードが書けるようになる.
-
標準ライブラリが貧弱
クロスプラットホーム向けであり,標準ライブラリは移植性の高い機能のみ.プラットホーム固有の機能などは外部ライブラリに依存する.
なお,組み込みシステムやOSカーネルなど,標準ライブラリを使わないバイナリも構築できる.(→ Rust 標準ライブラリ).
-
その他の特徴
-
コンパイラのエラーメッセージが優秀
コンパイラが出力するエラーメッセージが親切であり,ヒントとして修正方法を提示してくれる場合もある.文法が曖昧なままコードを書いても適切にエラーを指摘してくれる.
-
Cargoシステム
Cargo は,Rustプロジェクトの作成,ビルド,実行,パッケージ管理,テスト等の幅広い機能をサポートするツールである.Cargo を使うことにより,Rust の開発管理を大幅に効率化できる.
-
Rust 言語の文法的特徴
-
式対文
・式ベースの言語である.「宣言文」と「式文」以外はすべて式である.式文は式の末尾に ";" を付けたもの.
・式は値を返すが,文は返さない.
-
型推論
変数の宣言には必ずしも型を決定するための初期値を必要としない.変数の宣言時に初期値が与えられた場合は「変数の型」は「初期値の型」であると型推論がなされるが,初期値が与えられなかった場合は以降のブロックコード中のその変数へ値がはじめて代入された時に「左辺の変数の型」は「右辺の代入する値の型」であると型推論がなされる.
-
変数束縛
変数への代入は,変数名と値を結び付ける関係
(変数束縛)でデフォルトでは変数への再代入はできない."let mut 変数名 = 値;"のように,ミュータブル (可変) な変数であると宣言すると再代入が可能になる.
-
所有権
基本的に変数を他の変数へ代入することや関数の引数にすることは,所有権の移動(ムーブ)として扱われ,コピーはされない.
「一つのリソースの所有権はただ一つの変数に束縛される」という原則がある.これによりメモリの競合を避け、メモリの安全性を保証している.
-
参照と借用
参照と呼ばれる &T
型を使うと,リソースを所有するのではなく借用して利用できる.また,&mut T 型の参照があり,借用しているリソースの変更が可能になる.
-
総称型(ジェネリクス)
関数シグニチャや構造体などの要素の定義を生成するのにジェネリクスを使用することができる.ジェネリクスは静的ディスパッチで実現されているため,普通の関数と変わらない速度で動作する.しかし,コードがコピーされたりするのでバイナリが大きくなりがちである.
-
ライフタイム
ライフタイムとは参照が有効となるスコープのことであり,Rust
においてはすべてのライフタイムを管理している.多くの場合,ライフタイムも暗黙的に推論されるが,複数の可能性があるときには,型を注釈する必要がある.(→
参照とライフタイム)
-
トレイト
特定の型に対し,他の型と共有できる共通の振る舞い(メソッド)を抽象的に定義したもの(他の言語でインターフェイスと呼ばれる機能に類似).具体的な型に対してトレイトを実装することで,オブジェクトが構築される.
トレイトは継承でき,またデフォルト実装を持つことができる.(→ Rust 標準トレイト)
-
スマートポインタ
通常,構造体を使用して実装されるが,Deref (参照) と Drop (後処理) のトレイトを実装し,メモリの確保,解放の管理が行われる.String型もスマートポインタである.
-
Rust 開発ツール
Rust
の開発ツールは次のソフトウェアとして提供されている.
-
rustup
・Rust 言語関連プログラムのインストーラ
・最新バージョンへのアップデートや異なるリリースチャンネルからのインストール機能を持つ.
-
rustc
・Rust 言語のコンパイラ
・クロスコンパイルが可能であり,Windows,Linux,Mac 向け等の実行ファイルも作れる.
-
cargo
・Rust のビルドツールであり,パッケージマネージャ
(Rust では他の言語で言うライブラリやパッケージのことをクレート(crate)
と呼ぶ)
・プロジェクトのビルド(コンパイル),依存ライブラリのダウンロード,テスト,ドキュメント生成などをサポートする.(→ Rust
プログラム開発).
-
Rust による暗号処理
Rust で暗号処理を実現するには,次のような方法がある.
-
Rust による暗号機能の実装
・Rust
で記述された暗号ライブラリの定番と言ったものはないようだが,いくつか公開されている(rust-crypto など).
・基本型として多倍長整数型はないため,公開鍵暗号機能を新たに実装する場合は外部ライブラリを利用する必要がある.(→ 多倍長整数演算)
-
他言語の暗号ライブラリの利用
Rust は C との相互運用ができ,多くの既存のライブラリを使うことができる.有名なライブラリには Rust用ラッパーライブラリが公開されている (→ OpenSSL 用ラッパ rust-openssl).