Grumpyのソースとドキュメントはこちら

https://github.com/google/grumpy

コレに関して書かれたブログ

http://cpplover.blogspot.jp/2017/01/googlegopythongrumpy.html

Docker HubにGoにそして、バイナリにコンパイルするイメージをあげた

https://hub.docker.com/r/shinofara/docker-grumpy/

つかいかたはREADMEにあるけど

簡単に検証するために、Pythonスクリプトを準備

$ echo 'print "hello, world"' > hello.py

まずは.goにビルド

$ docker run --rm -v ${PWD}:/work shinofara/docker-grumpy grumpc hello.py > hello.go

中身みてみよう

package main
import (
        πg "grumpy"
        π_os "os"
)
func initModule(πF *πg.Frame, _ []*πg.Object) (*πg.Object, *πg.BaseException) {
        var πTemp001 []*πg.Object
        _ = πTemp001
        var πE *πg.BaseException; _ = πE
        for ; πF.State() >= 0; πF.PopCheckpoint() {
                switch πF.State() {
                case 0:
                default: panic("unexpected function state")
                }
                // line 1: print "hello, world"
                πF.SetLineno(1)
                πTemp001 = make([]*πg.Object, 1)
                πTemp001[0] = πg.NewStr("hello,\x20world").ToObject()
                if πE = πg.Print(πF, πTemp001, true); πE != nil {
                        continue
                }
                return nil, nil
        }
        return nil, πE
}
var Code *πg.Code
func main() {
        Code = πg.NewCode("<module>", "hello.py", nil, 0, initModule)
        π_os.Exit(πg.RunMain(Code))
}

なかなかカオスな文字化け、このままでは実行が出来ないので、更にバイナリにコンパイルします。 思ってた形のコードじゃなかったけど、

πTemp001[0] = πg.NewStr("hello,\x20world").ToObject()
                if πE = πg.Print(πF, πTemp001, true); πE != nil {
                        continue
                }

処理としては変換されていますね。 さて、深くは後回しにして、バイナリを作ってみましょう。

$ docker run --rm -v ${PWD}:/work shinofara/docker-grumpy go build -o hello hello.go

Macとか他のOS用に書き出す場合は -e で環境変数を指定

$ docker run --rm -e "GOOS=darwin" -e GOARCH=amd64 -v ${PWD}:/work shinofara/docker-grumpy go build -o hello hello.go

うまく行ったら、 ./hello が作られるので実行してみます。

$ ./hello 
hello, world

helloが出力されました

実行速度は?

$ time python hello.py
hello, world

real    0m0.300s
user    0m0.012s
sys     0m0.049s
$ time ./hello
hello, world

real    0m0.015s
user    0m0.007s
sys     0m0.006s

そりゃ比べるまでもなかったですね。