Rustをはじめよう その1(言語概要&開発環境構築編)

三菱総研DCS 技術戦略部の加藤です。 この記事では、プログラミング言語Rust(ラスト)の概要と開発環境構築についてまとめます。

前書き

記事概要

  • この記事では、Rustの概要と開発環境構築について解説します。
  • 今後、今回を含めて全4回に渡ってRustについての話題を投稿する予定です。特に、他の言語と比較して、Rustに特徴的な文法や機能について紹介できればと思います。

こんな方におすすめの記事です

  • Rustに興味がある方
  • 新しいプログラミング言語を習得しようと考えているが、どの言語を学習するか迷われている方
  • 他のプログラミング言語を用いた開発経験がある方
    • 初めてプログラミングに触れるという方には、少々難しい内容かもしれません。
    • とはいえ、わかりやすく・簡潔に記述していますので、興味があればぜひご一読ください!

動作環境について

今回は、以下の環境に開発環境を構築します。

  • OS: Windows 7 64bit
    • 開発環境の構築手順をまとめたのが昨年のため、Windows 7を使用しています。
    • Windows 10でも、手順の大筋は変わりません。
  • ネットワーク環境: 社内環境のため、FWにより一部通信が制限されている
    • 手順の中で、プロキシサーバを経由するための設定を実施します。

Rustの概要

まず、Rustがどのようなプログラミング言語なのか、ご紹介します。
すでにRustについてご存知の方や、先に環境構築の手順を確認したい方は、このセクションを飛ばして「開発環境構築」からお読みください。

Rustの来歴

まずは、Rustがこれまでにたどってきた来歴についてご紹介します。

Rustは、2006年にMozilla社のエンジニアであるGraydon Hoare氏の個人プロジェクトとして開発が始まりました。その後、2009年にMozilla社の正式なプロジェクトとなり、以降は同社が開発支援を続けています。

Rustの最初の安定版は2015年にリリースされました。本記事の執筆時でリリースから約5年と、比較的新しいプログラミング言語ですが、リリース当初から現在に至るまで開発者に支持され続けています。
技術情報のQAサイトであるStack Overflowでは、毎年1月に世界中の利用者に向けてアンケートを実施しています。その中に「最も愛されている言語」という項目があります。この項目は、ある言語を使用している人の中で、今後も使い続けたいと回答した人の割合で各言語を順位付けしたものです。
Rustは、この項目で2016年から2019年まで、4年連続で1位となりました。2019年のアンケート結果では、Rust使用者の83.5%が今後も使い続けたいと回答しています。

Stack Overflow利用者に限ったアンケート結果とはいえ、Rustがここまで支持され続けている理由は何なのでしょうか。その理由は、パフォーマンスに優れている一方で、安全なプログラムを効率よく開発できる特徴があるからだと考えられます。
以下では、これらの特徴について簡単にご説明します。

Rustの特徴

・パフォーマンス

Rustで記述したプログラムは、実行が高速なCやC++といった言語と同じくらい高速で動作することが可能です。
以下に、各プログラミング言語の実行速度を比較した例を、参考資料として示します。[1]はThe Computer Language Benchmarks Gameというベンチマーク用プログラムの実行速度比較を、[2]は各言語でネットワークドライバを実装した場合の速度比較を、それぞれまとめています。

[1] Which benchmark programs are fastest? | Computer Language Benchmarks Game
[2] GitHub - ixy-languages/ixy-languages: A high-speed network driver written in C, Rust, Go, C#, Java, OCaml, Haskell, Swift, Javascript, and Python

結果の詳細については説明を割愛しますが、いずれの結果もRustの実行速度はCやC++とほぼ同等であることを示しており、数あるプログラミング言語の中でも動作が最速レベルであることがわかります。
Rustの動作が高速な理由はいくつかあり、ガベージコレクション(GC)が存在しない点や、プログラムが機械語に変換されて実行される点などが挙げられます。これらの詳細についても説明を割愛しますが、プログラム実行のオーバーヘッドを増加させうる仕組みを排除することで、高速な動作を実現していると理解してください。

・プログラムの安全性、信頼性

前述の通り、Rustにはガベージコレクションが存在しません。その代わり、Rustのメモリ管理は主に「所有権」という仕組みに則って行います。この仕組みにより、初期化前のメモリにアクセスしたり、解放後のメモリにアクセスしたりするなどの、メモリ周りのバグを未然に防ぐことができます。
所有権を含むRustの特徴的な仕組みについては、次々回の記事でまとめる予定です。とはいえ、所有権はなかなか興味深い仕組みですので、ご興味のある方は以下をご覧になることをおすすめします。

所有権とは? - The Rust Programming Language

