Rustチュートリアル:Rust言語を使い始める

過去2年間で、Rustは、Mozillaの従業員の研究室で醸造された好奇心から、次世代のネイティブアプリとベアメタルソリューションを作成するための強力な候補になりました。しかし、これらの進歩は、独自の機能と癖に加えて、独自のツールチェーンとコンポーネント管理システムを提供するRustからもたらされています。

この記事では、Rustでの作業環境のセットアップ、IDEの構成、およびRustがアプリ開発に提供するツールセットを最大限に活用するための基本について説明します。

関連ビデオ:Rustを使用したより安全なソフトウェアの開発

高速なシステムレベルのソフトウェアを作成するように設計された、新参のRustをすばやく習得します。この2分間のアニメーションの説明者は、Rustがメモリと管理の厄介なプログラミングの問題をどのように回避するかを示しています。

Rustのナイトリー、ベータ版、および安定版のリリースを理解する

Rustのツールチェーンは、主にRustコンパイラとrustcRustインストールを管理するためのツールで構成されています。Rustは絶えず開発されているため、Rustツールチェーンは簡単に最新の状態に保つように設計されています。

ソフトウェアプロジェクトは、コードの安定バージョンとベータバージョンを分離するために、複数のチャネルを介して提供されることがよくあります。Rustのツールチェーンは同じように機能し、ツールチェーンに3つのチャネルを提供します。

  • 安定:メジャーポイントリリース。6週間ごとに発生します。
  • ベータ版:次のメジャーポイントリリースの候補。これはより頻繁に登場します。
  • 毎晩:最先端の機能にアクセスできる最も即時のビルドですが、安定性についての保証はありません。

開発者のKarolKuczmarskiが指摘しているように、毎晩のRustチャンネルを独自の言語と考えるのが最善です。WebAssemblyへのコンパイルなど、一部のRust機能は、夜間チャネルでのみ使用可能であり、特別なコンパイラ指令によってのみアクティブ化できます。言い換えれば、ベータチャネルや安定したチャネルでコンパイルすることすらできません。 

夜間の機能が他の場所でサポートされる保証はないため、これは仕様によるものです。ただし、これらの機能の多くは、最終的には夜間チャネルからベータ版および安定版リリースに移行します。(たとえば、WebAssemblyへのコンパイルは、Rust 1.30の時点で安定して動作します。)

要するに:

  1. 実際の生産作業には厩舎を使用てください。
  2. ベータ版を使用して、現在のソフトウェアを今後のバージョンに対してテストし、アップグレードで問題が発生する可能性があるかどうかを確認します。
  3. Rustの最新機能を使用したサンドボックス実験には、毎晩のみ使用してください。

Rust開発用のOSを選択してください

Rustは、32ビットと64ビットの両方のバージョンで、Windows、Linux、MacOSの3つの主要なプラットフォームすべてをサポートし、それぞれに公式のバイナリがあります。他の多くのプラットフォームにも公式のバイナリがありますが、同じレベルの自動テストカバレッジはありません。これらのセカンドクラスのプラットフォームには、iOS、Android、およびLinux用のARMv6およびARMv7が含まれます。MIPSLinuxおよびMIPS64Linux; x86 iOS、Windows、およびLinuxの32ビットエディション。およびWebAssembly。Windows XPや実験的なHaikuOSのような他のプラットフォームは、非公式のビルドを通じてサポートされています。

Rustの開発チームは、可能な限り広く移植できることはRustの使命の1つではないと述べています。たとえば、Rustは多くのARMアーキテクチャで利用できますが、Rustがローエンドのハードウェアプラットフォームで正式にサポートされるとは限りません。

そうは言っても、サポートされているRustビルドは、一般的な主流のユースケースの大部分、つまり32ビットと64ビットのWindows、Linux、MacOSで利用できるはずです。

Rust on Windowsでの開発を計画している場合は、ツールチェーンを念頭に置いてください。Rustは、Windowsで2つのツールチェーンをサポートしています。

  • ネイティブのMicrosoftVisual C(MSVC)ABI
  • GCCリンカーによって使用されるGnuABI。

とにかく、Windowsに組み込まれているほとんどすべてのC / C ++ソフトウェアはMSVCを使用しているため、ほとんどの場合、MSVCツールチェーンを使用することをお勧めします。GCCが必要な場合は、WindowsでGCCを使用して構築されたサードパーティライブラリと相互運用するためのものである可能性があります。

幸いなことに、Rustのツールチェーン管理システムでは、MSVCGCCの両方のツールチェーンをインストールしたままにして、プロジェクトごとにそれらを切り替えることができます。

