Chapter 02

環境構築

環境構築

前章で説明した通り,コードテストを用いるとプログラムを実行することができます.しかし,自分のパソコンの上でソースコードを書いたり実行したりしたい人もいるでしょう.この章では,そのような人のために環境構築の仕方を説明します.これからもコードテストを使い続ける人はこの章を読み飛ばしてもかまいません.

CLI

Rust を使う上で CLI ( CUI )を扱う必要があるため, CLI について説明します.慣れている人はここまで読み飛ばしてかまいません.

コマンドは,次のような場所で実行できます.

  • コマンドプロンプト( Windows )
  • PowerShell ( Windows )
  • ターミナル( MacOS )
  • 端末( Ubuntu )
  • VSCode 上のターミナル( Windows / MacOS / Linux )
  • その他の端末エミュレータ
  • デフォルトの CLI 環境( Linux . WSL 含む)

自分の環境に存在するものをどれか 1 つ開いてください.すると,シェルというものが起動し,キーボードからの入力を受け付けるようになるはずです.

手始めに,次のコマンドを実行してみましょう.

$ pwd

先頭の $ はシェルがコマンド入力を受け付けているというサインで,あなたが実際に入力するのは pwd だけです.環境によっては $ ではなく > だったり % だったりするかもしれません.ただしこれが # のときは root としてシェルを開いている可能性が高いので注意してください.

入力したらエンターキーを押して実行してください. Windows なら C:D: , MacOS や Linux なら / から始まるパスが出力されるはずです.これはカレントディレクトリというものを表しています.

コンピュータの中にはデータの階層構造が形成されていて,たとえば Pictures というディレクトリ(フォルダともいいます)の中に写真が入っていたり, Downloads というディレクトリの中にダウンロードしたファイルが入っていたりします.シェルを使うとき,あなたは常に,何らかのディレクトリを基点として,その中や外にあるファイルを操作することになります.今操作の基点となっているディレクトリのことを,カレントディレクトリといいます.

cd コマンドを使うと,カレントディレクトリを移動することができます.カレントディレクトリ直下に Documents というディレクトリがあるとき,

$ cd Documents

を実行するとカレントディレクトリが Documents に移動します.

ls コマンドを使うと,カレントディレクトリ直下にあるファイルの一覧を得ることができます(ただし, Windows のコマンドプロンプトでは ls が存在しないので代わりに dir を使います).

$ ls

前章で説明したプログラムと同じように,これらのコマンドも標準出力,標準エラー出力を用いています. pwdls によって出力されるのは標準出力です.一方, cd で存在しないディレクトリに移動しようとしたときは,標準エラー出力にその旨が出力されます.また,これらの他には実行すると標準入力を受け付けるコマンドもあります.このように,コマンドを入力して実行し,標準入力・標準出力・標準エラー出力を用いてやり取りする環境のことを,コマンドラインインターフェース( CLI ) 環境といいます.

コンパイルと実行

ソースコードを書いてからプログラムが実行されるまでの流れを説明します. C/C++ など,既に他の言語でのプログラミング経験がある人はここまで読み飛ばしてかまいません.

コンピュータの上でプログラムを実行するには,コンピュータの理解できる言語(機械語)で書かれた実行可能ファイルを作る必要があります.しかし機械語は 55 48 89 e5 5d c3 といった値の羅列なので,普通の人間がこれを直接読み書きすることは困難です.そこで,まず C や C++ や Rust のようなプログラミング言語を使って手順書を書き,これを機械語に変換することで実行可能ファイルを作るという手段が発達しました.機械語への変換をコンパイルといい,コンパイルを行うプログラムをコンパイラといいます.変換前の,人が書いた手順書のことをソースコードと呼びます. Rust でソースコードを書くと,コンパイラがそれを実行可能ファイルに変換するわけです.

インストールするもの

まず, Rust を書いて実行できる環境を構築するためにインストールするものを挙げておきます.

rustcrustup が自動でインストール)

Rust のコンパイラです. Rust で書かれたソースコードをコンパイルし,実行可能ファイルを生成します.

cargorustup が自動でインストール)

コンパイルとその周辺の処理を合わせてビルドといいます.周辺の処理というのは,たとえばプログラムの部品となる便利な道具(ライブラリといいます)を必要に応じて揃えたり,プログラムが正常に動作するかテストしたりすることです. cargo は, Rust のビルドを自動化するツールです.この章では, rustc を直接実行する代わりに, cargo を通して rustc を間接的に実行する方法を説明します.

ライブラリを使うと,部品を組み合わせるようにして大規模なプログラムを簡単に書くことができます.この 1 つ 1 つの部品のことを, Rust ではクレートと呼びます.あなたが直接書いた部分も 1 つのクレートとして数えます.

crates.io では Rust の様々なライブラリクレートが公開されており,使いたいものを Cargo.toml というファイルに書き込んでおくと, cargo がダウンロードとビルドを自動的に行ってくれます.これは第 7 章で使います.

rustup