・生産性

Rustのコンパイラが表示するエラーメッセージはかなり親切です(もちろん英文ですが...)。そのため、Rustに特有な言語仕様に起因するエラーであっても原因が把握しやすいため、エラーを素早く解決できることが多いです。
また、型推論パターンマッチ型クラスに近い機能の トレイトといった、モダンなプログラミング言語が持っている機能は、Rustでも使用することができます。このような機能を使いこなすことで、コーディングの生産性を高めることも可能です。

Rustの使用例

最後に、実際のプロダクトやシステムにRustを採用した例をご紹介します。

Mozilla Firefox

先述のとおり、MozillaはRustの開発支援を行っており、実際にMozillaのプロダクトであるFirefoxにも使用されています。
具体的には、CSSエンジンの Styloや2DレンダリングエンジンのQuantum RenderといったコンポーネントがRustで書かれており、Firefoxの画面描画高速化に寄与しています。また、CSSエンジンをC++からRustに書き換えることで、C++で書かれた従来のプログラムで発覚した脆弱性の73.9%(51/69件)は未然に防ぐことができたという試算もあります。
以上のことから、Rustを使用してプログラムを開発することで、Firefox自体の性能が向上するだけでなく、安全性の高いプログラムとなるメリットも享受できたようです。

ドワンゴ Frugalos

FrugalosはRustで開発された分散オブジェクトストレージです。ドワンゴ社が提供する動画配信サービスで実際に使用されており、分散ストレージへの読み書きを要求されたレイテンシ・スループットで実現することを目的として開発されました。
この用途にRustが採用された理由としては、ガベージコレクションがなく実行効率に優れる点が主に挙げられています。詳細については、以下の記事を参照してください。

Rust製の分散オブジェクトストレージをOSSとして公開しました - dwango on GitHub

・その他

以上でご紹介した他にも、DropboxnpmといったサービスでもRustが使用されています。

開発環境構築

それでは、以下の手順でRustを開発するための環境を構築していきましょう。
再掲となりますが、以下の動作環境に開発環境を構築します。

  • OS: Windows 7 64bit
    • Windows 10でも、手順の大筋は変わりません。
  • ネットワーク環境: 社内環境のため、FWにより一部通信が制限されている
    • 手順の中で、プロキシサーバを経由するための設定を実施します。
    • ご自宅のPCなど、環境制約がない場合は一部の手順が不要となります。

また、インストールする各ソフトウェアのバージョンは以下のとおりです。

  • Rust: 1.21.1
  • C++ ビルドツール: Visual Studio 2019版
  • Visual Studio Code: 1.42.1
  • Python: 3.8.2

Rust(rustup)のインストール

まず、お使いのPCにRust(正確にはrustup)をインストールします。以下のURLにアクセスし、「DOWNLOAD RUSTUP-INIT.EXE(○○-BIT)」と書かれたボタンをクリックしてインストーラをダウンロードしてください。
インストーラは、OSのビット数により異なります。ダウンロードボタンの「**-BIT」を確認して、ダウンロードしてください。

Install Rust - Rust Programming Language

ダウンロードした「rustup-init.exe」を実行...したいところですが、インストーラの実行のためには別途Visual StudioのC++ビルドツールが必要です。よって、rustupをインストールする前に、あらかじめC++ビルドツールをインストールします(すでにインストール済みの場合は不要です)。
以下のURLにアクセスして「Visual Studio 2019 のツール」をクリックし、「Build Tools for Visual Studio 2019」と書かれた項目の右側にある「ダウンロード」ボタンをクリックしてインストーラをダウンロードします。

Visual Studio 2019 for Windows および Mac のダウンロード

ダウンロードしたインストーラを起動し、ビルドツールをインストールします。インストーラの起動後、画面左上の「C++ Build Tools」をクリックしてチェックを入れ、画面右下の「インストール」ボタンをクリックすると、インストールが始まります。

インストールが完了したら、「再起動」ボタンをクリックしてPCを再起動します。

今回は社内環境にあるPCにRustをインストールするため、プロキシサーバのIPアドレスを環境変数に設定します。一時的な環境変数として設定する方法もありますが、今回は永続的な環境変数として設定します(自宅PCなど制約がない場合は設定不要です)。
コントロールパネル→システム→システムの詳細設定でダイアログボックスを開き、「環境変数」ボタンをクリックします。「ユーザー環境変数」欄の直下にある「新規」ボタンをクリックし、以下の変数名と変数値のペアを追加します。

  • 変数名: http_proxy、変数値: (プロキシサーバのIPアドレス、またはFQDN):ポート番号
  • 変数名: https_proxy、 変数値: (プロキシサーバのIPアドレス、またはFQDN):ポート番号

