Hello, World!

Rustをインストールしたので、最初のRustプログラムを書きましょう。新しい言語を学ぶ際に、 Hello, world!というテキストを画面に出力する小さなプログラムを書くことは伝統的なことなので、 ここでも同じようにしましょう!

注釈: この本は、コマンドラインに基礎的な馴染みがあることを前提にしています。Rustは、編集やツール、 どこにコードがあるかについて特定の要求をしないので、コマンドラインではなくIDEを使用することを好むのなら、 どうぞご自由にお気に入りのIDEを使用してください。今では、多くのIDEがなんらかの形でRustをサポートしています; 詳しくは、IDEのドキュメンテーションをご覧ください。 Rustチームはrust-analyzerを介して優れたIDEサポートを可能にすることに注力しています。 詳しくは付録Dをご覧ください。

プロジェクトのディレクトリを作成する

Rustコードを格納するディレクトリを作ることから始めましょう。Rustにとって、コードがどこにあるかは問題ではありませんが、 この本の練習とプロジェクトのために、ホームディレクトリにprojectsディレクトリを作成してプロジェクトを全てそこに保管することを推奨します。

端末を開いて以下のコマンドを入力し、projectsディレクトリと、 projectsディレクトリ内に「Hello, world!」プロジェクトのディレクトリを作成してください。

Linux、macOS、そしてWindows上のPowerShellなら、こう入力してください:

$ mkdir ~/projects $ cd ~/projects $ mkdir hello_world $ cd hello_world

Windowsのcmdなら、こう:

> mkdir "%USERPROFILE%\projects" > cd /d "%USERPROFILE%\projects" > mkdir hello_world > cd hello_world

Rustプログラムを書いて走らせる

次にソースファイルを作り、main.rsというファイル名にしてください。Rustのファイルは常に .rsという拡張子で終わります。 ファイル名に2単語以上使っているなら、アンダースコアで区切るのが規約です。例えば、helloworld.rsではなく、 hello_world.rsを使用してください。

さて、作ったばかりのmain.rsファイルを開き、リスト1-1のコードを入力してください。

ファイル名: main.rs

fn main() { // 世界よ、こんにちは println!("Hello, world!"); }

リスト1-1: Hello, world!と出力するプログラム

ファイルを保存し、~/projects/hello_worldディレクトリの端末ウィンドウに戻ってください。 LinuxかmacOSなら、以下のコマンドを打ってファイルをコンパイルし、実行してください:

$ rustc main.rs $ ./main Hello, world!

Windowsなら、./mainの代わりに.\main.exeと打ちます:

> rustc main.rs > .\main.exe Hello, world!

OSに関わらず、Hello, world!という文字列が端末に出力されるはずです。この出力が見れないなら、 インストールの節の「トラブルシューティング」の部分に立ち戻って、助けを得る方法を参照してください。

Hello, world!が確かに出力されたら、おめでとうございます!正式にRustプログラムを書きました。 Rustプログラマになったのです!ようこそ!

Rustプログラムの解剖

この「Hello, world!」プログラムを詳しく再確認しましょう。 こちらがパズルの最初のピースです:

fn main() { }

これらの行はmainという名前の関数を定義しています。main関数は特別です: 常に全ての実行可能なRustプログラムで走る最初のコードになります。 ここで、1行目は、引数がなく何も返さないmainという関数を宣言しています。引数があるなら、かっこ(())の内部に入ります。

関数の本体は{}に包まれます。Rustでは、全ての関数本体の周りに波括弧が必要になります。 スペースを1つあけて、開き波括弧を関数宣言と同じ行に配置するのがいいスタイルです。

注釈: 複数のRustプロジェクトに渡って標準的なスタイルにこだわりたいなら、rustfmtを使うことでコードを決まったスタイルに整形できるでしょう(rustfmtの詳細は付録Dで)。 Rustチームは、rustcのように標準的なRustの配布にこのツールを含んでいるため、既にコンピューターにインストールされているはずです!

main関数の本体は、こんなコードを抱えています:

#![allow(unused)] fn main() { println!("Hello, world!"); }

この行が、この小さなプログラムの全作業をしています: テキストを画面に出力するのです。 ここで気付くべき重要な詳細が4つあります。

まず、Rustのスタイルは、タブではなく、4スペースでインデントするということです。

2番目にprintln!はRustのマクロを呼び出すということです。代わりに関数を呼んでいたら、 println(!なし)と入力されているでしょう。Rustのマクロについて詳しくは、第19章で議論します。 とりあえず、!を使用すると、普通の関数ではなくマクロを呼んでいるのだということと、マクロは関数と同じルールには必ずしも従わないということを知っておくだけでいいでしょう。

3番目に、"Hello, world!"文字列が見えます。この文字列を引数としてprintln!に渡し、 この文字列が画面に表示されているのです。

4番目にこの行をセミコロン(;)で終え、この式が終わり、次の式の準備ができていると示唆していることです。 Rustコードのほとんどの行は、セミコロンで終わります。

コンパイルと実行は個別のステップ

新しく作成したプログラムをちょうど実行したので、その途中の手順を調査しましょう。

Rustプログラムを実行する前に、以下のように、rustcコマンドを入力し、ソースファイルの名前を渡すことで、 Rustコンパイラを使用してコンパイルしなければなりません。

$ rustc main.rs

あなたにCやC++の背景があるなら、これはgccclangと似ていると気付くでしょう。コンパイルに成功後、 Rustはバイナリの実行可能ファイルを出力します。

Linux、macOS、WindowsのPowerShellなら、シェルでlsコマンドを入力することで実行可能ファイルを見られます:

$ ls main main.rs

LinuxとmacOSでは、2つのファイルが見えるでしょう。 WindowsのPowerShellでは、CMDを使ったときに見ることになるのと同じ3つのファイルが見えるでしょう。 WindowsのCMDなら、以下のように入力するでしょう:

> dir /B %= the /B option says to only show the file names =% %= /Bオプションは、ファイル名だけを表示することを宣言する =% main.exe main.pdb main.rs

これは、.rs拡張子のソースコードファイル、実行可能ファイル(Windowsならmain.exe、他のプラットフォームでは、main)、 そして、Windowsを使用しているなら、.pdb拡張子のデバッグ情報を含むファイルを表示します。ここから、 mainmain.exeを走らせます。このように:

$ ./main # or .\main.exe on Windows # または、Widnowsなら.\main.exe

main.rsがHello, world!プログラムなら、この行はHello, world!と端末に出力します。

RubyやPython、JavaScriptなどの動的言語により造詣が深いなら、プログラムのコンパイルと実行を個別の手順で行うことに慣れていない可能性があります。 RustはAOTコンパイル(ahead-of-time; 訳注: 予め)言語です。つまり、プログラムをコンパイルし、 実行可能ファイルを誰かにあげ、あげた人がRustをインストールしていなくても実行できるわけです。 誰かに .rb.py.jsファイルをあげたら、それぞれRuby、Python、JavaScriptの処理系がインストールされている必要があります。 ですが、そのような言語では、プログラムをコンパイルし実行するには、1コマンドしか必要ないのです。 全ては言語設計においてトレードオフなのです。

簡単なプログラムならrustcでコンパイルするだけでも十分ですが、プロジェクトが肥大化してくると、 オプションを全て管理し、自分のコードを簡単に共有したくなるでしょう。次は、Cargoツールを紹介します。 これは、現実世界のRustプログラムを書く手助けをしてくれるでしょう。