Go Conference 2014 Autumnレポート

Go Conference 2014 Autumn,その他のセッションのまとめ

この記事を読むのに必要な時間:およそ 5 分

Hacking Go Compiler Internals(moriyoshi氏)

このセッションでは,moriyoshi氏からGo言語のコンパイラをハックする方法について解説がされました。なお,このセッションの発表資料は,以下のURLから閲覧することができます。

写真4 moriyoshi氏の発表の様子

写真4 moriyoshi氏の発表の様子

Go言語のコンパイラの構造

まずはじめにGo言語のコンパイラの簡単な説明がされました。同氏はGo言語のコンパイラは以下のような順序で処理を行っていると説明していました。

  1. 字句解析
  2. 構文解析
  3. エスケープ解析
  4. Typegen, GCproggen
  5. コード生成

字句解析におけるハック

字句解析器では,ソースコードをトークンに変換すると同氏は述べていました。src/go/cmd/gc/lexer.cを読むと,構文解析器がどのように実装されているかが分かると同氏は述べていました。構文解析器を変更することで,キーワードやオペレーターを好きな文字列に置き換えたりできるそうです。同氏は,絵文字を識別子として使えるように改造し,絵文字の寿司を名前に使った関数をコンパイルできるようにしていました。詳しくは同氏のブログ記事に書かれているそうです。

構文解析におけるハック

構文解析器は,字句解析器が生成したトークン列を抽象構文木に変換するそうです。また,単に抽象構文木に変換するだけではなく,コード生成がしやすい形に置き換えることもするそうです。なお,Go言語の構文解析器はyaccで書かれているとのことでした。

同氏は,以下の(A)というコードを(B)というコードに解釈されるように改造してみたそうです。

コード(A)

a := &struct{}{}
fmt.Println(a[1])
a[1] = "test2"

コード(B)

fmt.Println(a.__getindex(1))
a.__setindex(1, "test2")

上記のようにインデクサのオーバライドができるように,以下のような処理を追加したそうです。

  • 抽象構文木に新しいノードタイプOINDEXINTERを追加
  • typecheckという抽象構文木に型情報を埋め込むフェーズで,通常インデクサが有効な型(文字列,配列,スライス,マップ)以外の場合にOINDEXINTERを処理する部分を追加
  • walkというフェーズで,OINDEXINTERのノードを関数呼び出しのノードに変換し,再度その部分にtypecheckwalkを施すという処理を行う
  • 評価順序を修正する部分でOINDEXINTERを処理するコードを追加する

同氏はセッションの最後に,print関数がノードや型の情報を出力する書式を提供しているためハックする際に大変便利だったと述べていました。

How we use Go@ironzeb氏

このセッションでは,@ironzeb氏からGengoでのGo言語の使用事例についての紹介がされていました。なお残念ながら発表資料が公開されていないため,詳しい内容は紹介することができません。

写真5 @ironzeb氏の発表の様子

写真5 @ironzeb氏の発表の様子

Gengoでは,goshipというデプロイツールを作っているそうです。また,CodeigniterというPHPのフレームワークで書かれたAPIをGoで書き直したところ,500msだったところが10msになったそうです。この他にもパッケージの依存関係を解決するツールについての話題やテストについての話題が紹介されていました。

なお,GengoによるGo言語の採用事例はGengoのブログ記事も参考になります。

まとめ

Go Conference 2014 Autumnについて,4回に渡ってレポート記事を書きました。本レポートでは紹介しなかったLTについては,connpass上に発表資料がまとめられていますので,そちらを参考にしてください。

2014年は,多くの企業でGo言語を製品の開発に採用する事例が増えたようです。しかしながら,まだまだ開発チームの規模や採用している部分の規模が大きい物は少ないようです。

2015年はさらにGo言語を採用する場面が増えていき,規模も大きくなっていくのではないかと思います。

つぎのGo Conference 2015 Spring(本稿執筆時点では,開催はまだ未定)では,多人数のチームでの開発ノウハウなどが聞けるのではないかと期待しています。

著者プロフィール

上田拓也(うえだたくや)

KLab(株)所属。Go Conference 2014 Autumnスタッフ。

業務ではJavaScript,Luaなどを扱っている。

大学時代にGo言語に出会い,それ以来Go言語にのめり込む。

時間があると,Go言語の勉強会に参加している。

Go言語のマスコットのGopherの絵を描くのも好き。

Twitter:@tenntenn