第1回 Google Go登場の背景
赤坂 けい
チームWordProgress
2009/12/2
突然登場した新しいプログラミング言語「Go」。その独自性、魅力を余すところなく堪能してみよう(編集部)
唐突に登場したGoogle Goにまつわる若干のとまどい
2009年10月末にグーグルが発表した、新プログラミング言語Go(またはgolang)は、速くて軽量な言語である。ただし、「速さ」と「軽量」の意味合いには、少しだけ特殊な意味合いが込められている。
第一に、Goの「速さ」とは、コンパイルの速さという意味合いが強い。また、Goの「軽量」とは、並列処理に対応した言語でありつつも言語仕様が軽いといった意味合いがある。
コンパイルが速く、並列処理の記述が容易で、言語仕様が軽量だという、Goのうたい文句に引き付けられた人は多いだろう。そして何より、世界最大規模のWebサービスを提供しているグーグルが、錚々(そうそう)たるメンバーの名の下に、自社のシステム基盤に近いレイヤを記述するための新言語としてGoを世に送り出したという点から、Goは数多くのプログラマの注目を集めている。
だが、実際に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)。
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 |
Index | |
Google Go登場の背景 | |
Page1 唐突に登場したGoogle Goにまつわる若干のとまどい |
|
Page2 Goの実行系から見えてくる魅力 Goを学ぼう |
新世代の並列処理言語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の世界を体験してみよう |
|
- プログラムの実行はどのようにして行われるのか、Linuxカーネルのコードから探る (2017/7/20)
C言語の「Hello World!」プログラムで使われる、「printf()」「main()」関数の中身を、デバッガによる解析と逆アセンブル、ソースコード読解などのさまざまな側面から探る連載。最終回は、Linuxカーネルの中では、プログラムの起動時にはどのような処理が行われているのかを探る - エンジニアならC言語プログラムの終わりに呼び出されるexit()の中身分かってますよね? (2017/7/13)
C言語の「Hello World!」プログラムで使われる、「printf()」「main()」関数の中身を、デバッガによる解析と逆アセンブル、ソースコード読解などのさまざまな側面から探る連載。今回は、プログラムの終わりに呼び出されるexit()の中身を探る - VBAにおけるFileDialog操作の基本&ドライブの空き容量、ファイルのサイズやタイムスタンプの取得方法 (2017/7/10)
指定したドライブの空き容量、ファイルのタイムスタンプや属性を取得する方法、FileDialog/エクスプローラー操作の基本を紹介します - さらば残業! 面倒くさいエクセル業務を楽にする「Excel VBA」とは (2017/7/6)
日頃発生する“面倒くさい業務”。簡単なプログラミングで効率化できる可能性がある。本稿では、業務で使うことが多い「Microsoft Excel」で使えるVBAを紹介する。※ショートカットキー、アクセスキーの解説あり
|
|