新世代の並列処理言語Google Goをひもとく

第1回 Google Go登場の背景

赤坂 けい
チームWordProgress

2009/12/2

突然登場した新しいプログラミング言語「Go」。その独自性、魅力を余すところなく堪能してみよう(編集部)

唐突に登場したGoogle Goにまつわる若干のとまどい

 2009年10月末にグーグルが発表した、新プログラミング言語Go(またはgolang)は、速くて軽量な言語である。ただし、「速さ」と「軽量」の意味合いには、少しだけ特殊な意味合いが込められている。

 第一に、Goの「速さ」とは、コンパイルの速さという意味合いが強い。また、Goの「軽量」とは、並列処理に対応した言語でありつつも言語仕様が軽いといった意味合いがある。

 コンパイルが速く、並列処理の記述が容易で、言語仕様が軽量だという、Goのうたい文句に引き付けられた人は多いだろう。そして何より、世界最大規模のWebサービスを提供しているグーグルが、錚々(そうそう)たるメンバーの名の下に、自社のシステム基盤に近いレイヤを記述するための新言語としてGoを世に送り出したという点から、Goは数多くのプログラマの注目を集めている。

【関連記事】
グーグル、C/C++に代わる新言語「Go」をOSSで公開
http://www.atmarkit.co.jp/news/200911/11/go.html

 だが、実際にGoを試して見た人々からは、戸惑いの声も上がっている。影響を受けたとされているC/C++はもちろんのこと、PHPやPythonやRubyなど既存のメジャー言語のいずれとも少なからぬ相違がある。

 例えば、Goの変数宣言は以下のいずれかの方法で行う。

var a uint64 = 1; (1)
a := uint64(1);  (2)

 (1)においては、varが変数宣言であることを明記し、その次に変数名aとその型uint64が記述されている(Goは、C/C++と同じく静的型付け言語である)。そして、イコールの後に初期値1が代入されている。

 (2)は、(1)の表記の略記法(シンタクス・シュガー)であり、名称aは、その後の:=という宣言によって、型uint64と初期値1と結び付けられる。

 Goに注目している人にとって、こうした記法自体を理解することは難しくないだろう。だが、変数の代入という、ごく基本的なところから新たに覚えなければならないことが生じている。

 さらに、Goのifやforなどの制御構造、関数の機能を見ていくと、困惑が広がるかもしれない。Goの制御構造は、互いに競い合い進化した主要言語に比べるとむしろ後退しているかのように思える点がある。

 例えば、ifで評価した結果に基づき返り値を変える関数定義(func Fx)は以下のように書かなければならない。

// 返り値ret(int型)を関数宣言内で明記
    func Fx(i int) (ret int) {
        if i > 0 { ret = i*i } else { ret = 0 }
        return;
    }
// 入力値iが正の整数の場合iの2乗が、iが0以下の整数の場合0が返される

 現状のGoでは、if文内に複数のreturnを書くことができない。そのため、関数宣言時にあらかじめ返り値を明示するなど、既存の言語より「一手間かかってしまう感」がある(*1)。

【*1】
Goと同じく並列処理指向の新興コンパイル言語として注目を集めているScala(コンパイル言語の中ではもっとも推論機能が充実している言語の1つである)では、ifが値を返す式であるとされ、また、returnを省略できる規則がある(最後に評価された式が関数の返り値となる)ため、同様の関数定義(def Fx)は以下のように書くことができる。

  def Fx(i:Int) = if (i > 0) i*i else 0

※ここでは、戻り値となるi*iと0の双方が整数であるため、関数Fxの戻り値は自動的にInt型であると推測される

お詫びと訂正(2009年12月24日)

連載公開時、「現状のGoでは、関数内に複数のreturnを書くことができない」との記述を行いましたが、こちらは、「現状のGoでは、if文内に複数のreturnを書くことができない」の誤りでした。申し訳ございませんでした(ご指摘いただいた方、ありがとうございました)

 いまどきのプログラミング言語では、プログラマの負担を減らすため、処理系にとって自明のことは省略してもよい推論機能を持つことが多くなっている。

 Goでは、こうした推論機能は充実しておらず、むしろプログラマに構文要素を「明示すること(explicit)」を求める。むろん、Goは登場したばかりの言語であり、Google自身も、「実験的(experimental)」と位置付けている言語である。そのため、将来的には、言語機能が充実すると共に、よりこなれた記述法が許されるようになっていくことは期待できる。

 しかし、いまどきのプログラミング言語のトレンドからいささか外れたように思える言語を、Googleがこのタイミングでリリースしたことへの疑問は残る。

 プログラミング言語を熱心に追いかけているブロガーやGoのメーリングリスト参加者の間では、Cの後継を文字どおり目指しているコンパイル言語Dや、Google App Engineで用いられているスクリプト言語であるPythonなどにもっと近い文法を持つプログラミング言語が登場して欲しかったといった声も上がっている。 

 
1/2
next

Index
Google Go登場の背景
  Page1
唐突に登場したGoogle Goにまつわる若干のとまどい
  Page2
Goの実行系から見えてくる魅力
Goを学ぼう

index 新世代の並列処理言語Google Goをひもとく

 Coding Edgeお勧め記事
いまさらアルゴリズムを学ぶ意味
コーディングに役立つ! アルゴリズムの基本(1)
 コンピュータに「3の倍数と3の付く数字」を判断させるにはどうしたらいいか。発想力を鍛えよう
Zope 3の魅力に迫る
Zope 3とは何ぞや?(1)
 Pythonで書かれたWebアプリケーションフレームワーク「Zope 3」。ほかのソフトウェアとは一体何が違っているのか?
貧弱環境プログラミングのススメ
柴田 淳のコーディング天国
 高性能なIT機器に囲まれた環境でコンピュータの動作原理に触れることは可能だろうか。貧弱なPC上にビットマップの直線をどうやって引く?
Haskellプログラミングの楽しみ方
のんびりHaskell(1)
 関数型言語に分類されるHaskell。C言語などの手続き型言語とまったく異なるプログラミングの世界に踏み出してみよう
ちょっと変わったLisp入門
Gaucheでメタプログラミング(1)
 Lispの一種であるScheme。いくつかある処理系の中でも気軽にスクリプトを書けるGaucheでLispの世界を体験してみよう
  Coding Edgeフォーラムフィード  2.01.00.91


Coding Edge フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

>

Coding Edge 記事ランキング

本日 月間