Rustとはどんな言語?使われがちな用途や将来性・入門方法を解説 | レバテックフリーランス
Rustとはどんな言語?使われがちな用途や将来性・入門方法を解説
Rustとは、WebブラウザやOSのようなシステムソフトウェアを書くために開発された言語です。パフォーマンスと安全性の両立を目指して2015年にリリースされました。
Rustを使えば生産性の高い開発を目指せますが、学習難易度が高いのも事実です。そこで、Rustの特徴や使いどころ、初心者がつまずきやすいポイントなどをまとめて解説します。将来性や流行らないのか?といった気になる点も紹介するので、ぜひ参考にしてください。
目次
RustとはMozilla社が提供するプログラミング言語
Rustとは、「Firefox」で知られるMozilla社が提供するオープンソースのプログラミング言語です。ファイルすべてがGitHubにて公開されています。
2015年にリリースされた比較的新しい言語で、安全性とパフォーマンスの高さが特徴です。このRustの背景知識について説明していきます。
RustはCやC++に代わる言語ともいわれている
Rustは、CやC++に代わるプログラミング言語ともいわれています。CやC++は、古くから多くの企業で世界的に利用されてきましたが、いくつかの欠点があるのも事実です。Rustは、それらの欠点をカバーしています。
たとえばCやC++は並列性の低さやポインタに代表される危険性が弱点ですが、Rustは克服しています。そのため、メモリを安全に操作しつつ、並列性を担保し、細かなリソース操作が可能です。
また、既存の言語と文法などが似ていて、CやC++を習得していれば理解しやすいので、これらからの乗り換えはしやすいといわれています。
MicrosoftやGoogle、Amazonなどの大手企業に採用されている
Rustは、安全性やパフォーマンスの高さからMicrosoftやGoogle、Amazonなどの大手企業に採用されています。
OSのコア部分は、CやC++が用いられてきましたが、脆弱性が問題視されていました。Rustはこの問題を克服しており、Microsoft社では「RustはCやC++に代わる最有力の言語だ」と評価しています。
こうしたIT業界をリードする大手企業の高評価や導入もあり、Rustは世界的に注目を集めています。
Rustの将来性は高いといわれている
Rustは、IT業界を率いるような大手企業も採用しており、将来性は高いといえます。実際、Microsoftの「Windows」やGoogleの「Android OS」などの開発に採用されています。
また、エンジニアが学びたい言語としても名が挙がることからも、将来性の高さが期待できるといえるでしょう。
Rustは定期的なリリースが続き、新しい機能が公開されています。進化を続けているプログラミング言語のため、これからさらに採用する企業が増えていくと考えられます。
こうした背景を踏まえると、Rustエンジニアの需要もこれから高まるといえるでしょう。
Rustでの開発に向いているユースケース
Rustは、処理速度の速さや安全性、フレームワークの多さなどからさまざまな開発現場で使用されています。代表的な例は、WebアプリやWebブラウザの開発、ゲーム開発などです。
また、所有権というメモリ管理の仕組みもあり、大規模なシステム開発でも採用されています。
ここでは、開発現場でRustに向いているものとあわせて、実際にRustを使って開発されたサービスも紹介します。どのようなものを作れるのかイメージするのにお役立てください。
Webアプリ
Rustには、Actix WebやRocket、axumなどWebアプリ向けの多様なフレームワークがあります。こうした理由から、RustはWebアプリの開発に適しているといえるでしょう。
実際、アメリカ発のチャットサービス「Discord」もRustで作成されました。
ゲーム
ゲーム開発に適しているC++の代わりとなるRustは、ゲーム開発にも向いています。その理由は、実行速度の速さや並行処理ができるためです。実際に、以下のようなゲームエンジンが作られました。
- Piston:2D・3D、クロスプラットフォームプレイ可能なゲーム開発ができる
- Amethyst:データ指向で、ECSアーキテクチャを採用
- Bevy:データ指向で、ECSアーキテクチャを採用
- Fyrox:ネイティブエディタにより簡単に2D・3Dゲーム開発ができる
OS
OS開発に欠かせない低いレイヤー処理の記述を行えることから、RustはOS開発にも利用されています。実際開発に使われた例としては、UNIXのOSである「Redox OS」が挙げられます。
もともと、OS開発にはC・C++が使われることが多いです。したがって、後継言語であるRustも同じくOS開発に向いていることがわかるでしょう。
クラウドプラットフォームサービス
クラウドプラットフォームサービスの開発では、「安全性の高さ」が重要視されます。Rustは所有権によりメモリの安全性が高いため、クラウドプラットフォームサービスの開発の場でも用いられています。
ビジネスシーンにおいて圧倒的なシェアを誇る「Azure」も、Rustで開発されたサービスの1つです。
Webブラウザ
処理の高速性が求められるWebブラウザの開発でも、Rustが採用されています。Rustは、Webブラウザ「Firefox」で知られるMozilla社が中心となって開発した言語です。そのため、Firefoxの開発にも用いられました。
大規模なシステム
Rustは、安全性が高く、データの競合を未然に防げる仕組みもあるため、大規模なシステム開発に向いています。また、Rustには基本的にnullが存在しないため、多くのプログラミング言語で課題となっているnull問題も発生しません。
大規模なシステム開発では、複数のエンジニアがコーディングするため、多く発生しがちなバグも、Rustなら削減可能です。また、従来であればエンジニアの責任としていたメモリ管理も、Rustはプログラム側で監視できます。
こうした特徴から、Rustなら大規模なシステムでも安全に開発できます。
Rustの利点を6つのポイントで解説
Rustには以下のような特徴があります。
- コンパイラ言語型で、処理速度が速い
- マルチスレッド対応で、複数のプログラムを並行処理できる
- 所有権を備えており安全性が高い
- 自動テスト機能により導入が容易
- モジュールシステムがあるため管理がしやすい
- iOSでも実行できる
それぞれ詳しく解説します。
コンパイラ型言語で、処理速度が速い
Rustはコンパイラ型言語で、メモリやCPUに近いため、処理速度が速いのが特徴の1つです。
Rustのコンパイラは、LLVMと呼ばれる仮想コンパイラプラットフォームで一度中間コードに変換されます。その後、ターゲットであるCPUで直接実行動作できるバイナリを生成します。
バイナリのコンパクトさにより、処理速度が速いとされるC言語と同じ、もしくは上回る速さで処理可能です。
マルチスレッドに対応しており、複数のプログラムを並行処理できる
Rustは、マルチスレッドに対応しており、複数のプログラムを並行処理できるうえ、タスク完了までの時間の削減が可能です。
CやC++ができたころは、スレッドという概念がなかったため、スレッドセーフでないという問題点がありました。Rustでは、標準ライブラリにマルチスレッドの機能があるため、CやC++の問題点をカバーしているのが特徴です。
なお、マルチスレッドには、以下のようなエラーが生じる場合があります。
- 複数スレッドから関数を呼び出す際のデータ競合の発生
- デッドロックに陥る
しかし、Rustでは変数の借用におけるルールによりデータ競合を未然に防げるため、安全に並行処理できます。
所有権を備えており安全性が高い
Rustは所有権というメモリ管理の仕組みを備えており、多重解放の心配がなく、安全性が高いのが特徴です。所有者が常に1つになるように設定し、メモリの多重解放が起こりません。
一方、CやC++では、メモリの解放やメモリリーク、バッファオーバーフローなどのリスクがあります。CやC++が誕生したころに効率を優先した結果、安全性が二の次になっていたためです。
Rustでは、リソースの所有者と生存期間の静的解析をするボローチェッカーが導入されています。そのため、CやC++と比べて安全にコンパイル時のメモリを運用できます。
自動テスト機能により導入が容易
Rustでは自動テスト機能があるため、導入が容易です。テストには、「関数単位で行う単体テスト」「アプリケーション全体で行う結合テスト」があり、Rustはこのどちらも実装されています。
ほかのプログラミング言語では、テストのための外部ライブラリを別途インストールする必要があるものもあります。しかし、Rustではその必要もなく、導入しやすいのが特徴です。
モジュールシステムがあるため管理がしやすい
Rustには、モジュールシステムがあるため管理がしやすいです。モジュールシステムでは、プロジェクトを分割したり階層化したりして管理できます。Rustでは、標準でこうした仕組みがあるため、別途外部ツールをインストールする必要はありません。
モジュールシステムがあると、複数のプログラマーが参加するプロジェクトで、ソースファイルが複数あるという場合に特に役立ちます。
iOSでも実行できる
世界的に利用されているiOSでも実行可能な点も、Rustの魅力の1つです。iOSでのアプリケーション開発の案件は多く、将来性も高いOSです。人気の高いOSでも実行可能なRustを扱えるエンジニアとなれば、活躍の場は広がるでしょう。
iOSエンジニアについてもこちらの記事で解説していますので参考にしてみてください。
iOSエンジニアの仕事内容とは?将来性や年収とあわせて解説
Rustのデメリットを3つのポイントで解説
Rustでは多くのことができ、扱うメリットが多い一方で、ユーザーインターフェースや人工知能の開発に不向きとされています。また、学習難易度が高いこともデメリットだといえるでしょう。
ここでは、RustのデメリットやRustの苦手なことについて詳しく解説していきます。
ユーザーインターフェース開発に不向き
RustはCPUやメモリに近いプログラミング言語であるため、ユーザーインターフェース(UI)の開発が苦手です。そのため、システム本体のプログラミングはRustで実装できますが、UIには別の言語を用いる必要があります。
ほかのプログラミング言語のなかには、システムの本体部分とUIをひとまとめに実装できるものもあります。一方、Rustの場合、Rust以外のプログラミング言語の取得が必要です。
こうした面から考えると、UI開発においてRustを利用するのは向いていないといわざるを得ません。
人工知能の開発に不向き
Rustは機械学習に必要な「高速処理」は可能ですが、人工知能の開発には不向きです。人工知能の開発に必要な「インタフェースの実装」がRustの苦手分野であるためです。
Rustでトータルし実装するのは難しいため、人工知能の開発にはそれに適したPythonなどを使用するのが良いでしょう。
ここで紹介したPythonについて気になる方は、こちらの記事をご覧ください。
Pythonの将来性は?メリット・デメリットやJavaとの比較を解説
学習難易度が高く、つまづきやすい
Rustは安全性やパフォーマンスといった良い面が語られる一方で、独自の概念の理解が必要なことから、学習難易度が高い傾向があります。初心者やほかの言語での経験がある人は、主に以下の3点でつまずくようです。
- コンパイルエラーの量に圧倒される
- 「代入」の意味の違い
- 貸し借りに関するトラブル
それぞれどのような理由でつまずいてしまうのか、詳しく解説します。
コンパイルエラーに圧倒される
Rustはプログラム上の問題を可能な限りビルド段階で見つけようとします。ビルドされたプログラムに、一定の安全性が担保されるのはこれが理由です。しかしコンパイルエラーが比較的多く出ることにもなります。
「とにかく動かしてみたい」という気持ちを抑えてコンパイルエラーを修正しなければいけないので、ストレスを感じる方もいるようです。Rustのエラーメッセージは単にエラーを伝えるだけでなく、開発者にとって有益でわかりやすいのが特徴です。
次のエラーはパターンマッチでチェックされるパターンに抜けがあるため発生しました。エラーが発見された場所や、その内容がわかりやすく説明されています。
error[E0004]: non-exhaustive patterns: `None` not covered
--> src/main.rs:3:25
|
3 | let message = match value {
| ^^^^^ pattern `None` not covered
|
= help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms
= note: the matched value is of type `Option`
error: aborting due to previous error
For more information about this error, try `rustc --explain E0004`.
For more information about this error, try `rustc --explain E0004`.
また Rustコンパイラーである rustcには --explain というオプションがあります。上記のエラーメッセージにもあるように、このオプションをつけてrustc を実行すると、エラーの詳しい解説を読めます。
なお同じ内容が Rust Compiler Error Index に公開されています。エラーメッセージを使って、こちらのページを検索しても解説を読めます。
「代入」の意味の違い
代入は用意した領域に値を書き込むといった意味を持つことが多いのに対し、束縛は値に名前をつけることを意味します。なお、Rustにおける束縛とは、 a=1 のような操作のことです。
最初の条件は束縛に関する制約で、次のコードのように、値が別の変数を束縛した後、元の変数を参照しようとすると発生します。
let a = format!("Hello, world");
let b = a;
println!("{}", a)
変数は束縛されることで値の所有権を獲得し、その値が別の変数を束縛することで、所有権を失います。
値が保存されているメモリー領域の解放の判断に所有権は利用されます。例えるならモノの管理責任を明確にすることで、勝手に使われたり、いつまでも捨てられずに残って部屋がモノであふれるのを防ぐといった仕組みです。
初心者の場合、代入のつもりで行った操作によって意図せず値の所有権が移動してしまうといったエラーが多いようです。文法上は正しく見える部分でコンパイルエラーが起きるため、心をくじかれる人もいるのではないでしょうか。
ほかの言語では代入操作を表す記号が、Rustでは異なる意味で使われていることが混乱を大きくしているようです。「束縛」と明示的に呼ぶことで、代入とは違う操作なんだと意識づけるのがおすすめです。
貸し借りに関するトラブル
以下の行為で所有権は移動するため、それを緩和するために借用という概念があります。
- 関数呼び出しやオブジェクトの作成
- イテレーターを使ったループ処理
- そしてタイプ量を減らすために短い名前の変数に一時的に代入する
所有権を一時的に貸し出すことで、クラッシュやセキュリティホールの原因となります。それを防ぐのがライフタイムという概念です。Rustコンパイラーは、データのライフタイムを計算し、削除後にデータを利用する場合はエラーを出力します。
所有権とライフタイムは初学者が戸惑うコンパイルエラーの代表的なものでしょう。どちらもデータと、それが記憶されているメモリー領域の管理に関する概念です。所有権とライフタイムに関するエラーは、次の 3つの ルールを理解するとわかりやすいです。
- ある値に束縛される変数は最大1つに制限される
- 変数のスコープから外れた場合、その変数を束縛する値は削除される
- データ構造の属性値は、データ構造そのものよりも長い時間存在しなければならない
所有権とライフタイムは Rustの基本的な概念です。コンパイルエラーが多くて面倒と感じる時もあるでしょうが、気長に付き合っていけばRustらしいプログラムが書けるようになるでしょう。
Rust開発におすすめのフレームワーク
フレームワークとは、効率良く開発を進める枠組みのことで、開発の幅を広げるのにも役立ちます。Rust開発を検討している人は、あわせてどのようなフレームワークがあるのかを把握しておきましょう。
ここでは、4種類のフレームワークについて詳しく解説します。
Actix Web
Actix Web(アクティックスウェブ)は、株式会社estiが開発したフレームワークです。世界的に多くの方に利用されており、コミュニティも多く、日本語での情報収集もしやすいフレームワークです。
Webアプリケーションの開発に必要な機能が備わっており、HTTP/1、HTTP/2、SSL/TLSといったWebサーバー機能があります。ミドルウェアとの接続が可能で、高速に動作するのが特徴です。
さらに、サンプルコードが豊富で、シンプルなものから実践的なものまで多数公開されています。カスタマイズ性もあり、扱いやすいフレームワークです。
Tauri
Tauri(タウリ)は、クロスプラットフォームに対応した、デスクトップアプリケーション開発向けのフレームワークです。
WindowsやmacOS、LinuxなどのOSに対応しており、OS別のユーザーインターフェースの実装が要りません。そのため、コーディングの負担が少ないのがメリットの1つです。さらにファイルサイズが小さく、軽量で、実行速度が速いという特徴があります。
OSの「WebView」機能を活用することで、レンダリングエンジンの追加組み込みが要らず、フレームワークの構成がシンプルです。また、実装でレンダリングを意識せずに済むため、ソースコードを簡単に記述できます。
axum
axum(アクサム)は、tokioチームによってリリースされたWeb開発向けのフレームワークです。
コードにマクロを使用しないシンプルな設計のため、使いこなしやすいのが特徴です。また、エラーハンドリングのソースコードもシンプルで容易に実装できる点や、保守性が高いのもメリットだといえるでしょう。
さらに、非同期リクエスト処理に特化しており、高速性に優れています。
axumでは、依存関係を抑えるためにモジュールベースの設計が推奨されています。そのため、アプリケーションを複数のコンポーネントに分割しての開発も可能です。
Rocket
Rocket(ロケット)は、Webサーバー開発向けのマイクロフレームワークです。専門知識が必要なWebサーバーの開発ですが、Rocketを活用すれば簡易的なものであれば容易かつ短時間で実装可能です。また、ソースコードが少なく動作は軽いという特徴があります。
ただし、機能は最小限のため、複雑なWebサーバーの実装には適しません。ハイパフォーマンスなWebアプリケーション構築の最適化が施されているため、中規模のWebサイトに適しています。
初めてRustを始めるための手順
Rustを始めるために必要なインストール方法から実行まで、順に解説します。インストール方法はWindowsの場合とMacの場合、どちらも紹介します。これから始めようと考えている方はぜひ参考にしてください。
1. Rustのインストール方法
Rustをインストールするには、Rust公式サイトにアクセスしてダウンロードするだけですので、簡単に行えます。Rustのコンパイラをインストールし、インストーラをダウンロードのうえ起動したら、画面の指示に従って進めるだけです。
WindowsとMac、それぞれのパターンに分けてインストール方法を解説していきます。
Windowsの場合
Windowsの場合、Rust用のC++ビルドツールが必要です。バージョンは、Microsoft C++ build tools for Visual Studio 2013、もしくはそれ以降かを確認しましょう。インストールされていない場合は、Visual Studio 2022をインストールします。
次に、Rust公式サイトから「RUSTUP-INIT.EXE」をダウンロードし、実行します。コマンドプロンプトの画面が表示されたら「1:Proceed with installation」を選択してインストールを実行してください。
Macの場合
MacでRustをインストールするにあたって、あらかじめ必要なツールをインストールする必要があります。まずはBashスクリプトをダウンロードするために、ターミナルから以下のコマンドを実行してください。
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
Bashスクリプトがダウンロードできたら、画面の指示に従ってインストールをしていきます。インストール方法の選択が表示されたら「1:Proceed with installation」を選び、インストールを実行しましょう。
2. 「Hello, world!」を記述してみる
Rustをインストールできたら、「Hello, world!」を記述し、プログラムを作りましょう。Rustで使用する拡張子は、『rs』が慣例であるため、メモ帳で『hello_world.rs』と作成します。
fn main() {
println!("Hello, world!");
サンプルコードは上記のとおりです。
3. プログラムを実行する
次に、コマンドプロンプトを起動して、先ほど作成した「hello_world.rs」をコンパイルしましょう。フォルダ上に「hello_world.exe」が作成されたら、プログラムを実行します。
実行は、ダブルクリックではなく、コマンドプロンプトから行います。コンパイルした画面に「hello_world.exe」と入力、Enterキーを押しましょう。「Hello, world!」と表示されれば成功です。
Rustに関するよくある質問
ここでは、Rustに関するよくある質問に答えていきます。
Q. サーバーサイドでRustの使用が好まれる理由はなんですか?
Rustがサーバーサイドで好まれる理由は、メモリの管理が安全で効率的で並行処理が容易なためです。
Q. Rustで実装したプログラムはどのような場面で使われていますか?
Rustは、広告事業の配信サーバーやドライブレコーダーで動作するシステム、SNSマーケティングツールの開発などで使用されています。
Q. Rustでプログラミングを行う場合、どのようなフレームワークやライブラリを活用すると良いですか?
Rustでプログラミングを行う場合、Actix Web、Tauri、axum、Rocket、warpのようなフレームワークやライブラリがおすすめです。
Q. Rustを学習するメリットはなんですか?
Rustは、バイスドライバやオペレーティングシステムのような低レベルのコードなど多数のユースケースが得意です。したがって、Rustを学習することで幅広い開発ができるようになります。ほかにも、アプリケーション開発などにも使用されています。
※本記事は2024年9月時点の情報を基に執筆しております。
最後に
簡単4ステップ!スキルや経験年数をポチポチ選ぶだけで、あなたのフリーランスとしての単価相場を算出します!
※相場算出に個人情報の取得はおこないません。
役に立った/参考になったと思ったら、シェアをお願いします。