Rustのコンパイルターゲットの1つはWebAssemblyです。つまり、Rustで記述して、Webブラウザーにデプロイできます。WebAssembly自体はまだ端が荒いので、Rustのサポートもそうです。しかし、野心的で手を汚したい場合は、RustとWebAssemblyの開発者が編集した、WebAssemblyをRustにコンパイルするプロセスについて詳しく説明している本を読んでください。この本には、Rustで記述され、WebAssemblyとしてデプロイされた、ConwayのGame ofLifeの実装である単純なプロジェクトのチュートリアルが含まれています。

Rustのセットアップを開始する rustup

Rustは、と呼ばれるオールインワンのインストーラーとツールチェーンのメンテナンスシステムを提供しますrustup。ダウンロードrustupして実行します。Rustツールチェーンの最新バージョンを取得してインストールします。

によって維持される最も重要なツールrustupは次のとおりです。

  • rustup自体。新しいバージョンrustupまたは他のツールが公開されたときはいつでも、実行rustup updateしてすべてを自動的に更新することができます。
  • rustc、Rustコンパイラ。
  • RustのパッケージおよびワークスペースマネージャーであるCargo。

デフォルトでrustupは、安定したチャネルからRustをインストールします。あなたはベータ版や夜間のバージョンを使用したい場合は、あなたが(例えば、それらのチャネルをインストールする必要があります rustup install nightly)、およびそれらをデフォルトで使用するために錆を設定します(rustup default nightly)。Rustアプリケーションをコンパイルするときに使用するチャネルを手動で指定することもできるため、プロジェクト間を移動するたびにデフォルトを設定およびリセットする必要はありません。

rustup カスタムツールチェーンのインストールと保守にも使用でき ます。これらは通常、サポートされていないプラットフォーム用のRustの非公式のサードパーティビルドで使用されます。これらは通常、独自のリンカーまたは他のプラットフォーム固有のツールを必要とするためです。

IDEをRust用に構成する

Rustは比較的新しい言語ですが、すでに多くの一般的なIDEから強力なサポートを受けています。開発者のManuelHoffmanは、ウェブサイトareweideyet.comでそのようなサポートの状態を追跡するプロジェクトを維持しています。

RustをIDEとうまく連携させることは、Rust Language Server(RLS)と呼ばれる機能を介して、開発チームの明確な目標です。RLSは、サードパーティのパーサーからではなく、Rust独自のコンパイラから問題のコードに関するライブフィードバックを提供します。

RustをサポートするIDEは次のとおりです。

  • MicrosoftのVisualStudio Codeには、Rust独自の開発者ツールチームによって作成されたRust言語サポート拡張機能があります。このレベルの統合により、Rustで最もサポートされているIDEの1つになります。 
  • Eclipseユーザーは、Rust開発用にパッケージ化されたエディションのEclipseをダウンロードするか、EclipsePhoton用のスタンドアロンのCorrosionプラグインを使用できます。(以前のパッケージであるRustDTは保守されなくなりました。)
  • あなたがEmacsやVimのファンなら、あなたのような他の開発者は両方のエディターのためにRust固有のアドオンを書いています。EmacsにはRust固有のモードがあり、Vimには構文の強調表示とフォーマットを提供するプラグインがあります。RLSサポートはEmacsとVimの両方で利用できますが、手動で追加および構成する必要があります。
  • IntelliJ IdeaおよびAtomユーザーは、プラグインを追加してRustサポートを完成させることができます。
  • Sublime TextはすぐにRust構文をサポートし、プラグインは他の機能をより深くサポートします。
  • Rust専用のシンプルなIDEを作成するプロジェクトSolidOakは、しばらくの間開発中でしたが、その後行き詰まりました。最善の策は、すでにサポートされている既存のIDEの1つを使用することです。

最初のRustプロジェクトを作成する

Rustプロジェクトは、コードとプロジェクトメタデータが特定の方法で格納された、一貫したディレクトリ構造を持つことを目的としています。コードはsrcサブディレクトリに保存され、プロジェクトに関する詳細は、プロジェクトのルートディレクトリCargo.toml(プロジェクトの基本情報)とCargo.lock(自動的に生成された依存関係のリスト)の2つのファイルに保存されます 。そのディレクトリ構造とメタデータは手動で作成できますが、Rust独自のツールを使用して作業を行う方が簡単です。

ヒント:  Rustを学習するためのRust By Exampleオンラインガイドには、ブラウザーで直接編集して実行できるインタラクティブなコードサンプルが用意されています。借用やライフタイムなど、より重要な概念のいくつかは議論の比較的遅い段階で紹介されていますが、ほとんどすべての主要なRustの概念に触れています。

