Pythonは2系と3系で大幅にコードを変えなければなりません。それによって2系で作られた資産がそのままになってしまっているケースも多いのではないでしょうか。かといってサポートできる年数を考えるとコンバートが必要になります。 そのコンバート先としてPython3系ではなくGoを考えてみたくなるのがGrumpyです。GrumpyはGoogle製のPythonコードをGoに変換するソフトウェアです。

Grumpyの使い方

使い方は幾つかありますが、単純にコードを実行する場合は次のようにします。

$ echo "print 'hello, world'" | make run
hello, world

コードを変換することもできます。これは変換して生成されたGoのコードです。元のコードは上記の print "hello, world" です。

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, world").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))
}

実際にGoとして実行ができます。

$ go run hello.go 
hello, world

Grumpyの特徴はPythonのコードを完全にGoのコードに変換することで、VMを使っていないということです。これによって、既存の資産をPythonからGoへ移行させることはもちろん、実行時の速度についても問題ありません。

GrumpyはGo/Python製のオープンソース・ソフトウェア(Apache Licnese 2.0)です。

google/grumpy: Grumpy is a Python to Go source code transcompiler and runtime.