Google App Engine for Go

Python, Javaにつづく第3の言語としてGoogle App Engineに投入されたのはなんと Go Lang だった。Google内部にしかまじめに使っている人はいなさそうなのに。。。これを Go に対するGoogleのコミットメントの現れだと考えるか、単なる趣味の世界だと考えるか、微妙なところ。

Go とは

Go はGoogleが開発中の言語。

  • 型付きだけど、ある程度型推論してくれるので、Javaのようにすべてに型をつけて回る必要がない、という最近ありがちなスタイル。
  • 構造体はあるけど、クラスはない。けどそれっぽいことは書ける。継承もない。型パラメータもない。
  • go routine と呼ばれる軽量スレッドが使える。
  • GCあり。

ミニマルで気持ちいいけど、まだまだ処理系には難がある、と言う印象。

GAE for Go のパッケージ

インストールはすごく簡単。手元に必要なのはPythonの処理系だけ。パッケージにGoのコンパイラも含まれているので、事前にインストールしておく必要はない。パッケージは、Python のものをベースにしている。appcfg.py, dev_appserver.py など、コマンド名もそのままだ。
面白いのはコンパイルする必要が無いところ。Goはコンパイル言語なのだけど、少なくとも開発環境で使っている限りは、初めてのリクエストをうけたときに動的にコンパイルする。だからその時点でシンタックスエラーが出たりするのだけど、開発環境が自動的にソースの更新を検出して再コンパイルしてくれるので、開発環境を立ち上げっぱなしでインクリメンタルに開発することが可能。この辺、まるでインタプリタ言語を使っているかのような感じ。

制約

Goは軽量スレッドgo routineがウリなのだが、GAEでもgo routineは使える。ただし、実際に動作するスレッドは1つ。つまり概念的には複数スレッドになっているんだけど、それらが逐次化されて一つのスレッドとして動作する。ちょっと前に試した感じでは、Go の並列実行はまだまだで、あんまり早くならないから、これは別に問題にならないだろう。

もう一つ面白いのはGo はGAEのHigh Replication Storageでしか使えないこと。今後はこちらがデフォルトになるらしいので、あまり問題にならないだろう。

サービスの書き方

サービスの書き方もPython版に準ずる。

app.yaml

Python同様にapp.yamlを書く必要がある。

application: xxxxxxx
version: xxxxx
runtime: go
api_version: 2

handlers:
- url: /.*
  script: _go_app

runtimeを pythonではなくgoにする。また、api_versionがいきなり「2」なのにも注意。python版はまだ1なのに。。
script に指定されている_go_app はおまじないなのでこのまま書く。というかhandlers部全体がおまじない化している感じ。

サービス

サービスの書き方は、Go 標準のhttpパッケージでのサーバの記述方法に準ずる。hello worldはこんな感じになる。

package helloworld

import (
	"fmt"
	"http"
)

func init() {
	http.HandleFunc("/", handle)
}

func handle(w http.ResponseWriter, r *http.Request) {
	fmt.Fprint(w, "<html><body>Hello, World!</body></html>")
}

init() は自動的に呼び出される初期化ルーチン。ここでハンドラとURLのマッピングを行っている。実際に処理するのは、ここではhandleと言う関数。まあ、非常にストレートフォワードだ。

性能は?

ライブラリ類も(PythonJavaに比べれば)貧弱なGo をわざわざ使う理由は、いまのところ性能(と趣味)しかない。ので実際早くなってるのか、フィボナッチ(笑)で調べてみた。GAE上にアップロードしたものを手元からcurl で呼び出して、全体の実行時間を見る。

fib(37)だとPython だと9秒から10秒程度。おそい。。これをGoにすると、0.6秒程度。おお!すごい!と思ったけど、Javaでは最速0.5秒ぐらい。。。。とんとんか。

所感

dev_appserver が結構ちゃんと作られていて、ストレス無くプログラミングできそうな感じではある。Pythonが好きで、Javaが嫌いな人にとっては、どこかPythonに似たGoは面白い選択肢かもしれない。
しかし、これどこまで本気なんだ??なんか単なる洒落のような気もするんだよなあ。。。普通洒落にここまで力を入れることはないんだけど、Googleのすることだからなあ。