RustのCargoツールは、Rustプロジェクトと、それらが使用するライブラリまたは「クレート」の両方を管理します。my_project独自のディレクトリで名前が付けられた新しいRustプロジェクトを起動するには、と入力しcargo new my_projectます。(.Net Coreを使用するC#開発者の場合、dotnet newコマンドについて考えてみてください。)新しいプロジェクトは、その名前のサブディレクトリに、基本的なプロジェクトマニフェスト(Cargo.tomlファイル)およびプロジェクトのソースコードのスタブとともにsrcサブディレクトリに表示されます。

新しいプロジェクトを作成する と、プロジェクトのディレクトリにmain.rsファイルが自動的に作成されますsrc。このファイルには基本的な「helloworld」アプリが含まれているため、Rustツールチェーンをコンパイルして実行することですぐにテストできます。

「helloworld」アプリのソースコード:

fn main() {

    println!(“Hello World!”);

}

ビルドして実行するには、プロジェクトディレクトリのルートを入力し、と入力しcargo runます。デフォルトでは、Cargoはデバッグモードでプロジェクトをビルドすることに注意してください。リリースモードで実行するには、を使用しますcargo run --release。バイナリは、使用しているコンパイルプロファイルに応じて、プロジェクトのtarget/debugまたはtarget/releaseサブディレクトリに作成されます。

錆びた木枠を扱う

パッケージ管理は、最新のプログラミング環境の重要な部分です。そのために、Rustは「クレート」を提供しています。これは、Rustのツールを使用して配布するためにパッケージ化されたサードパーティライブラリです。クレートは、公式のRustパッケージレジストリであるCrates.ioにあります。

プロジェクトが特定のクレートに依存している場合は、プロジェクトのCargo.tomlファイルを編集してそのクレートを指定する必要があります。これを行う標準的な方法は手動です。つまりCargo.toml、テキストエディタで直接編集するだけです。次回プロジェクトが再構築されると、Rustは必要な依存関係を自動的に取得します。

ヒント: 2つのツールcargo-editとはcargo-edit-locally、非公式のサードパーティプロジェクトですが、コマンドラインから依存関係を更新できます。

外部のクレートに依存するRustプロジェクトをビルドすると、CargoはデフォルトでCrates.ioでそれらのクレートを検索します。手動で入手する必要はありません。プライベートリポジトリからのものなど、レジストリでホストされていないクレートが必要な場合は、クレート名ではなくURLでプロジェクト内のクレートを参照することもできます。

一部のクレートは、他のチャネルでは利用できない実験的な機能を使用しているため、Rustの夜間チャネルにのみインストールおよび構築されることに注意してください。リリースチャネルを使用していて、そのようなクレートをインストールしようとすると、コンパイル自体が失敗するまで警告は表示されません。クレートのドキュメントには通常、夜間チャネルが必要かどうかが記載されているため、コンパイルはもちろん、含める前によく読んでください。

木枠にはバイナリが含まれている場合があります。一部はRust開発で使用されるコマンドラインツールです。その他は汎用ツール(など ripgrep)です。これらの箱の1つをインストールするには、と入力するだけですcargo install 。これは、Rustで作成されたバイナリを配布する唯一の方法ではありませんが、Rust開発者がRustツールを含むワークフローの一部としてそれらを取得するための便利な方法です。

Rustを別のプラットフォームにクロスコンパイルする

Rustは複数のツールチェーンをサポートしているため、Rustの同じインストールでも、コンパイルしているものとは異なるターゲットOSおよび環境にRustアプリケーションをコンパイルできます。

このようなクロスコンパイルには、ターゲットプラットフォームと一致する、作業中のプラットフォーム上のツールチェーンが必要です。場合によっては、Windows上のLinuxへのクロスコンパイルやその逆の場合のように、これにはGCCリンカーが必要なだけです。しかし、それ以外の場合は、より複雑です。たとえば、MacOSにクロスコンパイルするには、ジョブを完了するためにXcode IDEライブラリ(cctools(Appleのbinutilsに相当)とMacOS SDK)が必要です。

サードパーティのツールは、これらの問題を回避するいくつかの方法を提供します。

  • そのようなツールの1つに、Rustプロジェクトのバイナリリリースを自動的に公開できるTravisCIおよびAppVeyorテンプレートであるTrustがあります。Linux、Windows、MacOS向けにビルドできますが、Travis CIおよびAppVeyorサービスを使用する必要があり、プロジェクトをGitHubでホストする必要があります。
  • 別のプロジェクトであるCrossは、64ビットx86 Linuxホスト上で直接実行されますが、その作成者が64ビットWindowsやMIPSを含むさまざまなターゲットへの「ゼロセットアップ」クロスコンパイルと表現するものを提供します。
  • クロスビルドプロジェクトは、3つの主要なプラットフォームすべての間でクロスビルドするために使用できるマルチアーキテクチャのDockerイメージを提供します。