GoはGoogleが中心となってオープンソースで開発が進んでいるプログラミング言語です。いろいろなプログラミング言語の良いところを採り入れたGoは、様々な“顔”を持っています。Go言語の生まれた背景や特徴などについて、グーグルのソフトウェアエンジニアである鵜飼文敏氏にお話を伺いました。

(聞き手は武部 健一=日経ソフトウエア



グーグルの鵜飼文敏氏
グーグルの鵜飼文敏氏

Goが生まれた経緯や背景について教えてください。

 Googleの中には検索エンジンや「Google App Engine」など、様々なサーバーがたくさんあるのですが、その中でスピードを要求する部分ではC++を使っています。ただ、C++は実行速度は速いのですが、ビルドに非常に時間がかかります。社内では分散コンパイル環境を作っていますが、仮に検索エンジンのサーバーを1台のマシンでビルドしようとすると、1日くらいの単位で時間を見ておかなければなりません。CPUなどが速くなっているのにコンパイルが遅いというのは何かを考え直した方が良いのではないか、という議論があり、プログラミング言語を変えればそういう問題はなくなると考えました。

 また、C++は何でもできるのですが、キチンと書かないと危険なことが起きます。Javaや最近のLightweight Languageのように、もっと安全に書けて、もっと本質的な部分に集中できる言語が必要だったという理由もあるでしょう。つまり、コンパイルが速くて、スクリプト言語的な書き方ができる言語が欲しくてGoが登場したと言えます(Goの特徴の詳細については、日経ソフトウエア7月号新連載『Google Goプログラミング入門』を参照)。

Goの処理速度はどの程度速いのですか。C++と同レベルに達していますか。

 現時点でそこまでは速くありません。コンパイラがまだ成熟していないからです。

 コンパイラの実装は二つあります。「6g/8g」と「gccgo」です。6g/8gはGoのすべての機能をサポートしていて、コンパイル速度も速いのですが、作成されるバイナリ(実行ファイル)はあまり最適化されていません。

 一方のgccgoは、gccがもともと持っているオプティマイザーの最適化機能が適用されるので、良いコードを生成します。ただし、現段階ではGoの機能をすべてはサポートしていません。例えば、ガーベジコレクションには未対応です。コンパイル速度は最適化に時間がかかるので6g/8gほどは速くないですね。

Goの文法で特徴的なところは。

 Interfaceの機能など、型システムが独特な点でしょうか。C++やJavaの型システムだと、設計するときにクラスの階層を考えて、どこにどのメソッドを定義するかでデザインセンスが問われます。なかなか一回でうまくいかないし、難しい部分です。

 Goだと、Interfaceを定義して、どういうメソッドを持っていれば良いかだけがポイントです。いわゆる“ダックタイピング”に近いので、他のオブジェクトとの関係を気にする必要はありません。慣れの問題はあるかもしれませんが、実際にGoを使ってみると、コードの書きやすさがわかるでしょう。

ジェネリックは今後サポートする予定なのでしょうか。

 ジェネリックがあれば便利なのはわかっていますが、Goでどのように設計すれば良いのかがまだ決まっていない状況です。

 空インタフェースとタイプスイッチを使えば現状でも似たようなことはできますが、もっと書きやすく、安全にするにはどうしたら良いのかが決まっていません。

将来、GoでAndroidのアプリを作るといったことは?

 組み込みはGoに不向きな分野です。動的型付けやリフレクションをサポートする上で必要な情報がバイナリの中に入るので、その分サイズが大きくなります。もっとも、組み込みデバイスはどんどん高性能になっているので、いずれ問題にならなくなるかもしれませんが。

Goはすでに実サービスで使われていますか。

 golang.orgのWebサーバーはGoで書かれています。(Goの開発者の一人である)Rob Pike氏は「今後プログラムはすべてGoで書く」と言っていましたね。