Upgrade to Pro — share decks privately, control downloads, hide ads and more …

PHP を Go にする mercari.go #4

sters
November 09, 2018

PHP を Go にする mercari.go #4

Transpile PHP code to Go like something code.

sters

November 09, 2018
Tweet

More Decks by sters

Other Decks in Technology

Transcript

  1. マイクロサービス化 • それぞれのマイクロサービスの開発は順次始まり 続々と本番リリースへ向けて進んでいます。 • と、いう話は Mercari Tech Conf 2018

    でされました。 https://techconf.mercari.com/2018 • 記事が様々なところで公開されています。 !!!!!見てほしい!!!!!
  2. マイクロサービス化 • メインの言語として Go を採用している • ※これは個人の感想です ◦ "マイクロサービス" であって、個々のサービスが複雑になりにくいという前提

    ◦ 大規模なパッケージ、フレームワークなどを学ばなくてもよい ◦ Go 周辺知識を学ぶべきことが少ない = Go がわかればコードが分かる ◦ シンプル。疎結合。非同期。 ◦ gRPC!!! ◦ まとめ: ええやん
  3. メルカリAPI の “通知” 実装 • 移行期、なるべく現行のものに互換性を高く作っていきたい ◦ ロールバックのしにくい変更を加えることが難しい ◦ リリースに向けて多数の変更があると

    QA 項目が無限に膨らむ ◦ API の Input と Output の形が変わると他チームとの調整が必要になる ◦ ビジネスロジックを変えるなら Product Manager な人達との調整が必要になる ◦ → 時間が無限にかかっていく!
  4. メルカリAPI の “通知” 実装 • Input と Output を変えない、データの持ち方も変えない •

    → PHP から Go に実装を移すだけ • 「こういうデータタイプのときは、この専用クラスを使う」 • その “専用クラス” がそこそこな数ある • 淡々と人間が手作業で翻訳するの… • プログラムに任せよう!!!
  5. [ PHP Golang xxxxx ][検索] • xxxxx = convert, translate,

    transpile ◦ そりゃまあ無いよね。 • https://github.com/deuill/go-php ◦ Go による PHP のバインディング • https://github.com/kitech/php-go ◦ Go で PHP Extension を書ける • どちらも面白いが、欲しいものはちょっと違う
  6. PHP to Go の機運 • ないものは作ろう! ◦ 同じものを欲している人が他にもいるかもしれない ◦ というか自分がいますぐ欲しい

    • PHP to Go の方針 ◦ 100% 完璧な変換はできなくていい、というか無理。 ◦ 職人による手作業を加えることで 愛あるコード Go way, パフォーマンスなどの要素を入れる ◦ 変換した Go っぽいコードと元のコードを並べて見ることができれば コードの意図も汲んで手で修正も容易のはず
  7. Version.1 of PHP to Go • nikic/php-parserを使うと PHP → AST

    → PHP と行き来できる ◦ https://github.com/nikic/PHP-Parser ◦ PHP で実装された PHP パーサ • 1. コード表記の統一目的でいったん AST を経由してコードを出力 • 2. 出力されたものを文字列置換で頑張って変換 • 3. それっぽいコードが手に入る!
  8. Version.1 of PHP to Go • Before ◦ 一番最初は全部手作業で、解読してコピペの繰り返してた ◦

    1つあたり 20-40分 くらい。 • After ◦ 文字列置換していく実装は 3-4 時間 程度 ◦ 変換しつつバグ修正しつつドメイン特化していった ◦ 最終的には 1つあたり 5-10分 で移植完了 • “そこそこな数ある” うちの 50-60クラスくらいは PHP to Go で楽した
  9. Version.1 of PHP to Go • メルカリなドメイン知識に紐づく記述だらけなので公開できない ◦ 世の中の使いたい人ゴメン •

    @morikuni < それ mercari.go #4 で話してくださいよ! • 圧倒的汎用化のチャンス!!
  10. Version.2 of PHP to Go • 冷静に nikic/php-parser の実装を見てみると… •

    AST 自体に PHP の書き方が入っているわけではない(そりゃそうだ) • AST を整形するための Pretty Printer が PHP コードを作っている • そこをオーバーライドしたら良いのでは?
  11. Version.2 of PHP to Go • できた • https://github.com/sters/phptogo ◦

    各 AST ノードの成形時に対して、フックを仕込めるようにした ◦ ドメイン知識っぽいところはそれぞれで実装しよう!! ◦ というか基礎的な構文くらいしか対応していない ◦ 各関数は各自で
  12. Version.X of PHP to Go • PHP じゃなくて、ワンバイナリでシュッとやりたい… • PHP

    to Go written by Go with converted "PHP to Go written by PHP" ◦ 要はセルフホスティング。 ◦ でも nikic/php-parser 他依存ライブラリもあるし …、ちょっとパワーかかり過ぎでは!! • https://github.com/stephens2424/php ◦ Go で書かれた PHP パーサを見つけた(今週の話) ◦ 「トランスパイルしたいよな!」みたいなことも言っている模様 ◦ その流れに合流していくとよさそう ◦ そもそも需要高さはわからない(このリポジトリで over 400 stars なのでそこそこ…?)