この記事はRE:CODEアドベントカレンダーの5日目の記事です。
PHP軽量FrameworkのSlim3 <- 前 : 次 -> まだMacで消耗してるの?
この記事は、業務でRustを書くことになったエンジニアがRustのいいところをざっくりと紹介するという記事です。
対象はある程度プログラミング経験がある人を想定しています。
Rustについては知らなくても大丈夫です。知らない単語が出てきたら、「わあ、なんか出てきたー」とか思って飛ばしちゃってください。
一応、Rustの専門的な用語については イタリック体 にしてあります。
Rustは難しい
Rustの勉強をはじめると、その言語仕様の複雑さに圧倒されると思います。
ライフタイム とか、オーナーシップ とか、 静的ディスパッチ とか 動的ディスパッチ とか、良くわからない概念がまず多い。
さらに、クロージャ、ジェネリクス、トレイト など、他の言語で身につけたはずの知識も、Rustの世界では微妙に扱いが異なる。
ドキュメントを読み込むのは諦めて、とりあえず書いてみようと思ってコードを書き始めても、コンパイラに怒られまくる。
てかそもそもゼロコスト抽象化ってなんやねん。
全員がRustの学習を難しいと感じているかは分かりませんが、Rustの開発コミュニティの2017年のロードマップには「Rust should have a lower learning curve」というトピックが上がっているので、やはりRustに入門するのは大変なのでしょう(大変でした)。 1
ではなぜわざわざそんな複雑な言語を書かなければならないのでしょうか。答えは一つです。
「CTOが決めたから」
これが全てです。これ以上に適切な答えが答えがあるはずもありません。
でもせっかくなのでもう少し深掘りして、なぜCTOがRustの導入を決定したかを探りたいと思います。
弊社のCTOはオーストラリアからやってきたFuntoo(そういうディストリがあるんです)使いで、めちゃくちゃやり手のエンジニアです。
そんな彼が導入を決定したからには、そこには深い深い理由があるはずなのです。
Rustを使うメリット
Rustを使い始めた時はとても感じにくかったのですが、やはり(他の言語と同様)Rustの良さというものはあります。
まあそもそも、それがなかったら言語として発展していないし、話題にもならないだろうし、あなたもこの記事を読んでいないでしょうし、弊社CTOも導入を決定していないでしょう。
ではそのRustの良さとは何か。それは簡単に言うと、
「パフォーマンスを犠牲にすることなく、抽象的なコードが書ける」
ことだと思います。
パフォーマンスが出せる言語というと
- C
- C++
- Go
などが思い浮かべられます。
また、抽象的なコードが書ける言語というと、
- Scala
- Haskel
- Lisp
などが思い浮かぶかと思います。(注:個人の嗜好が大いに入っています)
抽象的なコードを書くメリットの1つは、コンパイル時にわかることが多いということです。つまり型情報を参照してロジックエラーを実行前に検出することができます。素晴らしい。
自分は上記の言語の中ではCとScalaを少しかじっていましたが、「パフォーマンス」と「抽象性」の両立はとてもハードだと感じました。2
例えば、Scalaは関数型言語としてもデザインされているため、関数は純粋関数(副作用のない関数)であることが望まれています。それは多くのメリットをもたらしますが、パフォーマンスは明らかに犠牲にされています。
もちろん、Scalaでもパフォーマンスの高いコードを書くことはできますが、それには"Scalaらしい"コードを諦める必要がある場合が多数です。
また、ライブラリレベルでそれの両立を目指す努力がなされたりしていますが、言語の目指す場所がそこでない以上その完成度は不十分なものにしかなり得ません。
あくまでもScalaは「関数型言語」と「オブジェクト志向」の融合を目指している言語なのです。
そして、それに対して、言語レベルで「パフォーマンス」と「抽象性」の両立を目指しているのがRustという言語 です。
Rustは難しい?
さて、どうやってRustが**「パフォーマンス」と「抽象性」**の両立を実現しているか、それを語るとトピックスが多くなりすぎるので(そしてめんどくさいので)、それの解説は他の記事に譲りたいと思います。(リクエストが多ければ解説記事もいつか書きたいと思います)
ここではその実現方法の具体的内容に踏み込むのではなく、もう少しRustという言語の概要について深掘りしたいと思います。
さて、ここまで読んだくださった読者の皆様はきっとこう思っているはずです。
「なるほど、Rustというのは様々なメリットを持った言語のようだ。学習は大変そうだが、そこは我慢して勉強してみる価値はあるのかもしれない。」
ありがとうございます。そうなんです。Rustはいい言語なんです。
でもそこには暗黙的にこのような意見が隠れています。つまり、Rustは
「様々なメリットを持つが、複雑で難しい言語」の一種だというのです。
果たしてこれは正しいのでしょうか。
そこには様々な意見があると思いますが、業務で1年間Rustに触れ続けた自分個人の意見は、
No です。
私は、Rustは
「シンプルなルールセットと、そこから生まれる様々なメリットを持った言語」
だと思っています。3
そしてここでの「様々なメリット」にはもちろん、**「パフォーマンス」と「抽象性」**の両立が含まれます。
さて、ここまでくると次に気になるのはもちろん、そのルールセットが何なのかということですが、このセクションの冒頭で述べた通り、それは次回(がもしあればそこで)詳説することにします。
ざっくりとだけ述べておくと、Rustのルールとは基本的に「いかにメモリをうまく扱うか」のルールです。
もっと言うと、「いかにスタックをうまく使うか」、**「いかにヒープを避けるか」**のルールです。
(さらに言うと、そう私は思っているというだけです)
まとめ
Rustは**「パフォーマンス」と「抽象性」の両立を目指して設計された「シンプルなルールセット」**に基づく素晴らしい言語です。
もしあなたが**「パフォーマンス」と「抽象性」**を求めるエンジニアなら、Rustはきっとあなたにとってすばらしい言語であると思います。
終わりに
さて、最初から「Rustはいい言語だよ」ということを延々と述べた挙句、一切具体的内容に触れることはないという消化不良を起こしそうな記事になりましたが、いかがでしたでしょうか。
理想的にはこれをイントロダクションとして次回以降に具体的内容に触れていきたいと思っていますが、いつでも予定は未定です。
もしリクエストが多ければ続きを書く(気が起こりやすくなる可能性が高まる)ことになると思います。
そして最後に、弊社ではRustエンジニアを積極採用中ですので、この記事を読んでRustを業務で書きたくなったという奇特な方はぜひ連絡をお待ちしております。 (現在では採用は行なっておりません)
特にRustの経験は重視しておりませんので、Rust未経験の方も歓迎しております。
以上、Rust紹介記事にみせかけたリクルーティング記事でした。
最後まで読んでいただき、ありがとうございました。
-
出典: https://blog.rust-lang.org/2017/07/05/Rust-Roadmap-Update.html ↩
-
C++は「パフォーマンス」と「抽象性」を両立しているという意見もあるかと思いますが、その「抽象性」は不完全であるというのがこの記事での意見です。 ↩
-
「様々なメリットを持つが、複雑で難しい言語」と一般に思われている言語(Lispとか)に慣れ親しんでいる方であれば、そういった言語の方が理解してみると実はとてもシンプルだったということが多い、ということはご存知と思います。 ↩