PHP を Go にするという話を mercari.go というイベントで喋りました

PHP を Go にするという話を mercari.go というイベントで喋りました(今更)

mercari.go #4 を開催しました - Mercari Engineering Blog

スライドに書いてある話がおおむねすべてです。

リポジトリはここ: sters/phptogo: Transpile PHP code to Go like something code.

今のメルカリの状況については、各所の web メディアにかかれている Mercari Tech Conf の話がいちばんまとまっていると思います。

この記事では後付けというか、いくつか補足できればと思いますー。

コードすべて変換して手直しはそう大変でもない

初期のもの(スライド中の v1)では、丸っと全コード変換はしていません。

Go でざっくりと書いたテンプレートファイルを作っておいて、そこに struct を書いていて、元の PHP コードから function 単位で、該当するテンプレートファイル上の関数へと埋めていく、といったことをやっていました。

Github で公開したものはその手続きを含んでいないので、大変そうに見えると思います。
(実際これでやれって話になったらチョットつらい)

加えて、各種 Go ヘルプするツール群を利用すれば
自動である程度整ってくれるので、マジつれーわーうわーみたいなことにはならないとおもっています。

型情報もう少しなんとかしたい

PHPDoc あるいは PHP の型宣言の情報を利用すれば、もっと埋めることができます。
そのとき、わからないやつは一旦全部 interface{}でゆるっと扱う、みたいなことになると思います。

関数においての PHPDoc からの補完はすでに書いています。
add function parameter type completion form phpdoc · sters/phptogo@b8e3d96

テストどうやる問題

確かにテストは本当に正しいのかどうかわからないというのもわかります、実際わからない。

一つのやり方として、生成物が Go のような何かのコードではなく、完全に Go の AST を作ってしまう、という手が考えられます。
テストとしては AST→AST ができることを確認すればよいので、今よりは信頼できる(?)テストになるんじゃないでしょうか。
当然そのまま持っていくことがムリな情報は落とさざるを得ないので、落とすか、それっぽい値で補完するかのどちらかになるのは今と変わらないです。

Githubで公開したものに色々追加したいねー

Github で公開したものは、セミコロンないよとか変数に$はつかないよとか、ごくごく基本的な構文の変換くらいしかやっていません。

もっと足を伸ばして PHP クラスを Go の構造体に落とすぞ!!!みたいなものはちょっとやりすぎで、そのとき、うまく出来るように一定のフォーマットであるとか、フレームワークのようなものを利用者に強いることになってくると思うのでそのフレームワークのようなものを理解しなければいけないのは微妙かなと。

ということで、必要なもの、なんとかしたいもの、はそれぞれで実装してくれ!ただ、それだと勝手が悪いところも多いと思うので、サンプルの文量を増やしていくかなあとはおもっています。
たとえば初期実装ではやっていたようなテンプレートファイルに落とし込むようなやつとか。

そもそもPHPをGoに変換する必要があるのか

いや、そんなにないんじゃないですかね……

複雑すぎないクラスやバッチがたくさんあって、何かしらの理由で Go に持っていきたい、という場合に需要がでてくると思います。
ただ PHP で今動いているものを Go で動かすことに対して、手間ひまがかかることは当然なので、効果というか色々と天秤にかけたうえでやったらいいんじゃないですかね~~~。

欲する人のそれぞれの状況によると思うので一概に答えはないと思います。
僕の状況ではだんだんつらくなってきて欲しくなったので作っていった、というだけです。

前後の記事

Next:
Prev: