IT

GoとRustを比較!始めるならどっち?

この記事では、プログラミング経験が少しある人向けに私がPython, JavaScriptを諦めてRustに手を出した理由を紹介します。GoかRustを始めようとして悩んでいる方に参考になると思います。

なぜPythonではだめだったのか

私はPythonとJavaScriptとSwiftが比較的得意です。Pythonなら何でも出来る、と思ってPythonを勉強したのですが、Webサービスのクライアントサイドを作ることは難しかったです。それはJavaScriptとHTML, CSSが幅を利かせている世界だからです。じゃあJavaScriptが万能か、というとそんなこともありませんでした。PythonとJavaScriptが苦手とすることは速度です。

コンパイラ型言語とインタープリタ型言語

コンパイラ型言語とは、人間が書いたプログラムコンピュータ理解できる形式変換するプログラム言語のことである。

インタープリタ型言語とは、人間プログラミング言語記述したソースコードを、コンピューター実行できる機械語形式オブジェクトコード)へと逐次翻訳しながら、そのプログラム実行してゆくプログラムのことである。

出典:weblio辞書

難しいですが、違いは直接実行できるか、実行前にコンパイルが必要かということです。コンパイルとは、人間が書いたプログラムを機械が読める言葉に変換することです。コンパイルによって作成されたファイルは、(普通の)人間には読めなくなりますがコンピュータは超高速に実行することができます。

コンパイラ型言語のメリット:

  • 実行時に高速
  • コンパイル時にエラーチェックが行われる

コンパイラ型言語のデメリット:

  • ものによってはコンパイルに時間がかかる
  • 書くのが難しい言語が多い

PythonやJavaScriptはインタープリタ型言語

PythonやJavaScriptはスクリプト言語でありインタープリタ型言語に分類されます。したがって比較的簡単にコードを書くことができますが、実行時に速度がでません。

プログラミングを始めたての頃はそこまで大規模なプログラムを書かないため実行速度は気になりませんが、重い計算処理が必要なプログラムやサーバーなどで高いスループットが求められる場合、プログラムの実行速度が大きな意味を持ち始めます。私は数値計算を超高速に行う必要があり、かつプログラムを配布する予定があったのでWindows、MacOS、Linuxの全てで動かせる必要がありました。これに向いてそうなのがGoとRustだと思い、この2つのコンパイラ型言語を比較していきました。

これから来るコンパイラ型言語はGo?Rust?

まず最初にGitHubの分析記事から、GoとRustのユーザーはいずれも伸びていますが、GoがRustに大差をつけていることを知りました。

f:id:rustacean:20180821010651p:plain
https://www.benfrederickson.com/ranking-programming-languages-by-github-users/

MAU (Monthly Active Users) がGoは4.10%、Rustは0.73%と5倍以上の差がついています。GoはRubyの3.27%を上回り、もうすでに成熟した言語になりつつあります。Rustはまだまだユーザーが少ないです。

ここからはGoとRustの比較記事を3つ見ていきます。

比較記事1(Go vs Rust? Choose Go.)

matthias-endler.de

ざっくりまとめると下記のような内容です。

  • Goは最初から高い生産性を持ち、Goの経験が少なくてもそれなりのプログラムを書くことができます。
  • 一方で、Rustは学習コストが非常に高く、数ヶ月かけて勉強しないと生産的なものは作れません。
  • だから99%の人はGoかRustで迷ったらGoを選ぶべきです。しかし、Rustを選ぶべき人が1%いて、GoとRustは競合しているわけではないです。

比較記事2(Should I Rust, or Should I Go)

codeburst.io

こちらの記事も非常に参考になります。

  • GoもRustも、もしあなたがトラフィックが非常に多いウェブサービスを運用し、垂直にも水平にもスケールさせたい場合にぴったりな言語である
  • Goは、速くてパワフル、そしてシンプルな言語であり、たくさんのサービスを持っていたり多くのチームメンバーがいる場合はGoを使うべきである
  • Rustは、最後のほんの小さな部分までこだわって高速化を追求するときに選ぶべき言語である。RustはGoよりもC++と競合している。

比較記事3(Rust vs Go – Which programs are faster?)

benchmarksgame-team.pages.debian.net

f:id:rustacean:20180821014143p:plain

ここはさすがRustというべきでしょうか、圧倒的に早いですね。

Go vs Rustの結論

ここからは、上記の記事や自分の経験を踏まえた分析を書いていきます。

Goの特徴

Goはユーザー数が多く、ライブラリが豊富です。そして、学習コストが低く、高速にコーディングできます。Goの経験が浅い人でも生産的なコードを書くことができ、チームでの開発にも向いています。

Goはウェブサーバーに向いている言語で、トラフィックが非常に多いサイトで使う価値があると思います。Goは、Node.js、ruby on rails、Pythonの一部と競合すると思います。Goはこれらより高速に動作し、よい代替案になるでしょう。

他にも、DockerはGoで開発されており、Goのユースケースは広いです。また、バックにGoogleがいることも心強いです。

Goを選ぶべき人

PythonやJavaScriptを使っていて速度に悩んでいる人におすすめだと思います。Goはコンパイラ型言語で、実行時にはPythonやJavaScriptより高速に動作する場面が多いと思います。

Rustの特徴

Rustはシステムプログラミング言語です。RustはCやC++の置き換えになることを目指しており、非常に低次元のレイヤーまでアクセスできます。これは細かい調整ができることを意味しますが、細かいことまで気にかけないとプログラムが作れないことを意味します。一例として、Rustを書くときは所有権という概念を通じてプログラマがメモリの存続時間を管理する必要があります。適切な調整を行えば無駄のない非常に高速なプログラムを作れますが、これがRustへの入門を困難にしています。

Rustを選ぶべき人

最後の1ミリまでチューニングして高速化したい人にはRustがおすすめです。C++とRustを比較するのが適切で、PythonやJavaScriptと比較してるならGoを選ぶべきだと思います。

おまけ

GoとRustについての有識者のトークセッション(日本語編)

【CTO meetup】Rust, Go, Elixir, Kotlin 次世代言語の魅力をCTOが語る〜イベントレポート〜 | flexy(フレキシー) -エンジニア・デザイナーに自由を-

Goはベンチャーにとっても現実的に非常に良い選択肢なんでしょうね。Rustはロマンに溢れる言語なのですが、実際のサービスに導入するのはハードル高めですね。

Rustのすすめ

この記事を書き始めたとき、タイトルは「Rustのすすめ」でした。しかし書き終えてみるとGoをすすめていました。冷静になると、Goをやるべき理由が多いんです。でも私はロマンを追い求めるRustacean (Rustを書く人)です。すでに成熟している言語よりももっとマイナーな言語をやりたかったのと、なんとなくかっこよかったのがRustを始めた理由です。書いていて楽しいとか、そういうロマンって大切だと思います。そんな軽い気持ちでRustでコマンドラインツールやウェブサーバーを実装したのですが、実際にRustで書いてみると苦労も多かったです。いずれその話もしたいと思います。