GoはGoogleによる新しいオープンソースの実験的プログラミング言語である。Cに似ているが、リフレクション、ガベージコレクタ、動的型、並行性、および、並列処理のような機能が追加されている。
Tech TalkチャンネルでのGoのプレゼンテーションにおいて、Goに主要開発者の1人であるRob Pike氏は、この言語は全てに対する答えになっているとは思っていないので実験段階であるとしているが、私たちはすでに実際に使っており、世に問うべき時が来たと考えている、と述べている。また、Goは並行性をあつかう構造を言語自体に含んでおり、開発者が並列タスクを容易に作成できるようにすることを目的としている。この言語の作者によれば、Goの目標のいくつかは以下の通りである。
- 静的言語の効率性と動的言語の記述しやすさを組み合わせること。事実、開発者は静的にするか動的にするかを選択することが可能である。
- 安全性。Goは型安全であり、暗黙のキャストを許容せず、明示的なキャストのみを許容する。また、ポインタ演算を提供せず、ガベージコレクションを提供するため、メモリ安全である。
- 並行性と通信に対する優れたサポートの提供。
- 効率的で遅延のないガベージコレクションを持つこと。
- 高速なコンパイル。
次のような興味深い特徴を持っている。
- ポインタを持っているが、ポインタ演算はない。
- インターフェースを持つ。
- 同期チャネルを持つ。このチャネルはスレッド間の通信に使われ、並行処理の基礎となっている。Goはそれをやりとりすることでメモリの共有を促進するが、共有メモリを通じて通信はしない。ある時点ではただ1つのスレッドだけが共有値に対するアクセスを持つことができ、チャネルを通じてスレッド間でのその値の受け渡しが行われる。
- ゴールーチン(Goroutines)。これは並行処理のために利用されるもう1つの構造である。ゴールーチンは単に“go”キーワードを接頭辞として持つ関数あるいはメソッドである。ゴールーチンはスレッドと結びついていて、チャネルを通じて別のゴールーチンと通信する。
- 並列化。ゴールーチンとチャネルは計算を複数のCPU上で動かすために利用することができる。
- リフレクション。全ての型とチャネルに対してリフレクションが使える。
- エンベッディング(Embedding)。シンプルな継承の仕組みである。
Goには今のところ2つのコンパイラが存在する。1つはプラットフォームごとに異なる名前がつけられており、64-bit x86またはAMD64向けには6g、32-bit x86またはAMD32向けには8g、ARMプラットフォームに対しては5gと呼ばれる。もう一つのコンパイラはgccgoである。6gはマークアンドスワップ型のガベージコレクタを持っているが、gccgoはガベージコレクタを持っていない。しかしながら、IBMのRecyclerベースの新しいガベージコレクタが両方のコンパイラに対して開発中である。IDEやデバッガはまだない。
Goの目的の1つは高速なコンパイラを持つことであるが、それは達成されているようにみえる。6gコンパイラは高速である。gccgoは遅いがより最適化されたコードを生成する。コンパイラはマシンコードのみを生成し、VMのバイトコードを生成したりはしない。Cコードとほとんど変わらない速さで動くか、同様のCコードの場合より10-20%ほど遅い、と言っている。
基本的な関数のライブラリが数多く利用可能であるが、必要とされているものがもっと多くある。Godocはjavadocと同じようにソースコードから文書を生成する。Goはオープンソースプロジェクトであり、BSDライセンスのもとで公開されている。
リソース: Goウェブサイト, Rob Pike氏によるGoのプレゼンテーション。