追加後、ダイアログボックスの「OK」ボタンをクリックし、環境変数の追加を確定します。

以上で、rustupをインストールする準備が整いました。先ほどダウンロードした「rustup-init.exe」を実行します。実行するとコマンドプロンプトが立ち上がり、インストールの選択肢が表示されます。今回は特に設定を変更しないので、画面上で1と入力してEnterキーを押し、インストールを続行します。

インストールが完了すると、画面上に成功した旨が表示されます。Enterキーを押してコマンドプロンプトを閉じます。

Rustがインストールされたことを確認しましょう。コマンドプロンプトを起動し、以下のコマンドを実行します。正しくインストールされていれば、先ほどインストールしたRustのバージョン情報が表示されます。

rustc --version

以上でRustのインストールが完了し、Rustのプログラムを実行する環境が整いました。
このままプログラムを作成し始めてもよいのですが、単なるテキストエディタとコマンドラインのみを使用したコーディングは、何かと不便なものです。よって、開発を効率良く進めるために、以下の手順でVisual Studio Codeの準備を行います。

Visual Studio Code(VSCode)と拡張機能のインストール

今回は、エディタとしてVSCodeを使用します。VSCodeを採用した理由は、Rustの開発において有用な拡張機能(Extension)があるためです。
VSCodeに拡張機能を導入すると、単なるテキストエディタではなく統合開発環境(IDE)のような使用感になります!

まず、VSCodeをインストールします。以下のURLからインストーラをダウンロードし(Download for Windowsと書かれたボタン)、インストールを実施してください。

Visual Studio Code - Code Editing. Redefined

VSCodeのインストール方法はRustそのものとは関係がないため、説明を割愛します。基本的に特別な設定は必要ないため、デフォルト設定でインストールしてください。

VSCodeのインストールが完了したら、以下の拡張機能をインストールしてください。

上記の拡張機能について、以下で簡単に説明します。

・Rust (rls)について

RLS(rls)はRust Language Serverの頭文字です。RLSは、Microsoftが提唱する Language Server Protocolに基づいて動作するLanguage Serverで、RustのIDEに必要な機能を提供します。
RLSの機能には、例えば以下のようなものがあります。

  • コード補完
  • コードジャンプ(定義への移動)
  • 型やドキュメント(コメント)のホバー表示
  • コードフォーマット
  • コンパイルエラーに対するヒントの表示

以上はRLSが提供する機能の一部ですが、これだけを見ても、IDEが備えるべき機能は一通り揃っていることが理解できると思います。

なお、拡張機能のRust (rls)は、RLSの機能をVSCode上で使用するために導入します。RLS自体のインストールは、後ほど実施します。

・CodeLLDBについて

VSCodeには標準でデバッグ機能が備わっています。そのため、拡張機能を導入しなくても、例えばJavaScriptのコードに対してステップ実行などを用いたデバッグをすることができます。
ただし、初期状態でサポートされるのは、JavaScriptやTypeScriptのデバッグのみです。よって、これらの言語以外で書かれたプログラムをデバッグするためには、別途拡張機能を導入する必要があります。

CodeLLDBは、LLDBというデバッガを使用したデバッグ機能を追加する拡張機能です。CodeLLDBはRustのデバッグに対応しているため、この拡張機能を導入することでVSCode上でRustのデバッグが可能となります。

Python3系のインストール

なぜRustのプログラミングでPythonが必要なのか? と疑問に思われるかもしれません。実際のところ、PythonはRustのプログラミングに必要ありませんが、前述のLLDB(デバッガ)の実行に必要なため、ここでインストールしておきます(すでにインストール済みの場合は不要です)。

以下のURLにアクセスし、「Latest Python 3 Release - Python 3.x.x」と書かれたリンクをクリックし、ページ下部の「Windows x86-64 executable installer」リンクをクリックしてインストーラをダウンロードします。ここでご注意いただきたい点は、バージョン2系ではなく 必ずバージョン3系をインストールする ということです。

Download Python | Python.org

インストーラを実行し、画面下部の「Add Python 3.x to PATH」を選択した上で「Install Now」をクリックして、Pythonをインストールします。

まとめ

この記事では、Rustの概要と開発環境構築について解説しました。
次回は、簡単なプログラムの作成と実行の仕方を紹介します。

参考文献

  • 「The Rust Programming Language: 2nd Edition」, https://doc.rust-jp.rs/book-ja-pdf/book.pdf 2020年2月26日アクセス
  • κeen,河野 達也,小松礼人(2019)『実践Rust入門[言語仕様から開発手法まで]』 技術評論社
その1 |  その2