(この記事は Dave Cheney さんの Why Go? の翻訳です。)
数週間前、友人に「Goに注目に値するのはなんで?」と聞かれました。
彼は私がGoに情熱を注いでいることを知っていましたが、なぜ私が他の人もGoを気にするべきだと思っているのかを知りたいようでした。
この記事は、私がGoを重要なプログラミング言語だと考える、3つの大きな理由を紹介します。
メモリ安全
個人としては、私もあなたもC言語でメモリリークも危険なメモリの再利用もしないプログラムを書く事ができるでしょう。しかし、40年以上の経験から、集団としてのプログラマーはC言語で信頼できるプログラムを書けない事がはっきりしています。
コードの静的解析、 valgrind, tsan (訳注: たぶん ThreadSanitizer), -Werror
といったツールは10年以上前から使えますが、それらのツールが広く認知されているかは疑わしく、広く採用されているとは全く言えない状況です。総じて言えば、プログラマーは自分たちがメモリを安全に管理できないことを示してきました。
そろそろC言語をやめるべきです。
Go はプログラマーによる直接のメモリ管理に依存しません。すべてのメモリアロケーションは言語のランタイムにより管理され、利用前に初期化され、必要に応じて境界チェックが行われます。
もちろんGoはこの種の安全性を提供している最初の主要な言語ではありません。おそらく Java (1995) がその候補でしょう。要するに、もうメモリ安全でないプログラミング言語に需要はないので、Goはデフォルトでメモリ安全なのです。
開発者の生産性
1970年代にハードウェアの時間は開発者の時間よりも安価になりました。
開発者の生産性は広大なトピックですが、要点としては、どれだけの時間を有益な作業に利用することができ、どれだけの時間をコンパイラを待ったり他人のコードベースの中で迷子になることに浪費するかです。
GoはC++のプログラムのコンパイルを待っている間に開発されたという冗談があります。
それくらい高速なコンパイルはGoにとって重要な特徴であり、また新しい開発者を惹きつける点でもあります。
コンパイル速度は論争が絶えない話題ではあるものの、他のいくつかの言語でコンパイルに数分かかるものがGoだと数秒しかかからないとは言えるでしょう。
開発者の生産性にとってより重要なのは、Goプログラマーたちはコードが読まれるために書かれるのであることを知っているので、書くときのことよりも読むときのことを重要視しています。
Goはツールと慣習によって、すべてのコードが特定のスタイルでフォーマットされることを強制してきました。これによりプロジェクトごとの言語の方言による摩擦を取り除き、またミスが「間違っているように見える」ので見つけやすくなります。
解析と機械的なアシストに集中した結果、C言語のプログラマーには広く受け入れられなかったような、一般的なコーディング上のエラーを見つけるためのより多くのツールがGoプログラマーに受け入れられてきました。Goの開発者はコードをクリーンに保つためのツールを歓迎しています。
コンカレンシー
10年以上前から、チップの設計者たちは「フリー・ランチ」の終わりを警告してきました。
安価な携帯電話から最も電力を食うサーバーに至るまで、より多くの、しかし遅いCPUコアによる並列性を、言語がサポートしている場合にだけ利用できます。
なので、今日のハードウェアで動くソフトウェアを書くのにコンカレンシーは欠かせません。
Go はOSのマルチプロセス/マルチスレッドによる並列性モデルをそのまま利用している言語の一歩先を行っています。Goは、 goroutine と呼ばれているコルーチンに基づいた軽量なコンカレンシーモデルを提供しています。
goroutine によりプログラマーは入り組んだコールバックを避けることができ、代わりに言語ランタイムがCPUのコアを利用するのに必要なだけのスレッドを利用します。
3つのルール
メモリ安全、生産性、コンカレンシーが、私がGoを友人に推める3つの理由です。
個々に見ていけば、これらのうち1つか2つを満たす言語はいくつかありますが、3つすべてを持っていることが、Goを今日における多くのプログラマーに取って素晴らしい選択肢にしています。