Rustを少し触ってみた
以前から気になっていたものの、なかなか触る機会のなかったRustに先日ようやく入門しました。 触り始めてからまだ数日ですが、Rustに直に触れてみての第一印象などを綴ってみます。
ちなみに私は普段触っているのはTypeScriptで、CやC++はもちろんコンパイラ言語自体あまり触ったことがありません。(Haskellは多少触ったことがあります)。
あんまりガッツリした考察はしていない(できない)ので、そのへんはご了承ください。
Rustに興味を持ったきっかけ
最初にRustを知ったのは、昨年に見た「将来WASMが主流になったら、TypeScriptはRustとかGoとかにとって代られるのでは」という話題を見たのがきっかけだったと思います。
実際に触る前のRustの知識とイメージ
常に熱心に情報を集めてたわけではないので、一部古かったり見当違いなものも含まれていると思います。
- Goと同じくC/C++に代わるものを目指して開発された。
- なんとなくGoよりもRustの方が若干人気な空気を感じる。
- 処理速度はめっちゃ早い。C/C++に匹敵する、らしい。
- コンパイルはめっちゃ遅い、らしい。
所有権
という独自の概念を持つ。- 学習コストがなかなか高いらしい。
- 関数型言語の特徴を多く取り入れているマルチパラダイム言語らしい。
実際に触ってみた上でのRustの印象
公式ドキュメントに従ってインストールして触ってみました。ドキュメントは親切だし、インストールも思いの外簡単でした。
実際に触ってみると、確かにRustは普段使っているTypeScriptよりも遥かに関数型っぽいなと感じました。
class
がない。(代わりにstruct
やimpl
というものを使うようです)- 型推論がある。(まあ、これはTypeScriptにもありますが…)
- 変数は基本的に不変(可変にもできる)。
if
が文ではなく式として扱われる。- パターンマッチが使える。
関数型プログラミングとコンピューター
個人的に興味深いと思ったのは、RustがC/C++と同じシステムプログラミング言語であり、関数型言語の特徴を取り入れつつC/C++と同程度の処理速度を実現している(らしい)という点でした。というのは処理速度においては、関数型言語は命令型言語には及ばないという認識があったためです。(純粋関数型言語のHaskellは、システムプログラミングには向いていないという話を聞いたことがあります。)
例えばJavaScriptなどでも、配列を命令型っぽくfor
で処理する場合と、関数型っぽくmap()
の高階関数で処理する場合とでは、原理上for
の方が圧倒的に処理速度は早いです(これも些か大雑把な例えですが…)。変数に不変性を求める点もさることながら、関数型は命令型よりもコンピューターのメモリを潤沢に使うイメージがあります。
以前Haskellの本で、「命令型言語はコンピューター的な考え、関数型言語は人間的な考え」という感じの説明を読んだ記憶があります。(以前図書館から借りた本の内容なのでうろ覚えなのですが、確かこの本だったかと思います。)
これはコンピューターのハードウェアの実装や機械語が命令型であることが理由だと思われます。問題の解決法を数学的に宣言する宣言型/関数型プログラミングは(数学が得意な)人間にとってはわかりやすいですが、コンピューターにとっては問題をどういう風に処理するのかを具体的に命令してくれる命令型プログラミングの方が理解しやすく、処理の効率も良いということのようです。
まあRustの処理速度に関しては、あくまでRustが関数型言語の特徴を取り入れたマルチパラダイム言語だから実現できていることなのだと思われます。そのRustの高速さを実現しているのが所有権
という概念のようですが、現時点では私はまだこの所有権
をちゃんと理解していません…このあたりは、それこそCやC++でシステムプログラミングを経験していないと、なかなかとっつきにくい分野なのかもしれませんね。
I'm a Rustacean now
ほんの数日触ってみているだけですが、現時点では「難しいけど、使いこなすことができたら楽しそう」という実感を得ています。今後しばらくはRustと触れ合っていきたいと思います。(ひょっとしたら数ヶ月後には、「やっぱり純粋関数型言語こそ至高」と言っているかも知れませんが…)