最近、このウェブサイトを公開しているレンタルサーバーが頻繁にダウンしていて困っている私です。理由は分かっていて、とにかく安くて制限が無い所を選んだのが敗因です。安物買いの銭失いとはこの事ですね。
ポエム
無制限という概念は、実際の利用がどれくらいの規模になるか全く分からない時に大変役に立ちます。が、本当の無制限はこの世に存在しません。特に安価なサービスの場合は。
次に契約するなら対価に相応しい量のリソースが提供される所にしようと思いますが、やっぱりランニングコストは安く済ませたい物で、そうなるとサーバー上で動かすシステムは省コストである必要があります。
さて、私が主に使うPythonは恐らく「手軽だけど効率的ではない言語」です。上記のような限られたリソース下で使うには不向きだと思います。私の状況がPythonで真に効率を考え限界を突き詰めても尚困るかはとりあえず置いておくとして、こういうケースで「効率的な言語」が扱えると個人的にテンションが上がります。なので、「手軽な言語」だけでなくこのような場合のための「効率的な言語」も何か1つお気に入りを見つけたいと思っていました。
そんなある日、Discordの何故DiscordはGoからRustへ切り替えたのか?という記事で、(ちょっと古い)GoからRustへ切り替えたら劇的にパフォーマンスが改善したというのを見て少しRustについて調べる事に。
前々からRustは名前を聞いた事が有る程度で触った事が無かったので、興味が湧いたついでに触る事にしました。
Rustとは
Rustは安全性、速度、並行性の3つにフォーカスした比較的新しい言語で、2016年から2019年までのStack Overflow Developer Surveyで「最も愛された言語」に選ばれる程の人気を誇っています。
具体的には以下のような言語のようです。
- C/C++と同じくらい速い
- C/C++よりも扱いやすい
- 新しい
後発で良い所取りをしていて尚且つC/C++並みに実行時のロスが少ない所が、私が求める「効率的な言語」っぽく見えて惹かれました。
環境
以下の環境で行いました。
- Windows 10 Pro (v1809, b17763.973)
- MSYS2 MinGW 64bit
- Intel(R) Core(TM) i9-9900K @ 3.60GHz
インストール
Install Rust – Rust Programming Languageから、rustup-init.exe
をダウンロードします。
ユーザー環境にインストールされるようなので、管理権限は必要ありません。
PATHを通す
~/.cargo/bin
にRustのコンパイラ等があるのでここにパスを通します。Bash起動時に自動でPATHが通るように~/.bashrc
に書くと便利です。
# (Bash)
export PATH=~/.cargo/bin/:PATH
確認
インストールが終わったら実行可能になったか確認しましょう。
# (Bash)
rustc -V
rustc 1.41.0 (5e1a79984 2020-01-27) cargo -V
cargo 1.41.0 (626f0f40e 2019-12-03)
Hello, World!
ハローワールドします。プロジェクトのルートディレクトリとなるディレクトリを作成して、その中にhello_world.rs
を作成してください。今回はルートディレクトリとしてrust-test
ディレクトリを作成しました。
以下がディレクトリツリーです。
rust-test/ (ルートディレクトリ)
|-- hello_world.rs
以降はルートディレクトリの表記を省略します。
/* hello_world.rs */
fn main() {
println!("Hello, World!");
}
rustc
でコンパイルします。Windowsなので、hello_world.exe
が生成されます。
# (Bash)
$ rustc hello_world.rs
実行します。
# (Bash)
$ ./hello_world.exe
Hello, World!
Cargoの導入
CargoはRustのビルドシステム兼パッケージマネージャで、コードのビルド、依存するライブラリのダウンロード、ライブラリのビルドの3つを管理してくれます。
Cargoではソースファイルはsrc/
に配置する事になっているので、先ほどコンパイルして生成されたhello_world.exe
を削除して、hello_world.rs
をsrc/main.rs
に移動します。
hello_world.rs
をリネームする必要がある理由は、Cargoでビルドを行う際には実行可能ファイルならsrc/main.rs
が、ライブラリならsrc/lib.rs
がコードのメインファイルとして認識されているからです。
src/
|-- main.rs
設定ファイルを作る
Cargoの設定ファイルCargo.toml
を作成します。
[package]
name = "my_first_rust_app"
version = "0.0.1"
authors = [ "sugaok <https://github.com/sugaok>" ]
TOMLの記法はINIに似ています。これに、アプリケーション名name
、バージョン情報version
、作者一覧authors
を記述します。
Cargoでビルドする
設定ファイルも作成したのでビルドしてみます。先ほどはrustc
でコンパイルしましたが、今度はcargo build
でビルドを行います。
# (Bash)
$ cargo build
Compiling hello_world v0.0.1 (...\rust-test)
Finished dev [unoptimized + debuginfo] target(s) in 0.48s
すると、実行可能ファイルとしてtarget/debug/my_first_rust_app.exe
が生成されます。これをそのまま実行しても良いのですが、Cargoはcargo run
で実行する事が出来ます。
# (Bash)
$ cargo run
Finished dev [unoptimized + debuginfo] target(s) in 0.01s
Running `target\debug\my_first_rust_app.exe`
Hello, World!
リリースビルド
プロジェクトが完成して、配布する段階では、cargo build
ではなくcargo build --release
を行います。こうすると、最適化をかけてプロジェクトをコンパイル出来ます。
最適化するとプログラムを実行する速度が速くなりますが代わりにコンパイル時間が長くなるため、開発時はとりあえず実行出来る形に、リリース時は実行が速くなるように、2つの設定が使い分けられるようになっています。
Cargoで簡単にプロジェクトを作る
Reactのcreate-react-app
やDjangoのdjango-admin startproject
のように、CargoではCargoプロジェクトを作るためのコマンドが用意されています。
# (Bash)
$ cargo new hello_world --bin
Created binary (application) `hello_world` package
このコマンドだけで、今回行ったプロジェクトのルートディレクトリの作成からCargo.toml
の作成まで全て終わります。
デフォルトでsrc/main.rs
に既にHello, World!が書いてあるので、この後すぐにcargo build
とcargo run
をしてもHello, World!する事が出来ます。
まとめ
今回は、RustでとりあえずHello, World!しました。久しぶりにコンパイルという作業を明示的に行いましたが、個人的にはコンパイルを事前に行う言語の方がいかにもプログラミングな感じで好きです。手軽さではPythonの方が上ですが。
Rust自体は、後発らしくパッケージマネージャやテスト機能が標準で付いていたりと、始めるにあたっては特に苦労せず簡単でした。
実行速度に関してはまだ違いが出るようなプログラムを作っていないので分かりませんが、Rustの記法等はスッキリしていて好きです。
Rustには初学者には難しいオブジェクト指向でも関数型言語でもない新たな概念があるようなので、そちらにもこれから少しずつ慣れていけたら良いと思います。