RustとC++を比較することの難しさ ― Rustの個人的な第一印象

実践Rust入門』読み終わって、実際にgfx-halとかrendyとかいくつかレンダラー関係のプロジェクトを眺めてみて、いろんなことを考えた。

ちなみにこの書籍自体はちょっと構成が特殊で読みづらいのと、難易度がちょっと高い。でも中盤は図も豊富で読みやすいと思ったし、メモリ周りについての解説が特に豊富な印象だった。序盤をまるっと飛ばし読みして、Qiitaとかを併用して読めばちょうどいい入門書かなーと。

Rust言語について端的に言えば、低レイヤーなことを安全に高効率かつ高い記述力でやるとしたら、って考えた場合のC言語以外の新しいパラダイムだから、そもそもC++と比較すること自体がかなり難しいと思った。

Rustには可変長引数もなければオーバーロードもないし、継承も厳密には存在しないけど、それはRustでは特に問題にならない。何でもトレイトの記述力と関数型言語の強みで解決できちゃう。最初はLisp並に記述力のあるマクロが多用されるのかと思ったけど、思ったほどは乱用されず、どのプロジェクトも可読性が高くてコードは綺麗だった。

一時期のScalaのライブラリとかはすごく難解で読みにくくて、そういうことが起こりやすそうと思ってたけど、マクロさえ使いすぎなければ問題にならなそう。関数型言語由来の難しさについても、OCamlみたいにうまいこと回避しているなと思った。Haskellみたいに遅延評価とかモナドとか理解する必要ないし、記法もそれほど関数型言語っぽくないし、強いて言えば所有権システムとトレイト境界が一瞬理解しづらいけど、個人的にはC++テンプレートメタプログラミングを理解 (&デバッグ) するのに比べれば簡単な気がした。

ということはRustの魅力はやっぱりゼロコスト抽象化と所有権システム ( vs C++のスマートポインタ) といったところで、Microsoftとかはそこ辺を高く評価して導入に踏み切ったんだと思う。あとはこのパラダイムの大きな違いにどの程度慣れるかだと思う。

あとは、IDEがもう少し強化されて関数型言語由来の部分が文化的にもう少し多くの人に理解されてくれば、もっとぐんと普及・導入されるのかなと思う。個人的にはScalaに対するKotlinみたいに、もっと関数型言語の部分をシンプルにした別言語が出てくる可能性もある気もするけど、Rust自体の難易度を評価するのは、マルチパラダイム過ぎて使う機能と用途に依るので、一概には難しいなと思った。

自分個人としては、C++を書いていると時々Option型とかパターンマッチを使いたくなるので、関数型言語の高い記述力が利用できるのがすごく魅力だと思った(C++でも出来なくもないんだけど、std::option型はC++17以前はexperimentalだし、関数型風な書き方は決まって読みづらくなる)。それとひょっとするとC++以外のユーザーにとっては、低レイヤーまわりと関数型の概念に入門しやすい言語なのかもと思った。結局Rustが理解しづらいのはC++/Javaに慣れてる場合だけだし、最初の言語がRustって人がいたら、いろんなパラダイムに触れることができて結構幸せなのかもと思った。

ちなみにRustのグラフィック周りのライブラリを見た感じでは、低レイヤーについてはすごく完成度が高いけど、まだまだユーザが少ないのかハイレベルなデモが少ない印象。言語自体の難易度の高さもあって、企業とかアーティストが参入しづらいんだろうけど、もっとユーザーが増えたらなと思った。この辺もIDEと周辺ツールの完成度は影響しそう。

…とまあそんな感じで、全く違うパラダイムの言語を比較するってすごく難しいなぁと思った一日だった。でも、たまにはこうして新しい考え方を吸収するのも楽しい。