米Google Inc.は2009年11月10日,新しいプログラミング言語「Go」を公開した。C言語をベースとしており,システム記述も可能であるという。BSDライセンスの下,オープンソースのプロジェクトとして公開する。特徴は,(1)高速なコンパイルが可能であること,(2)オブジェクト指向プログラミング言語でありながら,型の継承関係を持たないこと,(3)並列処理を記述する機能を言語レベルで備えていること,(4)ガーベッジ・コレクタを実装し,プログラマが変数領域の開放に関して責任を負わなくて済む,などである。

 (1)は言語仕様的にはモジュールの依存関係を明確にすることで実現しているという。数値演算ライブラリであれば0.2秒,ライブラリ全体でも8.2秒程度でコンパイルできている。Goの開発には米AT&T Bell Laboratoriesで「Plan 9」の開発に携わっていたKen Thompson氏が関わっている。高速なコンパイラの実装がThompson氏の手によるもので,Plan 9の成果を盛り込んだプログラミング言語だと言えそうだ。

 (2)はスクリプト言語などの柔軟性を取り入れたものだ。C++などのオブジェクト指向言語では,クラス階層構造に基づく多態性(polymorphism)を実現している。これは親クラスの実装を継承できるが,似た機能の処理でも実装の方向性がまったく違う場合に対処できない。これに対しSmalltalkやスクリプト言語などでは,いわゆる「Duck Typing」と呼び,継承関係になくても同じメソッド名と引数であれば,その呼び出しを受け入れることができる。このことが,スクリプト言語の柔軟性を生む要因の一つとなっている。

 一方でデータ型は事前に定義しておき,コンパイル時点でチェックできた方が安全性は高い。そこでクラスの階層構造を取らず,多態性をインタフェースだけで実現するようにした。

 (3)の並列処理の記述は,CSP(communicating sequential process)と呼ぶプロセス代数のモデルに基づいている。CSPは1978年にTony Hoare氏が提案した考え方で,データの入出力を一つのアトミックな操作として定義するというもの。共有データを持たないことで,ロックやセマフォといった同期のメカニズムを使わずに並列処理を記述できる。

 並列処理の導入に伴い,必然的に(4)が求められたという。並列処理ではどの処理が先に終わるかを事前に保証することが難しい。このためオブジェクトの生成消滅の管理をプログラマが事前に記述することが困難であり,処理の同期の問題はこれまでもバグの温床となってきた。ガーベッジ・コレクタを実装することで,この問題を回避できるという。

訂正:記事掲載当初,CSPをcommunicational sequential processとしていましたが,communicating sequential processの誤りです。お詫びして訂正いたします。本文は訂正済みです。