Rust(ラスト)とはC/C++言語のように実行速度や実行効率に優れていながら安全なプログラムが作れることで人気のプログラミング言語です。最近では、Linuxカーネルの開発言語に加わるとのことで話題になっています。そんなRustで有名アルゴリズムを解くことで、Rustについて理解を深めましょう。
OSやブラウザ開発にも使われているRustをはじめよう
Rustは「パフォーマンス、信頼性、生産性」に焦点を合わせて開発されたプログラミング言語です。C/C++言語を置き換えることを目標に開発が進められてきました。
-
RustのWebサイト
これまで、OSの開発やブラウザの開発に使われるプログラミング言語の主流はC/C++言語でした。それは実行速度が速く、実行効率が良く、コンピューターの性能を最大限発揮できる言語だからです。 ところが、C/C++言語で正しくメモリを扱うのは非常に難しく、セキュリティ脆弱性の原因となってきました。そこで、Rustでは「所有権」と呼ばれる独自のメモリ管理の機構を言語に組み込むことで、安全にプログラムを作成できるようにしています。
Rustはとても難しい言語?愛されるのには理由がある!
主要OSやブラウザの開発にRustが使われはじめていることから、安全のためにも新規のプロジェクトや既存プロジェクトのリニューアルには、C/C++よりもRustを使うのが良いという場面も増えてきています。
しかし、RustはPythonやJavaScript、Rubyなどのスクリプト言語に比べると「難しい」というのも事実です。とは言え、どんな言語であっても、最初はそれなりの労力が求められます。しかも、既存言語に存在していた問題を解決する新しい考え方を取り入れた言語であるなら尚更です。
また、RustはStackoverflowの2022年の調査では7年連続で最も愛されている言語に選出されています。ちょっと覚えるのが難しいかもしれないけれど、一度覚えてしまえば、手に馴染む道具となるのがRustなのです。
そこで、有名なアルゴリズムをRustで実際に実装してみるなら、Rustがより身近に感じられることでしょう。本連載の一回目は、最も簡単なFizzBuzz問題を実行することで、Rustの思想に慣れていきましょう。
Rustのインストールについて
Rustを最も早くマスターする方法は、実際にRustを自分のPCにインストールし、サンプルプログラムを自分でコンパイルしてみることです。自分で手を動かして、プログラムを書き換えてみることで、理解がぐっと深まります。
Rustをインストールする方法ですが、macOSやLinuxであれば、ターミナルを起動して、以下のコマンドを実行するだけで、インストールできます。(Windowsの場合でも、WSL(Windows Subsystem for Linux)を使えば、下記コマンドを実行してインストールできます。)
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
WindowsでWSLを使わない場合や、インストールに関するより詳しい方法に関しては、公式のドキュメントが参考になります。
加えて、マイナビニュースの連載「ゼロからはじめるプログラミング言語Rust」でもRustを各OSにインストールする手順が解説されています。
FizzBuzz問題を解いてみよう
Rustをインストールしたら、さっそくプログラムを作ってみましょう。最初に、FizzBuzz問題を解いてみましょう。FizzBuzz問題とは、次のような問題です。
1から100までの数を出力するプログラムを書いてください。ただし、3の倍数のときは数の代わりに「Fizz」と、5の倍数のときは「Buzz」と表示してください。3と5の倍数の時は「FizzBuzz」と表示してください。
このFizzBuzz問題を解くには、繰り返し構文のforや条件分岐のifの使い方をマスターしている必要があります。そのため、FizzBuzz問題を見れば、そのプログラミング言語の基本を確認できるのです。それでは、RustでFizzBuzz問題を解くプログラムを見てみましょう。
// 全てはmainから始まる --- (*1)
fn main() {
// 1から100まで繰り返す --- (*2)
for n in 1..=100 {
// FizzかBuzzか調べて変数に代入 --- (*3)
let is_fizz = n % 3 == 0;
let is_buzz = n % 5 == 0;
// ifで順に条件分岐 --- (*4)
if is_fizz && is_buzz {
println!("FizzBuzz");
} else if is_fizz {
println!("Fizz");
} else if is_buzz {
println!("Buzz");
} else {
// その他の場合、数値を出力 --- (*5)
println!("{}", n);
}
}
}
プログラムを実行するには、ターミナル(WindowsならPowerShell)を開いて、次のコマンドを実行します。なお、「$」は入力を意味する記号で入力の必要はありません。またWindowsでは「/」ではなく「\」(¥の半角記号)を入力します。
# Rustのプログラムをコンパイル
$ rustc fizzbuzz.rs
# 実行
$ ./fizzbuzz
なお、WSL/Ubuntu環境の場合、「linker cc not found」のエラーが表示されることがあります。この場合、以下のコマンドを実行してgccをインストールすると解決します。
sudo apt install gcc
スクリプト言語であれば、コンパイルの必要はなく、直接プログラムを実行するのが一般的ですが、Rustはコンパイル言語であるため、実行の前にコンパイルの作業が必要になります。プログラムを実行すると以下のように表示されます。
簡単にプログラムを確認してみましょう。(*1)ではmain関数を定義しています。C/C++言語でもプログラムはmainから実行されますが、Rustでも同じです。そのため、main関数は必ず定義す必要があります。
(*2)では1から100まで繰り返すようにfor文を記述します。そして、(*3)では変数nがFizzかBuzzかを調べて変数is_fizzとis_buzzに代入します。Rustでは「let 変数名 = 値;」のように代入文を記述します。なお、Rustでは「値を変数に束縛する」と表現することもあります。
(*4)ではif文を書いて順にFizzBuzzか、FizzかBuzzかそれ以外かを判定します。標準出力(コマンドライン)に文字列を表示するには「println!("表示内容");」と書くか、「println!("書式", 値);」のように記述します。それで、(*5)では書式と値を指定して表示します。ここで書式に「{}」のように書くと{}の部分に値を出力します。
どうでしょうか。このプログラムだけを見るなら、他のプログラミング言語とそれほど変わりがないように思えるのではないでしょうか。また、C言語などの静的型付き言語と比べるなら、型の定義がないことに驚くかもしれません。Rustには型推論の機構が備わっており、ローカル変数などは、データ型の宣言を省略できます。例えば、上記プログラムの(*3)では変数を2つ使っていますが、自動的に計算結果がbool型であることを推論しているのです。これはとても便利な機構です。
まとめ
以上、今回はRustの紹介と、インストール方法、簡単な例として、FizzBuzz問題を解くプログラムを作りました。皆さんに「Rust思ったよりも難しくない、やってみよう」と感じていただけなら幸いです。
自由型プログラマー。くじらはんどにて、プログラミングの楽しさを伝える活動をしている。代表作に、日本語プログラミング言語「なでしこ」 、テキスト音楽「サクラ」など。2001年オンラインソフト大賞入賞、2004年度未踏ユース スーパークリエータ認定、2010年 OSS貢献者章受賞。技術書も多く執筆している。直近では、「シゴトがはかどる Python自動処理の教科書(マイナビ出版)」「すぐに使える!業務で実践できる! PythonによるAI・機械学習・深層学習アプリのつくり方 TensorFlow2対応(ソシム)」「マンガでざっくり学ぶPython(マイナビ出版)」など。