Go Conference 2014 Autumnレポート

Go言語の父と呼ばれるRob Pike氏による基調講演~Go Conference 2014 Autumn基調講演1人目

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

2014年11月30日(日)に,楽天タワーにてGo Conference 2014 Autumnが開催されました。Go Conference(GoCon)は2013年に始まり,年に2回,春と秋に開催される日本最大のGo言語のカンファレンスで,今回で4回目となります。今回は基調講演にGo言語の父と呼ばれるRob Pike氏と日本のGo言語の第一人者の鵜飼氏を招いていることもあり,今までで最も大きい規模となりました。

写真1 会場の様子

写真1 会場の様子

この記事では1人目のRob Pike氏の基調講演についてレポートを書きたいと思います。この基調講演では「Simplicity is Complicated」というタイトルで,Go言語の成功の要因となっている単純さについて話がされました。

Go言語が成功している理由

はじめにGo言語の成功している理由について話がされました。Go言語が成功している理由として,

  • コンパイルの速さ
  • 実行の速さ
  • デプロイの容易さ
  • ツール(go tool)
  • 標準ライブラリ

などのGo言語のエコシステムがよく挙げられるそうです。

また,言語の特徴としては,

  • 並行プログラム
  • インターフェース

などが挙げられるそうですが,どれも本当の理由ではないということでした。 同氏が考える成功の理由は,Go言語のSimplicity(単純さ)です。

言語の収束と相対性

多くの言語は,新しいバージョンで言語に新しい機能を入れようとしています。同氏が参加したLang.Nextというカンファレンスでの話題は,Java,JavaScript(ECMAScript),TypeScript,C#,C++,Hack(PHP)の新しいバージョンについてだったそうです。これらの言語は他の言語から機能を取り込むことで,新しい機能を提供しようとしているそうです。そして,同氏はこれらの言語は,1つの大きな言語に収束しているように見えると指摘していました。

自然言語では,言語が思想に影響するという説サピア=ウォーフの仮設があります。プログラミング言語にも同様のことが言え,さまざまなパラダイムの言語が存在しています。たとえば,

  • 論理プログラミング
  • 手続き型プログラミング
  • 関数プログラミング
  • オブジェクト指向プログラミング
  • 並行プログラミング

などがあり,数学の分野のように多様性を持っているとのことでした。

同氏は,多くの言語が機能追加をすることで競争力を高めようとすると,その多様性が失われると指摘していました。異なる問題には異なる考え方を持つ言語が必要だと考えているそうです。そのため,Go言語は言語機能を追加することで他の言語と競争するようなことはしませんでした。Go言語を始めたばかりの人たちは,他の言語にある機能を入れて欲しいと求めることが多いそうですが,Go言語はそれらの言語機能を増やすことはしませんでした。

また,2012年3月にリリースされたGo1で言語機能は固定されているため,今後のマイナーバージョンアップでは言語機能が増えることはないでしょう。同氏はGo言語に新しい言語機能を追加することは,Go言語の改善につながるとは考えてません。安易な言語機能の追加はGo言語を肥大化させ,他の言語との差異をなくし,つまらない言語にしてしまうと考えています。

可読性

Go言語の言語機能は,同氏と異なるバックグラウンドを持ったRobert Griesemer氏,Ken Thompson氏の同意のもとに正しく設計されているそうです。同氏は,可読性が最重要項目と考えており,そのためには言語機能をできるだけ単純にしたいと考えています。また,複数の選択肢があると,どの機能を使用するか選択するために時間を使ってしまうと指摘していました。そして,実装してしばらくするとなぜそのコードが動くのか書いた本人でもわからなくなってしまうことがあると述べていました。同氏は,単純なコードでも,言語の複雑さにより理解しづらいものになると考えているそうです。そのため,機能を増やすことは複雑さが増すことにつながるため,あることを実現する方法はできるだけ少なく,単純であるべきだと主張していました。

同氏は,可読性のあるコードは,信頼できるコードだと述べていました。そして,信頼できるコードは,理解しやすく,取り組みやすく,壊れてしまっても簡単に修正できるとのことでした。同氏は,言語が複雑であれば,コードを読んだり,コードに取り組むために多くのことを理解する必要があり,デバッグや修正のためにはさらに多くのことを理解しなければならないと指摘していました。そして,そこには「書くことが楽しいか?」「保守が楽か?」という重要なトレードオフが存在していると述べていました。

表現力

Go言語に対して,「表現力」を補うための機能が提案されることがあるそうです。しかし,同氏は簡潔であることは表現力を高めることになる場合もあるが,可読性が高いとは限らないと指摘していました。例として,APLでライフゲームを実行する以下の1行のコードが挙げられていました。

  1 ω  .  3 4 = +/ +⌿ 1 0 1 ∘.θ 1 - 1 Φ″  ω

同氏は,単純な考えを強力すぎる基本機能で実装すると実行コストが上がってしまう場合もあり,パフォーマンスの予測もしづらくなると指摘していました。一方で,コードが冗長だと本来の意図を曖昧にしてしまい,可読性が下がってしまうと述べていました。よく知られた馴染みのある考え方に基づいて実装し,しかしその考え方だけにとらわれないようにするべきとのことでした。つまり,表現力を残しつつも簡潔に表現するべきだということです。

著者プロフィール

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

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

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

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

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

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

Twitter:@tenntenn

コメント

コメントの記入