隙あらば寝る

うぇぶのかいしゃではたらくえんじにあがかいています

grumpy使ってみた

Googleが公開したgurmpyを使ってみた。

github.com

grumpyはpython2で書かれたコードをgolangのコードに変換してくれるツール。

軽く触ってみて気づいたところ等をメモ。

動かす

READMEに従っていくだけで変換の流れは掴める。

本当にgoのコードが生成されるのでびっくりする。

生成されたコードをgo buildしてバイナリが完成。

pythonで書かれたコードと同じ動作をするgoのコードができるという感じ。

ただし、完全に同じというわけではなく、pythonの全機能が使えるわけではない。

いくつかの機能は未実装、もしくは明示的にサポート外としている(eval等の一部機能やCの拡張ライブラリ等)

加えて、標準ライブラリ以外をimportする場合は単純な変換では上手く動かなかった。

これはREADMEをなぞるかぎりの話で、方法はあるのかもしれない。

原理的にはpure pythonであれば再帰的にgoのコードに変換していけば動きそうだと思う。

内部

興味があったのでどう動いているのかも軽く調べてみた。

大きくはコンパイラ部分とランタイム部分に分かれているようだった。

コンパイラ

コンパイラ部分はpythonのastライブラリを使ってpythonコードを解析し、

最終的にgoのコードを出力する。

astで解析したpythonコードの中身に応じてgoのコード片を文字列として組み立てて行くように読めた。

このgoのコード片は後述するランタイム部分のコードを利用しているので、ここだけ読んでもよくわからないという印象。

動作とは関係がないが、出力されるgoのコードは以下のような感じでimportする際にπがprefixとして付与されている。

import (
        π_os "os"
)

なるほどπ(py)かーとちょっとおもしろかった。

ランタイム

ランタイム部分はgoで書かれている。

コンパイラが出力するgoのコードはこのランタイムを使ったコードになっていて、

pythonが提供している機能をgoで使えるようにしたライブラリになっている。

所感

コンパイラ部分はastの有効な使い方という感じだった。ただgoコードを生成する部分はかなり追うのが大変そう。

逆にランタイム部分はgoのコードとして読めるのでなかなかおもしろそう。

特に他の言語が提供している機能をgoで実装した内容になっているので、色々と興味深い。

このあたりプログラミング言語を作ったりする場合にも参考にできるんじゃないかなと思った。