Rustのインストールが無事完了したので、最初のRustプログラムを書きましょう。新しいプログラミング言語を学ぶ際に「Hello, world!
」というテキストを画面に出力するだけの小さなプログラムを書くことは伝統的なことなので、ここでも同じようにやってみましょう!
注記: この本では、基本的なコマンドライン操作に馴染みがあることを前提にしています。しかし、Rustは、コード編集やツール、どこにコードを置いているのかといったことに対して特定の要求事項を持たないので、コマンドライン操作ではなく「IDE(統合開発環境)」を使用したいのであれば、ご自由にお気に入りのIDEを使ってください。今では、多くのIDEがなんらかの形でRustをサポートしています; 詳しくは、各IDEのドキュメンテーションをご覧ください。最近ではRustチームも優れたIDEを利用可能にすることに注力しており、その方面で急激に成果があがっています!
《訳注》 IDE(integrated development environment): 〔統合開発環境、の意〕 プログラム(ソフトウェア)の開発に必要なツールを一つにまとめて統一した操作方法で使えるようにした総合的なプログラムのことです。
ではRustコードを保存しておくディレクトリを作ることから始めましょう。Rustにとってはコードがどこに保存されているかは問題ではありませんが、練習とこの本のプロジェクト用に、ホームディレクトリに「projects」ディレクトリを作成してプロジェクトを全てその中にまとめて保管することを推奨します。
《訳注》 ディレクトリ (directry): 〔住所氏名簿・フロアガイド、の意〕 コンピュータではファイルを保管・分類・管理するために設けられた場所、すなわち「フォルダ」のこと。「ホーム・ディレクトリ」は、そのコンピュータのユーザー毎に割り当てられた、各個人のメイン・フォルダ(最上位のフォルダ)のことで、コンピュータのシステムや他のユーザーのデータと混ざらないように、自分のデータを保管する場所です。ディレクトリ(フォルダ)はいくつでも作成できます。
《訳注》 プロジェクト (project): 〔活動計画、の意〕 プロジェクトと聞くと大掛りなものを想像しますが、要するに「作成するプログラム」のことです。
端末を開いて以下のコマンドを入力し、まずprojectsディレクトリを作成、それからprojects*ディレクトリの中に「Hello, world!」プロジェクトのディレクトリを作成してください。
Linux とmacOS、WindowsのPowershellなら、こう入力します:
注記: 公式日本語版では「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
《訳注》 コマンドの意味: ここで使われているコマンドの意味は次の通りです。
- mkdir = make directory (ディレクトリの作成)
- cd = change directory (ディレクトリ位置の切り替え)
- %USERPROFILE% の部分には、各個人のユーザー・ディレクトリ名が表示されているはずです。
ではソースファイルを新しく作り、「main.rs」というファイル名で保存してください。Rustのファイルは常に「.rs」という拡張子で終わります。ファイル名に2単語以上使っているなら、アンダースコア記号( _ )で区切ってください。例えば、「Hello」「World」の2語が含まれるファイル名の場合は、helloworld.rsではなく、hello_world.rsのようにします。
《訳注》 ソースファイル (source file): 〔源のプログラム・データ、の意〕 プログラミング言語で書かかれたままのプログラム・データを「ソースコード」、そのデータを保存したファイルを「ソースファイル」といいます。ファイル形式は普通のテキストファイルなので、テキスト・エディターなどで作成できますが、IDE(統合開発環境)を用いると、ソースファイルの作成・保存・コンパイル・実行テストなどがシームレスに行なえて便利です。
さて、作ったばかりの何も書かれていない「main.rs」ファイルを開き、リスト1-1のコードを入力してください。
ファイル名: main.rs
fn main() {
println!("Hello, world!");
}
ファイルを保存し、端末ウィンドウに戻ってください。LinuxかmacOSのPCであれば、次の二行のコマンドを入力してファイルをコンパイルし、実行します(3行目のように「実行結果」が表示されます):
$ rustc main.rs
$ ./main
Hello, world!
WindowsのPCの場合は、./main
の代わりに.\main.exe
と入力します:
> rustc main.rs
> .\main.exe
Hello, world!
どのオペレーティング・システムのPCでも、Hello, world!
という文字列が端末画面に出力されるはずです。この表示がされないならば、「トラブルシューティング」のところに立ち戻って、助けを求める方法を参照してください。
「Hello, world!
」が表示されましたか? おめでとうございます! 正式なRustプログラムを書き上げました。これであなたもRustプログラマです! ようこそ、Rustプログラムの世界へ!
「Hello, world!」プログラムでいま何が起こったのか詳しく確認しましょう。こちらがパズルの最初のピースです:
fn main() {
}
このfn
で始まる行はRustで関数(function)を定義しています。中でもmain
関数は特別です: main
関数は、常に全ての実行可能なRustプログラムの中で走る最初のコードです。1行目は、main
という関数を宣言しています。この関数にはパラメータ(引数)」がないので「空の( )」が続き、何の実行結果(戻り値)も返しません。引数がある場合、丸括弧「( )」の中に記載されます。
《訳注》 引数 parameter または argument: 関数を実行するときに、処理の対象となるパラメータ項目のことです。数学では「媒介変数」とか「助変数」のように呼ばれますが、コンピュータでは「引数(ひきすう)」と呼ばれています。処理の結果(戻り値)が必要ない関数には「引数」はありません。なお、英語では「プログラムを呼び出す時の引数が「パラメータ」で、コマンドを実行する時に代入する値を「アーギュメント」と使い分けられているようです。argumentsの略である
args
は、関数名やプログラム内の「引数用変数名」としても用いられています。《訳注》 戻り値 return: 関数を実行した際の処理結果の値です。
また、関数の本体が波括弧「{ }」に囲まれていることにも注目してください。Rustでは、全ての関数本体の周りに波括弧が必要です。スペースを1つあけて、開き波括弧を関数宣言と同じ行に配置するのが良いスタイルです。
どのRustプロジェクトにも標準的なスタイルを適用したいのであれば、自動フォーマットツール「rustfmt
」〔rust-formatの意〕を利用できます。このツールは既定のスタイルにコードを整形するツールで、Rustチームは「rustc」のような標準Rust配布版(ディストリビューション)にこのツールを含めました。従って、あなたのコンピュータにも既にインストールされているはずです。詳細は、オンラインのドキュメンテーションを確認してください。
さて、このmain
関数の中には、次のコードが記載されています:
println!("Hello, world!");
この行が、この小さなプログラムの全作業を行なっています: テキストの画面出力です。ここで注意すべき重要事項が4つあります。
- その1: Rustのスタイルは、タブではなく、4スペースでインデントするということです。
- その2:
println!
はRustのマクロを呼び出しているということです。関数を呼び出すのであれば、println
(「!
」記号なしで記述)と入力されます。Rustのマクロについては、第19章で詳しく説明します。とりあえず、!
を使用すると、普通の関数ではなくマクロを呼んでいるのだということと、マクロは必ずしも関数と同じ規則には従わないということを知っておいてください。 - その3:
"Hello, world!"
の文字列が見えますが、この文字列は引数(ひきすう)としてprintln!に渡され、その文字列が画面に表示されているのです。 - その4: 行をセミコロン(
;
)で終えると、この式が終わり、次の式を始める準備ができていることを示すことです。Rustコードのほとんどの行は、セミコロンで終わります。
先ほど、新しく作成したHello, World!
プログラムを実行ししましたが、その実行過程も確認しておきましょう。
Rustプログラムを実行する前には、以下のように、作成したプログラムをRustコンパイラを使ってコンパイルする必要があります。これには、`rustc'コマンドを入力し、コンパイルするソースファイルの名前を指定します。
$ rustc main.rs
あなたにCやC++でのプログラミング経験があるのなら、これはgccやclangと似ていると気付くでしょう。コンパイルが成功すると、Rustは「バイナリの実行可能ファイル」を出力します。
《訳注》 実行可能ファイル (executable file): プログラムの処理内容をコンピュータが理解できるかたちに変換したデータのこと。バイナリは「二進法の」の意味。ウィンドウズなどのプログラム名が「****.exe」のように.exeで終わっているのは、コンピュータ実行可能(executable)形式に変換されたファイルであるため。
Linux、macOS、Windows のPowerShellなら、シェルで以下のようにls
コマンドを入力することで実行可能ファイルを見ることができます。LinuxとmacOSではファイルが2つ、WindowsのPowerShellでは、CMDを使用した場合と同様、3つのファイルが見られます。
$ ls
main main.rs
WindowsのCMDでは、次のように入力します。
> dir /B
main.exe
main.pdb
main.rs
《訳注》 原文記載の「%= the /B option says to only show the file names =%」は「/B オプションは、ファイル名だけを表示することを宣言しています」の意味です。「%= … =%」はウィンドウズ・コマンドプロンプトでの「コメント」表記を行なうやりかたで、コマンドではありません。
ここでは、.rs拡張子のついたソースコードファイル、実行可能ファイル(Windowsの場合はmain.exe、その他のプラットフォームではmain)、そしてWindows CMDの場合、.pdb 拡張子のついたデバッグ情報を含むファイルを表示しています。ここから、mainかmain.exeを走らせます。このように:
$ ./main #
(ウィンドウズの場合は .\main.exe と入力)
コンパイルしたmain.rsが「Hello, world!」プログラムならば、この入力でHello, world!
が端末画面に出力されるでしょう。
もしあなたがRubyやPython、JavaScriptなどの動的プログラム言語に慣れ親しんでいるのでしたら、プログラムのコンパイルと実行を個別の手順で行なうことに戸惑うかもしれません。RustはAOTコンパイル言語です(AOT = ahead-of-time = 事前に、予め)。つまり、プログラムを事前コンパイルし、出来上がった実行可能ファイルを誰かに渡せば、渡された人はRustをインストールしていなくても実行できるわけです。しかし、誰かに.rb、.py、あるいは.jsファイルを渡した場合は、その人はそのプログラムを実行するために自分のパソコンにRuby、Python、JavaScriptをインストールしている必要があります。反面、そのような言語ではプログラムをコンパイルし実行するのに、コマンドを一つしか必要としないのです。全ては言語設計においてなにを優先するかの選択結果なのです。
簡単なプログラムならrustcでコンパイルするだけで十分ですが、プロジェクトが肥大化してくると、オプションを全て管理したり、自分のコードを他の人と簡単に共有したくなるでしょう。そこで次章では、Cargoツールを紹介します。このツールは、実際のRustプログラムを書く手助けをしてくれるでしょう。