rustccargo ,その他周辺のツールを合わせて Rust ツールチェーンといいます. rustup は, Rust ツールチェーンのインストールとバージョン管理を行うツールです. rustup をインストールすると, rustccargo も自動的にインストールされます.

RLS

Windows の「メモ帳」や MacOS の「テキストエディタ」といった OS の標準テキストエディタを使用しても,ソースコードを書くことは可能です.しかし,高機能なエディタを使うとより快適にプログラミングをすることができます.

Rust Language Server ( RLS )は,エディタに Rust 用の機能(補完やエラー表示)を提供するツールです. VSCode や Vim や Emacs を始めとする様々なエディタで RLS を利用することができます.この章では,エディタとして VSCode を使う場合について説明します.

RLS も Rust ツールチェーンの 1 つであり, rustup を通してインストールしますが, rustccargo と違って自動的にインストールされるわけではありません.ただし VSCode の場合は自動的にインストールされます.

手順

rustup のインストール

公式の手順に従ってください.

MacOS や Linux の場合は,コマンドを一度実行するだけです.万が一 ld のようなリンカがインストールされていない場合,これもインストールする必要があります.

一方 Windows の場合は, rustup 自体のインストーラの実行にくわえて,ここから Visual C++ Build Tools をインストールすることが必要になります.

rustup rustc cargo がインストールされていることの確認

次のコマンドを実行してバージョンが表示されれば,正常にインストールされています.

$ rustup --version
$ rustc --version
$ cargo --version

cargo によるビルド

cargo は, newbuildrun などのサブコマンドをとります.

まず, Hello, world! の出力から始めましょう.新たなパッケージを作成するにはサブコマンド new を使います.次を実行してください.

$ cargo new hello_world

すると,カレントディレクトリ直下に hello_world という名前のディレクトリが作られ,そこに Rust のコードを書く環境が整います. cd で今できたディレクトリに移動してください.

$ cd hello_world

ソースファイルは src/main.rs にあります.このとき, Hello, world! を出力する次のようなプログラムが初めから書かれています.

src/main.rs
fn main() {
    println!("Hello, world!");
}

サブコマンド run で,ビルドと実行を行うことができます.

$ cargo run

Hello, world! と出力されれば成功です.

実行せずにビルドだけ行いときは,サブコマンド build を使います.

$ cargo build

また, hello_world 直下に Cargo.toml というファイルも作られているはずです.これを開くと, [dependencies] と書かれた行があるでしょう.ライブラリクレートを使用するときはこの下にその旨を記述します.記述の仕方については第 7 章で説明します.

RLS のインストール

エディタとして VSCode を使う場合を想定します.

まず, Ctrl + Shift + P を押してから

ext install rust-lang.rust

を入力して実行することで, Rust 用の拡張機能がインストールされます.すると, cargo new で作ったディレクトリを VSCode で開いたときに RLS が自動的にインストールされてコードの補完やエラーの表示が有効になります.

ジャッジシステムとバージョンを合わせる方法

Rust は,日々少しずつ変化する言語です. GitHub 上で多くの人が議論を重ね,よりよい言語にしようとしています.新しい Rust ツールチェーンが公開されたら, rustup を使って自分の環境をアップデートすることができます.

古い rustc でコンパイルできたソースコードが新しい rustc でコンパイルできなくなることはありません.これを後方互換性といいます.一方,新しい rustc でコンパイルできるソースコードが古い rustc でコンパイルできないことは十分に考えられます.

Rust で書いたコードを AtCoder に提出すると, AtCoder のサーバー上にある Rust ツールチェーンを用いてビルドと実行が行われます.手元の Rust ツールチェーンと AtCoder の Rust ツールチェーンのバージョンが異なる場合,手元で動くコードが AtCoder 上では動かないなどの問題が生じる可能性も考えられます.

手元の Rust ツールチェーンのバージョンは,次のコマンドで確認することができます.

$ rustc --version

X.XX.X のような部分がバージョンです.

一方, AtCoder の Rust ツールチェーンのバージョンは,コード提出画面の言語選択欄に書かれています.言語リストから Rust を選択するときに「 Rust (X.XX.X) 」のように書かれていたら, X.XX.X がバージョンです.

手元の環境を AtCoder に合わせる場合,まず AtCoder と同じバージョンの Rust ツールチェーンをインストールする必要があります.インストーラである rustup を使うと次のコマンドでインストールできます.

$ rustup toolchain install X.XX.X

X.XX.X の部分には, AtCoder の Rust ツールチェーンのバージョンを入れてください.

いま手元の環境には,もともとあった Rust ツールチェーンと今インストールした Rust ツールチェーンが両方存在しています. cargo を使ってビルドを行う際に,次のようにしてどちらを使うか指定します.

$ cargo +X.XX.X run
$ cargo +X.XX.X build

また,次のコマンドでデフォルトのツールチェーンを指定しておくと, cargo を実行するたびに毎回バージョンを指定する必要がなくなります.

$ rustup default X.XX.X