ワイ史上最強の言語! Rustをちゃんと理解してあげる
↑ Rustのロゴ(開発者が自転車を趣味にしていたことからこのアイコンらしい。)
1. Rustとは
ここでRustの全体感を話します。
2. Rustの文法
Rustの文法をリソース管理の部分と関数型の部分のみ説明します。
3. おすすめ開発手法
Rust開発環境や開発手法を説明します。
4. 実際にアプリを作る
TDDで簡単なアプリケーションを作ってみます。
5. おまけ:WebAssembly
WebAssemblyについて簡単に説明。
5. おわりに
まとめます。
ざっくりとした情報を取得するには、Wikipediaはうってつけ。
Rustのキーワードを洗い出しました。
Rust(ラスト)はMozillaが支援するオープンソースのシステムプログラミング言語である。
Rust言語は速度、並行性、安全性を言語仕様として保証するC言語、C++に代わるシステムプログラミングに適したプログラミング言語を目指している。
システムプログラミング言語というのは、物理的なハードウェアへのより直接的なアクセス手段を提供する言語。
基本的にはこれらを作ることが目的として設計されている。
そう言う意味では、アプリケーション向けの言語とは異なる。
(アプリケーション向きでないとは言ってない。)
システムプログラミング言語例
プロジェクトはオープンソースのコミュニティベース開発で進行しており、言語仕様(検討段階含む)、ソースコード、ドキュメントはオープンソースライセンスで公開されている。
Mozillaっぽいよね。
Rustはマルチパラダイムプログラミング言語であり、手続き型プログラミング、オブジェクト指向プログラミング、関数型プログラミングなどの実装手法をサポートしている。
基本的にはC言語に似ている。
手続き型やオブジェクト指向は有名だが、関数型プログラミングやその言語は聞き馴染みないかもしれない。
関数型言語は、関数を引数ないし返値として渡せる第一級関数として扱える。
詳しくは別の勉強会でやりたいが、関数型プログラミングの特長としては、こんな感じ。
コンパイル基盤にMIRとLLVMを用いており、実行時速度性能はC言語と同等程度である。
まぁ、とにかく速い。
TODO**
強力な型システムとリソース管理の仕組みにより、メモリ安全性が保証されている。
強力な型システムというのは、「静的型付けかつ強い型付け」のこと。
リソース管理の仕組みというのは、「ボローチェッカー」のこと。
静的型付け?
プログラムを実行しながら型検査を行う => 動的型付け
プログラムを実行前に型検査を行う => 静的型付け
強い片付け?
実行時に型変換を許さない。
ボローチェッカー
Rustには、「所有権」という概念があり、一つのリソースは一つの所有者(変数)にのみ関連づけられる。
ボローチェッカーは所有権の競合および不正利用を検証する。
Rustは2016〜2019年の間Stack Overflow Developer Surveyで「最も愛されているプログラミング言語」で一位を獲得し続けている。
4年連続1位!!
効率的で信頼できるソフトウェアを誰もがつくれる言語
Rustは非常に高速でメモリ効率が高くランタイムやガベージコレクタがないため、パフォーマンス重視のサービスを実装できますし、組込み機器上で実行したり他の言語との調和も簡単にできます。
Todo:
FFIやWeb Assemblyについて
Todo:
Rustの豊かな型システムと所有権モデルによりメモリ安全性とスレッド安全性が保証されます。さらに様々な種類のバグをコンパイル時に排除することが可能です。
所有権についてはあとで説明。
Rustには優れたドキュメント、有用なエラーメッセージを備えた使いやすいコンパイラ、および統合されたパッケージマネージャとビルドツール、多数のエディタに対応するスマートな自動補完と型検査機能、自動フォーマッタといった一流のツール群が数多く揃っています。
Rustの強力なエコシステムならCLIツールを素早く作れます。Rustはアプリのメンテナンスを信頼できるものにし、その配布も簡単です。
Rustを使ってJavaScriptをモジュール単位で高速化しましょう。npmに公開しwebpackでバンドルすればすぐに使えます。
Todo:
予測可能なパフォーマンス。極小のリソースフットプリント。堅固な信頼性。Rustはネットワークサービスにぴったりです。
簡単に言うと、サーバーにもどうぞってこと。
低リソースのデバイスがターゲットですか? 高レベルの利便性を損なわずに低レベルの制御をしたいですか? Rustにお任せください。
それぞれ確認してください。Firefox、DropBox、Cloudflareの事例があります。
ドキュメントはめちゃくちゃ充実している。
YouTubeも面白い。RFCの議論なんかしている。
今年中には、1プルリクを!
そうそうたる企業
(余談だけど、このページリロードするたびに企業の順番が変わる)
TODO: wikiと公式だけからじゃなくて、記事も載せたい
参考リンク
リンク | 内容 |
---|---|
The Book | 文法が一通り書かれている。最初から全部読もうとすると大変かも。 |
Rust By Example | コードで説明するタイプ。説明は少なめ。練習問題もあり。 |
標準ライブラリ | Rust標準ライブラリガイド。最初から読む物じゃなくて、参照用。 |
CARGOブック | RustのパッケージマネージャーCargoの説明。参照用。 |
RUSTDOCブック | ドキュメントの作成方法や書き方の説明。参照用。 |
RUSTCブック | RustのコンパイラRustcの説明。参照用。 |
TODO: 日本語ドキュメントを書く
他にも色々あるので、Rustを学ぶを確認してください。
この章では、The BookとRust By Exampleを参考にしながら、説明します。
まずは、はろわ。簡単。
Rustのエントリーポイントはmain()
関数。
println!()
というマクロで標準出力できる。
Rustの変数は標準で不変(immutable)!
もちろん可変(mutable)な変数も扱える。
その場合は、mut
というキーワードを利用する。
TODO:
シャドーイングが可能。地味に便利。
これは、変数を新たに定義しているので、再代入とは異なる。
新たな変数名を定義するまでもない時に便利。
スカラー型
整数型
大きさ | 符号付き | 符号なし |
---|---|---|
8-bit | i8 | u8 |
16-bit | i16 | u16 |
32-bit | i32 | u32 |
64-bit | i64 | u64 |
128-bit | i128 | u128 |
arch | isize | usize |
arch
というのは、アーキテクチャ依存という意味。
4バイト(32-bit) or 8バイト(64-bit)
浮動小数点数
大きさ | 符号付き |
---|---|
32-bit | f32 |
64-bit | f64 |
論理値
true
or false
簡単。
実は1バイトのメモリを食ってる。(理論上は1bitで済むはず。)
文字列
複合型
タプル型
タプルは**複数の型(異なっても良い)**をはり合わせることができる型。
後述struct(構造体)と基本的には変わらない。
値の取り出し方
アクセス方法
配列型
同じ型の値を複数まとめられる型。
Rustには、Vec型という
常に固定長の要素があることを確認したい時に有効。(Vec型との比較)
TODO:
fn
キーワードを利用して関数を宣言。簡単。
引数をとるときは? 簡単。
戻り値があるとは?
引数と戻り値の複合
簡単。
文は、なんらかの動作をして値を返さない命令。
式は結果値に評価される。
ちなみに全ての言語が代入で値を返さないわけじゃ無い。
たとえば、Rubyでは代入で値が返る。(C言語も)
Rustで同じことやりたかったら、こう!
飛ばします。あとでドキュメントコメントについてやるかも(TODO)
if式
書き方は一般的なif文と一緒。
ただ、式なので、値を返します。
同じ型じゃ無いとダメ。
loop
これはただの無限ループ
while
whileもあるよ。
for
forもあるよ。
Pythonのこんな書き方便利ですよね。
Rustだとこう書きます。
スタックとヒープ
実行時にプログラムが使用できるメモリ領域にはスタックとヒープの2種類がある
スタック領域
ヒープ領域
メモリーリークを防ぐ戦略
所有権はRustの最もユニークな機能であり、これのおかげでガベージコレクタなしで安全性担保を行うことができるのです。 故に、Rustにおいて、所有権がどう動作するのかを理解するのは重要です。
所有権のルール
スコープの概念は他の言語と同じ。
まとめると、
俺氏が1週間で考えた最強の開発手法(多分一般的です。)
こういうの、大事。
まずは、rustup
コマンドを取得する。
これでcargo
コマンドも一緒に入る。
最新のRustをインストールしておく。
やっぱりVSCode最強説。軽いし、いろんなプラグインがある。
TODO: VSCodeプラグイン作る勉強会やりたい。
RLSを入れると無敵。
一つだけ、Rustパスを設定するのを忘れずに。
コマンドラインツールでいいかな。
WebAssemblyについて少し。
TODO:Yewで何か作ってみる?
まとめ。
いけてないところ
まずはpanic!
を理解
Result
とOption
を理解する
ファイルの入出力
こんな風にパターンマッチも可能
言語に関するもの
記事
ニュース
その他