はじめに
この記事ではプログラミング言語Rustを紹介します。
Rust?
RustはMozillaが開発しているプログラミング言語で、並列、マルチパラダイムなどが特徴です。また、比較的規模の大きなプログラムを開発するのに適している、とされます。
この公式サイトの記述によれば
- ゼロコスト抽象化
- ムーブセマンティクス
- 保証されたメモリ安全性
- データ競合のないスレッド
- トレイトによるジェネリクス
- パターンマッチング
- 型推論
- 最小限のランタイム
- 効率的なCバインディング
といった、モダンな言語でも採用される機能を多数持っているようです。おまけにエコシステムも充実していて、ビルドシステムとパッケージマネージャを兼ねるCargoというソフトウェアもバンドルされており、入門に際して、敷居はかなり低いと思います。
さらに、Mozillaのプロジェクトであることからもわかるように、完全にオープンであり、ソースコードを入手したり、(腕に覚えがあるなら)コミュニティに貢献することも容易です。
準備
さて、さっそく足を踏み入れたいところですが、まずは環境を整えるところからスタートしましょう。
詳細は省きますが、RustはLinux、macOS、WindowsのそれぞれのOSで動作します。この記事はmacOSで検証したものを記載していますが、ほかの環境でもほぼそのまま動くのではないかと思います。
ではインストールです。
LinuxかmacOSの場合
コマンドラインから
$curl https://sh.rustup.rs -sSf | sh
とするだけです。インストール時のオプションについていくつか質問されますが、すべてデフォルトで問題ないはずです。
インストールが完了すると
Rust is installed now. Great!
To get started you need Cargo’s bin directory ($HOME/.cargo/bin) in your PATH
environment variable. Next time you log in this will be done automatically.To configure your current shell run source $HOME/.cargo/env
といったメッセージが表示されるので、指示に従い
$source $HOME/.cargo/env
を実行します。
$rustc --version
rustc 1.19.0 (0ade33941 2017-07-17)
のようになればインストールは成功です!
Windowsの場合
*.exe形式のインストーラが提供されていますので、それを利用します。
環境変数%PATH% にrustcへのパスが登録されていることを確認しましょう。
Hello, World!!
どのプログラミング言語でも、最初のプログラムはHello Worldであるときまっています。したがって、ここでもRust流のHello Worldを実行してみましょう!
ビルドシステムを使ったビルドが一般的である都合上、このような小さなプログラムでもプロジェクトとして扱うのがやりやすいようです。ここではhello-world というディレクトリを作成し、すべてここで作業することにします。
ではようやくコードを書きましょう。ちなみに勘のいいみなさまにおかれましてはすでにお気づきかもしれませんが、Rustのコードの拡張子は*.rs です。ここではhello.rs とでもしておきましょう。
fn main() {
println!("Hello, World!!");
}
これを
$rustc hello.rs
とすれば実行ファイルが生成されます。file コマンドの出力を見ると、ネイティブのバイナリが吐き出されているようですね(ちなみにUbuntu17.04環境では未ストリップのELFバイナリでした)。
$ll
total 784
-rwxr-xr-x 1 xxxx staff 396584 8 20 22:47 hello*
-rw-r--r-- 1 xxxx staff 46 8 20 22:46 hello.rs
$file hello
hello: Mach-O 64-bit executable x86_64
あえていうまでもないことかと思いますが、このhello を実行した結果はもちろん
$./hello
Hello, World!!
です。
おめでとうございます!これであなたも立派なRustプログラマですよ!!
……ところでするどいあなたはprintln!() の! にお気づきになったことでしょう。これはなにかというと、println が関数ではなくマクロであることを示します。マクロがなにか、ということについてはここでは割愛しましょう。ともかく、これは関数ではないのだ、ということだけ記憶の片隅においておければよいでしょう。
エディタ?
わたしはこれらのコードを書くのにVisual Studio Code(以下VSCode)を利用しています(そのあたりもそのうち記事にしたいところです)。VSCodeならとくにプラグインなしでもRustコードのシンタックスハイライトくらいはしてくれます。より快適なコーディングを目指すのであれば、
等がおすすめです。またCargoで利用するTOMLの編集にはBetter TOMLがおすすめです。
ビルドシステムCargo
さて、この記事の最初に、Rustにはビルドシステムがバンドルされている、と書きました。こんどはそれを試してみましょう。このビルドシステムはCargoという名前です。
ほかのビルドシステムでも一般的なように、ソースコードを配置するディレクトリ、生成物が置かれるディレクトリ、というものが決まっているので、hello-world プロジェクトのディレクトリ構造もそれに合わせて変更しましょう。
現在ディレクトリにある実行ファイルhello は削除してしまい、hello.rs は新たに作成したディレクトリsrc に配置します。……実行ファイルを作る場合、そのエントリポイントとなるファイルはmain.rs である必要があります。これはCargoの規約ですのでそれに合わせてリネームしておきます(最初からそうしておけばよかった……)。この規約はもちろん上書きすることもできますが、多くの場合はそれは手間になってしまうので、規約に沿って構成するのがよいでしょう。
とりあえず、このような形になります。
$tree
.
└── src
└── main.rs
さて、Cargoを使ってビルドするにはその設定ファイルが必要です。プロジェクトのルートディレクトリにCargo.toml ファイルを作り、以下のように記述します(Cが大文字であることに注意してくださいね)。
[package]
name = "hello-world"
version = "1.0.0"
authors = ["your name<your-mailaddress@example.com>"]
ちなみにTOMLについてはhttps://github.com/toml-lang/tomlを参照してください。
この状態で、プロジェクトのルートディレクトリでcargo run とすると
$cargo run
Compiling hello-world v1.0.0 (file:///Users/xxxx/Documents/devel/rust/hello-world)
Finished dev [unoptimized + debuginfo] target(s) in 2.55 secs
Running `target/debug/hello-world`
Hello, World!!
のような出力が得られるはずです。src 以下にあるソースからバイナリをビルドし、それから実行していますね(ちなみにバイナリはtarget/<release|debug> ディレクトリに生成されます)。run するかわりにbuild とすれば、実行せずにビルドだけ、とすることも可能です。また、(ビルドシステムとはそういうものなんですが)ビルド済みで変更されていないファイルは再びビルドされることはありません。試しにrun したあとにそのままbuild してみてください。Compling… のように表示されず、いきなりFinished… と表示されることがわかるはずです。
ちなみにcargo build –release とすることで、デバッグ情報等を除去し、最適化をかけた小さな、高速なバイナリを出力させることもできます。ただしビルド時間は伸びます。
ところで、Cargoを使うとプロジェクトをまるごとセットアップすることもできます。cargo new <プロジェクト名> –binと すればここで作成したようなディレクトリ構造を自動で作ってくれます。–bin というのは「最終生成物が実行ファイルである」ことを意味します。ライブラリプロジェクトであれば–lib とします。
おわりに
いかがだったでしょうか。ものすごく駆け足でしたがRustに片足の指先くらいは踏み入ることができたのではないかと思います。……実際のところ、この記事の内容だけではRustの特徴的な部分をなにひとつ紹介できていないのですが……
なお、この記事を読むよりもよいと思われる、公式の、それも日本語のドキュメントがありますので最後にご紹介しておきます。
次回以降(もしあれば)より深くRustに潜っていきたいと思います。
お楽しみに。では。