【漫画でIT入門】とあるIT企業の社員活動日誌 第23話「プログラミング学習のすゝめ⑨ Rustとは?特徴と出来る事」
パソコンを使う人のありそうでなさそうなお話や、ガジェットのお話を漫画で紹介させていただくコーナーです。
とあるIT企業に務める彼女たちは日々楽しく真面目に業務に励んでいます。その中で、起こったハプニングや困った事などを活動日誌を通して覗き見していきましょう。
※当ブログは、アフィリエイトプログラムに参加して商品を紹介しております。当ページのリンクを介して商品を購入すると著者に収益が発生することがあります。
【漫画で入門】「とあるIT企業の社員活動日誌」各話一覧はこちら
目次
Rustとは?
Rust言語は比較的新しいプログラミング言語です。2006年から開発がスタートし、最初の正式版(バージョン1)は2015年にリリースされました。
この言語はWebブラウザ「FireFox」を開発しているMozilaが支援してるオープンソースのプログラミング言語であり、開発当社はMozilaに属していたグレイドン・ホアレ氏が立ち上げた個人プロジェクトでした。2009年から正式にMozilaが支援を表明し、公式プロジェクトとなりました。
上記でも記述した通り2015年に正式版され、C言語やC++言語にとって代わる次世代のスタンダードプログラミング言語を目指して日々開発が行われています。
Microsoft及びGoogleが正式採用
Microsoftは2019年11月から、同社のコアプラットフォームであるWindowsの開発にRustを採用していることを公表しています。
そしてGoogleは、2021年4月に同社のコアプラットフォームであるAndroid OSの開発にRustを採用すると発表しています。
さらに、Linuxカーネルの開発にRustを使用する動きも始まっています。
本来OSのコア部分の開発は、C言語やC++言語と相場が決まっていましたが、そこにRustが風穴を開けることになりました。
その背景には、OSの抱えるセキュリティ上の問題(脆弱《ぜいじゃく》性)の解決があります。セキュリティ上の脆弱性の多くは、メモリ利用におけるバグに起因するものとされていて、C/C++を用いる限りはこれらの言語の特性から克服は困難とされてきました。
Rustでは、独自の言語設計によりメモリ安全性(メモリ利用における安全性が言語によって保証されていること)を実現しています。
MicrosoftやGoogleはメモリ安全性を一番に評価し、Rustの採用を始めているのです。
Rust言語の特徴
Rust言語が注目されている理由として、次の特徴が挙げられます。
①安全性(メモリ安全性とそれに伴うセキュリティへの安全性)が高い
②並行処理が出来る
③処理速度が速い
④自動テスト機能とパッケージシステム「Cargo」
Rust言語の特徴①「安全性が高い」
C言語、C++言語と大きく異なりRustの最大の特徴とされているのが、メモリ管理という点が挙げられます。
プログラミング黎明期に開発されているためC/C++は設計が古く、開発当時のCPUやメモリの能力を最大限に引き出すために効率を優先し、メモリに対する安全性という考えが甘かった傾向にあります。
特にC言語はメモリアンセーフであることが問題視されることが多く、メモリの解放、メモリリーク、バッファオーバーフロー、ヌルポインター、データレースなどの不具合を意識的に回避しながら開発する必要があります。
一方、Rust言語はメモリの「所有権」という概念を採用し、開発者が極度にメモリに神経をとがらせる必要を無くす仕様を実現しています。
この「所有権」というメモリ管理方法は、C言語、C++言語のみならず、ガベージコレクション(GC)を採用するJavaやC#とも一線を画す独特な仕様です。
C言語、C++ではメモリ管理は手動で行い、例えばC++では「new」「delete」などの命令を用いて、メモリリークを防ぐ必要があります。一方、JavaやC#ではプログラマーがメモリリークを意識する必要のないガベージコレクションによってメモリの管理が自動的になされています。
Rust言語ではヒープ領域に置かれたデータを管理する際にのみ「所有権」の取り扱いを意識すればよく、C言語のように常にメモリを考慮する必要がありません。これによってメモリによる不具合はC言語よりも格段に減ることとなります。
なぜメモリが安全性に繋がるのか
Googleが2020年5月発表した情報によるとwebブラウザ「Chrome」の重要度の高い脆弱性のうち、約7割がメモリに関連する問題であると公表されています。
そして、脆弱性の約70%をメモリに関する問題と定義し、さらにその半分がメモリ解放後の再使用によるバグのためである断定しています。
これらの(webブラウザ以外のすべてのシステム)メモリに関連する脆弱性に対し、考えうる解決策としてGoogleは「Using safer languages anywhere applicable(該当する場所でより安全な言語を使用する)」と発言し、Rust言語をメモリに関する脆弱性の問題を打破するものであると例示しています。
このようにメモリによる脆弱性を未然に防ぎ安全性を担保することが出来るという点は、Rust言語の大きな特徴といえるでしょう。
Rust言語の特徴②「並行処理が出来る」
C・C++言語は設計、開発された時期に「スレッド」(特定の処理を行うための一貫性のある命令の流れ)という概念が存在しておらず、その為スレッドセーフでは無いという事が問題視されることがあります。
C言語の標準ライブラリでは変数に静的なものが使用されているため複数のスレッドから関数が呼び出される際に変数の競合が発生してしまう場合があります。また、変数を占有して競合を回避したとしても、次に占有に対する開放待ちが相互に発生してしまいデットロックを引き起こすという問題が発生してしまいます。
現在はpthreadsと呼ばれるマルチスレッドに対応している外部ライブラリを使用することでこの問題を解決することはできますが、以前C・C++言語だけの力で解決することはできない状態です。
その点、Rust言語はマルチスレッドを利用し、複数のタスクを並行処理することが可能です。
Rustでは「thread::spawn」と呼ばれる標準ライブラリが実装されており、このライブラリを利用することによってメモリの「所有権」というRust独自の概念を利用し、スレッドの競合が発生しない設計に仕組みになっています。
また、「Rayon(レーヨン)」というRust言語用の並列処理ライブラリもGitHub上で公開されており、こちらを使うこともできます。非常に軽量で、順次計算を並列計算に簡単に変換できると評価されています。
Rust言語の特徴③「処理速度が速い」
Rustはコンパイルする際にLLVM(コンパイル時、リンク時、実行時などあらゆる時点でプログラムを最適化するよう設計された、任意のプログラミング言語に対応可能なコンパイラ基盤)に準拠しておりLLVMにおける中間コードに一度変換され、最終的にCPUで動作するバイナリコードに変換されます。
同様の仮想マシンを利用するJava(JVMを使用)では実行時に中間コードを読み取り実行されます。その為実行時にすでにバイナリコードに変換されるRustの方が処理速度が速くなります。
これらから、Rustのバイナリはコンパクトで、Cに匹敵する、あるいは上回る速度で動作し、システムプログラミングに適したプログラミング言語となっています。
Rust言語の特徴④「自動テスト機能とパッケージシステム「Cargo」」
大まかに、テストには、関数単位でテストを行う単体テストと、アプリケーション全体をテストする結合テストがあります。
Rustでは、標準でこれら双方の自動テスト機能が用意されています。
Javaの場合、テストのための外部ライブラリ「JUnit」が有名ですが、Rustでは別途テストライブラリをインストールする必要がありませんし、手順も統一しやすくなっています。
Rustはモジュールシステムを標準で用意しています。
モジュールシステムとは、プロジェクトを階層化、分割して管理する仕組みです。ソースファイル1個のプログラムなら問題ありませんが、ソースファイルが多数にわたり、多くのプログラマーがプロジェクトに参加するようになると、プロジェクトを機能や役割で分割して管理する必要があります。
また、Rustではプロジェクトをパッケージ、クレート、モジュールといった階層で分けて管理できます。言語仕様の中にこれらを利用するための仕組みが用意されているので、特別な外部ツールが必要になりません。Cargoというパッケージマネジャーを使って、これらを適切に管理できます。
Rust言語で出来ることとは
OSカーネルなどコアな部分の開発だけでなく、Rust言語は以下のような用途にも利用されています。
・Webアプリケーションの開発
・コマンドラインツールの開発
・APIサーバーの開発
メモリリークやデータ競合といったエンジニアを悩ませる不具合をクリアしているため、大規模なシステムやアプリケーションを開発するうえでも、ほかの言語と比べて安全性の面で適していると評価されています。
Rustで出来る事①「Webアプリケーションの開発」
Rust言語には2021年時点でWeb用のフレームワークが複数存在しています。
「Rust向けの強力で実用的で、非常に高速なWebフレームワーク」と謳っている『Actix Web』 や、柔軟性、使いやすさ、または型の安全性を犠牲にすることなく、高速で安全なWebアプリケーションを簡単に作成できる『Rocket』 、そして速度を追及した非常に簡単に構成可能なフレームワークである『warp』 などが代表例です。
Rust言語のWebフレームワークは度々発表されており、最新のものでは2021年08月24日にリリースされた『axum』 が挙げられます。今後もWebアプリケーションの開発を加速させるWeb用のフレームワークが続々と登場する可能性があります。
プロジェクトの要件に応じてこれらのフレームワークを使うことで、開発の効率が格段に向上することが期待できます。
Rustで出来る事②「コマンドラインツールの開発」
コマンドラインツールとは、コマンドプロンプトにおける命令の入力フローであるコマンドラインを効率的にひとつにまとめたプログラムを実行することで、コンピューターとのやり取りを一度に実行できるソフトウェアの総称です。
Rust言語は、このコマンドラインアプリケーションも開発可能で、C言語やC++言語と同等のスピード、かつ保守性の高さから人気が出始めています。
公式サイトではマニュアルも閲覧できるので簡単に始めることができるでしょう。
配布する場合もcrates.ioなどのコミュニティがあるため、作成したコマンドラインツールをアップロードして多くの人に利用してもらうことも期待できます。
Rustで出来る事③「APIサーバーの開発」
APIサーバーとは、APIを経由して返されるデータを提供するサーバーのことですが、まずはAPIが何かということに言及します。
APIとはApplication Programming Interfaceの頭文字を取った略語です。生活に馴染みの深いところでは、TwitterのAPIや、以前旧APIが廃止されてしまったInstagram APIなどが挙げられます。
このAPIを使うことで、メインとなるサービスやプロジェクトで外部の機能を通したデータを扱うことができるようになります。わかりやすい例としては、自身の開発したアプリでTwitterのタイムラインを取得したいときにこのAPIが利用されます。
Rust言語は、このAPIを提供するためにも利用されることがあります。なおAPIサーバーを構築する際も、『actix-web』や『Rocket』などのWeb用のフレームワークが使われることが一般的です。
RustはC言語/C++言語に代わるシステムプログラミング言語
Rustは、C/C++が使われてきた、あるいはこれから使われるであろう場面で、C/C++に替わる有効な選択肢となってきています。
その理由の第一が、Rustがネイティブコンパイラ言語ならではのコンパクトさと高速性を持ち、かつメモリなどのリソースの細やかな取り回しが可能なプログラミング言語である点です。しかし、単に軽量、高速で細やかなリソース操作が可能であるというだけでは、C/C++にとって替わる意味がありせん。
Rustでは、C/C++の弱点といわれる低い並列性、ポインタに代表される危険性を克服しています(※1)。
つまり、高い安全性を保ちながら、並列性を担保し、細かなリソース操作も可能にしたプログラミング言語、それがRustなのです。
※1 メモリ安全性を犠牲にして効率を重視したUnsafe Rustという言語仕様もRustには含まれています。これを利用すると、C/C++のようなメモリ操作が可能になりますが、本連載では触れない予定です。
まとめ
プログラミング言語「Rust」は新進気鋭のプログラミング言語と言えます。
その為、これまで開発・使用されていたプログラミング言語の問題点を改善し、進化したプログラミング言語と呼ぶことが出来るのではないでしょうか。これまで、多くの脆弱性の問題を発生させてきた「メモリの安全性」という難題を克服出来る将来性のある言語と呼べます。
しかし、難点としては新しいプログラミング言語であるがために流通している情報量が少ないという事でないでしょうか。日本語ベースの解説サイトや解説本はあるにはありますがC言語やJavaと比べてしまうとかなり少ないです。
その為、プログラミング所学者が勉強するにはハードが高いと言われてしまうかもしれませんが、逆を言えば操ることの出来る人間が少ないと言え事なので求人や単価という点では非常に魅力的な言語となっています。
さらに学べるおすすめ書籍
・Rustプログラミング完全ガイド 他言語との比較で違いが分かる! impress top gearシリーズ
・Rustの練習帳 ―コマンドラインツールの作成を通してRustを学ぶ