Rustプログラミングの基礎【現役エンジニアがわかりやすく解説】
Rustプログラミングの基礎を知りたい方に。
この記事を読まれている方は、
- Rustのプログラミングがどんなものか知りたい
- Rust言語の簡単な書き方が知りたい
- Rustが使われる場面を知りたい
おそらくこのように考えている方が多いと思います。
この記事を書いている私は、
プログラミング未経験から転職を果たした現役のWeb系エンジニアです。
エンジニア歴は3年ですが、本業とは別にフリーランスの副業で月10万円ほど、多いときで20万円ほどの収入があります。
この記事では、現役のエンジニアが、Rustプログラミングの基礎を解説しています。
プログラミング言語のRustの特徴
Rustはプログラミング言語のひとつで、静的型付けのコンパイル言語で、オブジェクト指向に近い特徴を持つ言語です。
静的型付けの言語とは、簡単に言うと、データを文字列型や数値型、論理型などに分ける必要がある言語のことです。
コンパイル言語とは、プログラムの実行前に、開発者の方でコンパイラーを使って構文チェックなどをしたうえで中間言語に変換しないと動作しない言語のことです。
一方、コンパイル言語と対をなすスクリプト言語とは、プログラム実行前にコンパイルをする必要のない言語のことで、書いた後はすぐにプログラムを実行することができる言語のことです。
一般に、コンパイル言語は、処理速度がスクリプト言語に比べて速くなります。速度が求められる処理では、コンパイル言語が使用されることが多いです。
オブジェクト指向型言語とは、オブジェクトという概念を持つ言語のことで、簡単に言うと、データ構造として、配列や構造体に加えて、オブジェクト(クラス)があるということです。
オブジェクトのおかげで、ソースコードのメンテナンスがしやすかったり、機能の流用ができます。
Rustの場合は、クラスという概念がなく、代わりにトレイトという概念を使ってオブジェクト化します。
Rustは、C言語やC++に代わるプログラミング言語を目指して開発されている言語です。
なぜかというとC言語やC++には欠点があるからです。
最近では、MicrosoftがRustを安全で高効率なプログラミング言語として高く評価したことで話題になりました。
従来のC言語やC++では、メモリ破壊バグが依然として減っていない中、Rustであればその問題を回避することができるからです。
Rustを使う最大のメリットとしては、C言語と同様に処理速度が速く、パフォーマンスが高い点などが挙げられます。それでいて、オブジェクト指向の特徴もちゃんとありますし、他の言語に劣ることもありません。
また、Rust はデータの型にライフタイムも一緒に入れることでメモリ管理を行っているため、メモリ安全性が高いことも高い評価を得ている理由の一つです。
一方、Rustは学習難易度が高く、初心者が最初の言語として習得するのは少し厳しいかもしれません。また、オブジェクト指向を学んできたエンジニアにとっても、従来の概念や記述とは異なり、難しく感じる方も多いと思います。
Rustの用途
Rustはメモリ安全性が高いことや速度の最適化のための並列化の際のデータ競合の防止などの機能も充実しているので、そういったものを重視する組込系の開発現場でも採用が可能になるでしょう。
今後はMicrosoftも高く評価したように、C言語やC++の代わりに、Rustを採用するケースが増えていくかもしれません。メモリ安全性の問題はとても重要なので、組織によってはトップダウンでRustを開発言語とするように指示される可能性も出てくると思います。
Rustの書き方
ここでは簡単に書き方を少しだけ紹介します。実際に始める気になったら、ぜひ参考書などの教材を参考にして、試してみて下さい。
Hello World!を画面に出力する
まずはお決まりのHello World!という文字列を画面に出力する方法から。
fn main(){ print!("Hello Wolrd!"); }
これで出力することができます。
コンパイル言語のため、プログラム実行前には必ずコンパイラーを使って中間言語に変換する必要がありますが、IDEを使えば自動で行ってくれます。
変数宣言と分岐処理
次は少し踏み込んで、変数宣言と分岐処理をしてみます。
fn main(){ let age = 19; if age < 20 { print!("未成年"); } else { print!("成人"); } }
上記の例では、まずageという数値型の変数を作り、その中に19という数値を入れています。
次にageが20未満であれば”未成年”という文字列を、それ以外であれば”成人”という文字列を出力するような分岐処理をしています。
配列と繰返処理
続いて、配列の使い方と繰返処理について、解説します。
ここでは配列を作って、以下のようにデータを出力することにしましょう。
佐藤,田中,小林
これを出力するコードは以下です。
fn main(){ let students = vec!["佐藤","田中","小林"]; for i in 0..students.len() { print!("{}",students[i]); if i < students.len()-1 {print!(",");} } }
上記の例では、まず文字列型の配列studentsに「佐藤」「田中」「小林」の3つの文字列を格納しています。
その後、数値型の変数i(カウンタ用途)を0に初期セットし、配列studentsの要素の数に到達するまでループでiを1ずつ増やしてまわしていきます。その際に、print関数を使い、配列studentsのi番目の要素の値を出力し、最後の要素以外、その後に「,(カンマ)」を出力しています。
構造体の取り扱い
最後に構造体の取り扱い方法について解説します。
ここではエクセルのようなデータを作って、以下のようにデータを出力することにしましょう。
名前:佐藤,性別:男性 名前:田中,性別:女性 名前:小林,性別:女性
これを出力するコードは以下です。
fn main(){ use std::collections::HashMap; let mut first_row = HashMap::new(); first_row.insert("A", "佐藤"); first_row.insert("B", "男性"); let mut second_row = HashMap::new(); second_row.insert("A", "田中"); second_row.insert("B", "女性"); let mut third_row = HashMap::new(); third_row.insert("A", "小林"); third_row.insert("B", "女性"); let excel_data = vec![first_row,second_row,third_row]; for i in 0..excel_data.len() { print!("名前:{}", excel_data[i].get("A").unwrap()); print!(","); println!("性別:{}", excel_data[i].get("B").unwrap()); } }
上記の例では、まずfirst_row, second_row, third_rowという、キー・値がともに文字列型の連想配列を3つ作り、Aというキー(列)に名前を、Bのキーに性別の値を入れていきます。
そして、それら全てをexcel_dataという連想配列型の配列に入れます。
その後、数値型の変数i(カウンタ用途)を0に初期セットし、配列excel_dataの要素の数に到達するまでループでiを1ずつ増やしてまわしていきます。その際に、print関数を使い、配列excel_dataのi番目の要素の中のA列とB列の値を出力しています。
まとめ:Rustはパフォーマンスが高く、安全性の高い言語
Rustの良さを簡単にまとめると、以下のとおりです。
- パフォーマンスが高い ← 処理速度が速い
- メモリ安全性が高い ← 借用検査の概念を導入
- データ競合安全性が高い ← 並列化時の競合チェック
つまりRustは、プログラマーがメモリ管理を行うことができるため、処理速度を上げやすく、かつメモリ安全性やデータ競合安全性も高いため、C言語やC++に代わる強力なプログラミング言語であるということになります。
ただし、Rustはオブジェクト指向の特徴を持つものの、他の言語のような概念や記述とは異なるため、素人・玄人ともに学習難易度が高い言語と言えます。
しかし、プログラミングにおいて、メモリ安全性やデータ競合安全性は非常に重要な要素であり、Rustが採用されるケースは今後多くなっていくものと思われます。
Rustは独学では少し難しいと思いますので、もし独学でできなさそうな方は、プログラミングスクールも手段の一つに入れると良いと思います。
現役エンジニアがオススメするプログラミングスクール3選【無料体験あり】
「一からきちんと学べるオススメのプログラミングスクールを知りたい。プログラミングの効率的な学び方を知りたい」←こういった疑問に答えます。本記事内容:まずはどのプログラミング言語を選ぶべきか/現役エンジニアがオススメするプログラミングスクール3選/プログラミングスクールにプラスして行うべきこと