Rustは今もっとも愛されている言語
開発者の技術共有サイト Stack Overflowの調査によると Rustを書く人の実に86.1%が「この言語を愛している」 と答え、2位のTypeScript (67.1%)を大きく引き離しダントツの一位だ。 いかに異常なことかがわかると思う。
おれは2014年、 まだ当時Rustのバージョン1.0が出たばかりの頃に Rustは素晴らしい言語だと確信し、 LinuxコミュニティはRustを受け入れた のような今となっては恥ずかしいポエムを勢いだけで書いてしまったわけだが、 それから5年経ち、Rustがこのように世界的に愛された今、 もう一度Rustに対する自分なりの評価をしておくべきではないかと思ったので、このポエムを書く。
次世代システムプログラミング言語は何になるか?
当時、おれはScalaを書いていた。 Scalaとの出会いは、かなり古くて、大学院にいた頃からScalaには注目していたし、 日立で携わったプロジェクトもScalaで実装していた。 (なんかMario Fusucoにメールを送って人生相談に乗ってもらっていたこともある) それからずっとScalaで働き続けていたわけだが、 2014年の当時、開発コミュニティでもっぱら盛んに議論されていたことは 次世代システムプログラミング言語は何になるか?であった。 ざっくりいうと、ポストC/C++は何なのかという話である。
その当時、おれの中には2つの候補があった。 1つはRustであり、もう1つはNimだった。 言語を学ぶためには何か作ってみるのが良いというのがおれの信条なので、 Rustは当時走りはじめたばかりのcoreutilsのポーティングプロジェクトに少し貢献し、 Nimはnim-fuseや nim-msgpack を作った。nim-msgpackは草津温泉に行くバスの中でHaskellを使った自動テストを書いていたのだが、 隣の人が怪訝な目で見ていたというのと、とにかく太ももがめちゃくちゃ熱かったという記憶が残っている。 また草津温泉に開発旅行をしたいなとは思っている。
当時、おれは自分のプロジェクトを作って、とにかく実装をするのが好きだった。 今となってはNimのプロジェクトについてはあまり興味がなく、 nim-fuseを現在のコンパイラ向けに修正しろとIssueで突かれているのだが、 お金をもらわない限りはやらないと思う。Nimに対する興味はもうない。 Nim引退 も当時書いていたポエムになるが、もうNimは見限ったという話をした。
残ったRustについては、実際には書く機会はあまりなかったが、 読み物としてオライリーの本を読んだり少しずつ勉強を続けた。 (オライリー本は英語版のpre-printを読んでいた) 前の仕事をやめてからは 次の仕事はRustジョブ以外はあり得ないと考えて、 それまでより本気でRustの勉強をはじめて、今では単なる競プロの解法ブログになってしまったが、 仕様について検証して記事を書いていたりした。
自分の中には当時からRustが次世代のシステムプログラミング言語として 世界的に流行するという確信があったのだ。
今では世界中の企業が注目する言語になった
当時おれは、LinuxコミュニティでRustが使われるだろうと思っていたが、 それはあまり進まなかった。これは、Linuxコミュニティにいる人が比較的お年寄りが多いとか、 保守的だからという理由だと思う。サブシステムのLVMもRustでのリライトはされていない。
しかし一方で、あのマイクロソフトも今はRustを使っているし、 Rustのようなメモリ安全の仕組みをもった独自の言語も研究開発しているという話だ。 それ以前にはAmazonも内部プロジェクトで使ってるという話があったし、 DropboxもPythonで書かれていた内部実装をRustで書き換えた。 自分的には、あのマイクロソフトがRustを使ってるというのはかなり衝撃的で、 それだけシステムプログラミングにおいてRustが有力だということを表わしていると思う。 システムプログラミングといえばマイクロソフトというのは、この本を読めばわかる。
日本でも、少しずつRustを使っている企業は増えてきており、 おれの記憶ではかなり以前からサイバーエージェントなんかは使っているし、 PFNでもRustを書いているという記事があった。 世界的なIT企業もRustを使いだしたという記事が増え始めたからか、 最近はRustの求人も目に見えて増えてきてると思う。 実際、プロジェクトの一部をRustで書いてみることになったというレベルの話であればよく聞く。
Rustの一体何が良いのか?
では一体Rustの何が良いのか?
実際にRustを使っていて良いと思うのは、
- モダンな機能な満載。コードを抽象的に、コンパクトに書ける
- エコシステムの充実。特に、サーバサイドを実装するためのライブラリは充実しているし、開発用のツールも充実している。後発言語なこともあるし、基本的に使用している開発者が有能なことが多いため、ライブラリの質も高いことが多い
- Futureの設計がいい
- マクロがいい(競技プログラミングの入力読み込みで大活躍している。たなこふマクロ)
- あらゆることを静的にチェックしようとするため、コンパイルが通るとメモリ安全含め、かなりのことが保証される。バグを疑う箇所が狭められることは開発ではとても大切なこと
- 可読性が高い(学習が困難な言語なので意外かもしれないが)
- トップレベルの関数は型の省略が出来ないため、それ自体がドキュメントになる
- deriveなどのおかげできちんと型を書いていくスタイルにあまりストレスがない
- オブジェクトが不変なのか、可変なのかがひと目でわかる。同様に共有されるのかどうかもひと目でわかる
- 型を見れば、どういう処理を意図しているのかわかってしまう場合もある
- そのオブジェクトが自分しか書き換えられないことが保証されていることが、書きやすさのみならず読みやすさにも繋がる
- メモリ使用量が予測しやすい
- 言語の難しさから少数精鋭開発向けと思われがちだが、大規模プロジェクト向けなのではないかと思っている
- GCがない。GCがある言語をシステムプログラミング言語とは呼ばないのかもしれないが、バックエンドのシステムを作る時にGCがあることはかなりデメリットだ。GCのことを考慮しつつ実装しなければいけないという本末転倒な事態になることがある
- パフォーマンスがC++に匹敵するほど良い。(ここではゼロコスト抽象化も含む)実装言語を選択する時、将来的にパフォーマンス要因でのリライトが必要にならないかは重要な要素だと思う
- 学習が困難なので、開発者のレベルがある程度補償される。Haskellプログラマを募集してPHPを書かせるということが流行ったこともあったが、そんなことが二度と起きないことを祈っている
- 今となってはウェブアプリも実装出来る
自分としては、 もともとScalaに対して良いと思っていた仕様の上に、 Scalaに対して不満に思っていた点(性能やGC)が改善されてしまい、 さらにメモリ安全のような機能までついてきたという神のような言語で、 実は今ではRustのユーザの方がScalaのユーザより多くなっているという統計は、 おれのような考えでRustに移った人が多いことを表わしているのではないかと思っている。
競技プログラミングではC++の方がいいかなぁ
一方で、Rustの悪い点というのは、これは競技プログラミングに限った話になるが、
- インデックスに負値を許さない
- C++のようなテンプレートプログラミングが出来ない
- クロージャが再帰出来ない
- multisetがない
など、C++に比べるとかなり不利なので、 ただ競技プログラミングをやるというのであれば、 C++を使うか、書きやすさの点でPythonを使うのが一番良いと思う。
ただ
- 入力をスマートに読み取るマクロはめちゃくちゃ強力
- loopのための範囲を開区間・閉区間ともにスマートにかける。C++はマクロだらけになりがち
- 性能はC++とほぼ同等
ということはあるのと、 プロフェッショナルな開発ではRustが広まってきていることもあるため、 そういう意味でも、多少不利でもRustでやるというのは十分にありだとは思う。
これからどうなるか?
これから2年くらいで、特にサーバサイドでは、開発言語として考える初手はRustという世界になると思う。 そのくらい圧倒的に愛されていて、圧倒的に広まり続けそうなのがRustという言語だ。 この愛され度というのはウイルスの拡散でいうところの再生産指数のようなものだろう。
とはいえRustの学習がそれほど容易ではないことは永久に変わらない。
オススメは、競技プログラミングをやって基本的な仕様について慣れ親しむというのと (競技プログラミングでも借用規則などで最初は苦労すると思う)、 その他のトピックについては、この本を読むことだ。
おれはオライリーの本も読んだ(しかも英語も日本語両方読んだ)のだが、 こちらの本の方が読んでいて「なぜRustが良いのか?」といったことにも触れているし、新しいので優れているといえる。
May the safey be with you.