GoとRustの言語比較記事を書くのが流行ってるらしい

コンテキスト

仕事でGoとRustを書いています。いずれもWebのサーバーサイドです。パフォーマンスとかほとほどって感じなので極限までチューニングしたりしません。という前提で読んでください。

Rust/Goはいずれも習得してから2年くらい書いています。書いてる量も多分そんなに変わりません。

Go

なんと言っても習得難度が低いので人を選ばず書けるようになります。現状だと仕事で書くなら一番無難な選択肢だなと思っています。一方言語もエコシステムも何もかもかなりクセが強いので、Go Wayにちゃんと従うことが大事だなと思ったりします。

  • ジェネリクスがないことは高速なコンパイルなど利点もありますがmap,filter等を型ごとにfor文書きまくることになるのでとても手が疲れます。スライスに値が入ってるかどうかをチェックする標準関数用意しといてくれ〜〜〜っていつも思う。
  • 基本的に公式がユーザーに不便を強いる感じになっており、あまり便利さを追求しないほうが良いです。あとリポジトリのissueでGoodが100以上ついてるfeature requestを「対応しません」って言って問答無用で閉じたりするの結構趣がありますね。Goに入ってはGoに従えない人には向いてないです。
  • syntaxの一貫性があまりなく、結構Adhocな構文要素が多いです。特にゼロ値周りはヤバく、適当に書くとかなり気づきにくいバグを埋め込むおそれがあるのでチームで書くときはコード規約は必須です。公式がコード規約を出しているので、こういうのにとりあえず従っておくのが無難かもしれない。(なお結構うげーとなるような規約があるので私は全部は従いたくないです。)
  • コンパイルが速くstatic buildが超カンタンなのはサイコーって感じですね(この辺はruntimeの出来がめちゃくちゃ良いのでそのへんのおかげ)。Dockerとの相性も良いのであんまり何も考えなくてもものが動いてサイコーです。
  • GoLandやVSCode pluginの出来が普通に良いのでDXはとても良いです。それはそうとVSCodeはなぜかcompletionの反応速度が異常に悪いので最近はもっぱらGoLandになりました。文明的だなあという気持ちになれて良いです。
  • 標準ライブラリがやたら豪華なので結構何でも提供してくれています。大変便利です。言語人口が多いこともあってライブラリも(少なくとも数は)豊富です。
  • マクロとかそういうのもないので筋力が全てです。コーディングには筋肉をつけましょう。
  • 仕事ではechoとgormを使っています。

Rust

使いこなせるようになればめちゃ便利な言語です。言語機能が強力なのとエコシステムが整っており、個人的な感覚ではライブラリも強力なものが多いので頼もしいです。習得難度が高いことと未だに言語自体が枯れていないため、界隈の趨勢が変わるとそれに振り回されそうな不安もあります。

  • とにかくコンパイルが遅いです。キャッシュしないとCIのビルド時間が(releaseビルドなのもあり)30分とかになります。誰か助けてほしい。
  • LSPが微妙にやる気がないです。なんかあんまり補完してくれないときとかがある。もうちょっとやる気を出してほしい。(VSCode)
  • Goと違ってジェネリクスにADTにマクロもあって文明的です。工夫すればコードの治安を良い感じに保つことが出来ます。
  • 最近はasync runtime周りでの動きが活発です。特にasync/awaitが最近になって安定化されたこともあり、「future0.1にのみ対応した非同期APIのないライブラリ」「future0.3に対応したasync/awaitで書けるライブラリ」が入り乱れています。さらにasync runtimeは現状はtokioが一番強いですが、最近になってasync-stdというのが登場し、これが覇権を握ることになるとtokioに依存するライブラリが一斉に死滅する可能性があります。各種ライブラリはasync-stdが台頭するとtokioと非互換なため動かなくなるという状況に危機感を感じているようですが、現状で非同期に対応しているライブラリはほぼruntimeと密結合しているため、すぐには解決されないと思われます。今年や来年にはasync runtime大戦争が起きる可能性があり、仕事でtokio依存ライブラリを使っている身としてはかなり戦々恐々としています。 ちなみに最近一瞬消滅しかかったことで話題になったWebフレームワークのactix-webは、独自のthreadpoolを持っているためtokioともasync-stdとも互換性がないです。(async/awaitがもう少し浸透したらこのまま消える可能性もあるのではと個人的には思っている) これ直ってるみたいです。コメント参照。
  • 学習コストはかなり高いと思います。Goに比べて言語機能がとにかく多いことと、↑のようにライブラリや言語自体がまだ発展途上であること、Goと違ってあまりeasy方面に振ってないライブラリが多いところなどにその理由があると感じています。ちなみにパフォーマンスを追求するわけでも低レイヤーであれこれするわけでもなく普通にアプリケーションを書くだけなら、巷で言われてるほど所有権とかライフタイムとかで詰まることはないと思います。
  • 仕事ではhyperとdieselを使っています。(diesel辞めたいって毎秒言っている)

終わりに