先日、「RustをLinuxカーネル開発の第2言語に採用する試みに向け新パッチ」というニュースが飛び込んできました。ニュースそのものは、かねてより、言われていたことなので、内容そのものというより、採用に向けてのスピード感に衝撃を受けています。
もちろん、記事にあるとおり、いきなりカーネルの開発に採用されるのではなく、ドライバーの開発からということです。それでも、これは画期的な一歩となりそうです。
ということで、次世代プログラム言語Rustの開発環境の構築をしてみました。
Rustのインストール
Rustの公式サイトでは、以下のとおり、rustupによるインストールが推奨されています。
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
上記コマンドラインの実行結果は次のとおり。
初めてのインストールなので、デフォルトの1番を選択がお薦めです。エンターキーを押して先に進みます。
最後にパスを通せば、インストールは完了です。
source ~/.cargo/env
なお、Rustに関連するツールのすべては、デフォルトで~/.cargoフォルダ内に収められています。
Cargoによるプロジェクトの作成
インストールが完了すれば、Rustのビルドツール兼パッケージマネージャのcargoが使えるようになります。先ずは、cargoのバージョンの確認をしておきましょう。
cargo --version
cargo 1.57.0 (b2e52d7ca 2021-10-21)
2行目に表示されたのがバージョン番号です。
次に、毎度おなじみのHello Worldを作ってみます。ホームディレクトリ内で次のコマンドを実行します。プロジェクト名はhello_cargoとしています。
cargo new hello_cargo
ホームディレクトリ内にhello_cargoというフォルダが作成されます。このフォルダの構造は次のようになっています。
hello_cargo/
├── Cargo.toml
└── src
└── main.rs
main.rsがプログラム本体です。これはcargoによって作成されたもので、内容は次のとおりです。
fn main() {
println!("Hello, world!");
}
Rustはコンパイラ型言語なので、上記ブログラムを実行するためには、コンパイルする必要があります。cargoはビルドツール(実際のコンパイルはrustcが行う)でもあります。hello_cargoフォルダ内で以下のコマンドを実行すれば、ビルドできます。
cargo build
ビルドされたプログラム本体は、/target/debug/内にhello_cargoという名前で、保存されていますので、次のようにすれば実行できます。
./target/debug/hello_cargo
Hello, world!
これで、先程のmain.rsは、 “Hello, world!”を標準出力に表示するプログラムだったということが分かります。
なお、hello_cargoフォルダ内で、以下のコマンドを実行すれば、ビルドと実行を同時に行うことが可能です。
cargo run
Cargo.tomlについて
続いて、hello_cargoフォルダ内のCargo.tomlをお気に入りのエディタで開きます。
[package]
name = "hello_cargo"
version = "0.1.0"
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
このファイルは、TOML (Tom’s Obvious, Minimal Language) と呼ばれる設定ファイルフォーマットで書かれています。cargoは、ファイルでの設定に基づき、パッケージの追加や削除といった作業を行います。
[package]欄には、もっとたくさんの項目を設定できます。詳しくは、The Cargo BookのThe Manifest Formatの章を参照してください。
次の[dependencies]欄には、プログラム本体が依存するパッケージ名とバージョン名を記述します。例えば、プログラム本体main.rsが、ランダムな数字を生成するライブラリーrandのバージョン0.4.0に依存するのであれば、次のように記述します。
[dependencies]
rand = "0.4.0"
cargoはコンパイル時にCargo.tomlの[dependencies]欄を参照し、randのバージョン0.4.0と互換性のあるファイルをcrates.ioからダウンロードして、プログラム本体といっしょにコンパイルしてくれます。
rustupとrustのアップデート
開発環境の構築は、以上で終了です。後は、開発環境を最新の状態にしておくため、定期的に、rustやrustupにアップデートがないかどうかを確認します。
rustup self update
rustup update
1行目は、rustup自身についてのアップデート、2行目は、rustについてのアップデートです。
最初に読むべき参考書
このように、Rustの開発環境は、想像以上に簡単に構築できます。ただし、Rustとの旅路はここからが長く(もし旅をしようという気になったらですが)なります。
将来、C/C++に取って代わるかもしれないといわれているプログラム言語ですから、仕方のないことかもしれませんが、Rustは学習曲線の険しい言語だといわれています。
そこで、最初に読む参考書がとても重要になります。系統建てて言語仕様を学びつつも、途中で興味を失うことなく、何とか最後まで読み通せるような参考書。そういう一冊を探すことが次のステップです。
その候補のひとつが、「プログラミング言語Rust 公式ガイド 」かもしれません。
Rust関連の書籍を置いている書店には、ほとんどの場合、棚のどこかにこの本があると思います。
ただし、紙の書籍として読みたいとか、電子書籍(Kindle版やKobo版)で読みたいという人以外は、この本を無理に購入する必要はありません。
何故なら、英語版のThe Rust Programming Languageはウェブ上に無料で公開されているからです。また、非公式ながら、有志の皆さんのおかげで、The Rust Programming Language 日本語版も公開されています。
これ以外にも、最近Rust関連の書籍は徐々に増えているようなので、自分に合ったものを探して、その一冊を完読できれば、何とかスタート地点に立つことができると思います。
Rustとサイバーセキュリティ問題
ここで、ちょっと話を戻して、冒頭で引用した記事「RustをLinuxカーネル開発の第2言語に採用する試みに向け新パッチ」について考えます。
この記事のなかで、Linuxの生みの親Linus Torvalds氏が、「LinuxがRustで記述されるようなことはないだろう。」と語ったという話も出ています。確かに、Cで記述された2500万行にも及ぶLinuxカーネルをRustで記述し直したいと考える人などいないでしょうね。
ただ、Linus Torvalds氏の極めて冷静なコメントとは対象的に、Rustをカーネルのシステムレベルで使用することを提案している人々の熱意は半端ないものがあります。
この温度差はいったいどこから来るのでしょうか。
まあ、単純に考えれば、Rustに対する愛情の差かもしれませんが、もう一つの側面として、サイバーセキュリティ問題に対する危機感の差とも考えられなくもありません。
最近、GoogleやMicrosoftといった巨大テック企業が、Rustに注目している背景にも、深刻化するサイバーセキュリティ問題があるといわれています。
では、何故、Rustがサイバーセキュリティ問題とともに語られるのでしょうか。それは、Rust独自のメモリ管理の方法にあります。
Rustの所有権によるメモリ管理
CやC++では、プログラマが明示的にメモリを確保したり、解放したりしたりする必要があります。
これに対して、Rustは、これまでのプログラム言語にはなかった所有権という新しい仕組みを導入し、コンパイラがコンパイル時に一定の規則とともにチェックし、メモリ安全性を確保するようになっています。
これにより、脆弱性が生まれるケースが最も多いともいわれているメモリ管理で、プログラミング上のミスを極限まで減らすことができるということで、Rustは注目を集めています。
また、メモリ管理に関しては、ガーベージコレクション(プログラムが動的に確保したメモリ領域のうち不要になった領域を自動的に解放する機能)という仕組みを持つプログラミング言語も多数ありますが、ガーベージコレクションは、開放のタイミングによっては、速度低下をもたらすという可能性があり、万能とはいえません。
その点、スコープを抜けた時点で、その都度、メモリを開放するというRustの所有権という概念に基づく仕組みであれば、極端な速度低下を生じさせるリスクはほとんどありません。
メモリ安全性と実行速度を両立したプログラムが書けるという点で、Rustは今のところ、唯一無二の存在かもしれないのです。
Rustはこれからどこに向かうのか
Rustを使って開発されているプロジェクトといえば、真っ先に思い浮かぶのはプラウザのFirefoxでしょう。ただ、他に何があるのかとなると、EmacsをRustで実装したREmacsやマイクロカーネルOSのRedoxなど、まだまだ実験的な色彩の強いプロジェクトでの利用が多いような気がします。
その意味では、RustがLinuxカーネル開発の第2言語として正式に採用されれば、その実用性を証明できる格好の舞台になることは間違いないと思います。
Rustの名(錆)のごとく、Linuxのドライバーの開発から始まって、今後じわじわとカーネルの中核へと広がっていくのか、それとも一時的なブームで終わってしまうのか、それはまだ分かりませんが、少なくとも、後世に何らかの影響を与えるプログラミング言語であることは間違いなさそうです。