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

他言語と比較したGo言語の良し悪し及び学習について

yu81
June 23, 2017

 他言語と比較したGo言語の良し悪し及び学習について

2017/06/23 Geeks Who Drink in Tokyo--Go Go Golang Edition! での発表です。 https://nulab.connpass.com/event/59086/

yu81

June 23, 2017
Tweet

More Decks by yu81

Other Decks in Programming

Transcript

  1. A bout me { " p r o f i

    l e " : { " n a m e " : " 臼井 友亮" , " n a m e _ e n " : " Y u s u k e U s u i " , " s i t e " : " h t t p : / / y u 8 1 . g i t h u b . i o / " , " p r o g r a m m i n g _ l a n g u a g e " : [ " G o l a n g " , " P H P " , " S h e l l S c r i p t " , " P y t h o n " , " C # " , " C " , " C + + " , " a n d m o r e . . . " ] , " c a r r e r " : [ " 株式会社システム計画研究所( 2 0 0 8 / 0 4 - 2 0 1 2 / 0 3 ) " , " ハンズラボ株式会社/ 株式会社東急ハンズ( 2 0 1 2 / 0 4 - 2 0 1 6 / 0 5 ) " , " 株式会社エウレカ( 2 0 1 6 / 0 6 - ) " ] } }
  2. 使用言語に着目したバックグラウンド 学生時代/新卒新人研修 たどたどしい C 言語。 数値計算、 オセロ AI (新卒研修)。 1社目業務

    C ++/MFC , C #/WPF , C ++.NET for W indows N at iv e A pps. 2社目業務 EC (W eb/i OS /A ndr oid)及び EC と商品関連システム連携。 シェ ルスクリプトでバッチ・API (本当にシェルでjsonを吐く) PHP で上記システム(主に API )のリプレー ス。 新卒新人研修の初学者教育用言語として P yt honを採用し教 授。
  3. 使用言語に着目したバックグラウンド 3社目(現職エウレカ)業務 全てが G olangになる 自社オンラインデー ティングサー ビス P airs(https://p

    airs.lv/) のサー バサイドは全て G olangで記述されている。 複数のマイクロサー ビスからなるが、 基本的には全て G olang。 一部機械学習関連は P yt hon、 一部内部ツー ルはその他の 言語もある。
  4. 良い所(1) 言語仕様が小さいため、 基本の習得が容易ですぐにプロダクション コー ドを書けるようになる。 繰り返し文が f o r しかない。

    w h i l e も f o r e a c h もない。 可視性を表す修飾子( p u b l i c , p r i v a t e )もなく、U pp er or L ow er で表現。 局所的な実装レベルで見れば、 誰が書いてもだいたい同じよう なコー ドになる。
  5. 良い所(2) 無駄なコー ディング規約に関する議論を全くしなくていい。 g o f m t (標準の規約に従ったコー ドフォー

    マットを行う)は神 ツー ル。 他の言語にも同等のツー ルが欲しいくらい。 これが無いと…… コー ディング規約の徹底 コー ドフォー マットの共通設定ファイルを各人のエディ タ/IDE 毎に作って配布・ メンテナンス 不毛でだるい。 本質的でない。
  6. 良い所(3) 局所的な高速化が容易 ベンチマー クテストが組み込みのテスト機能の一部になってお り( g o t e s

    t - b e n c h )、 マイクロベンチマー クをとることによ る速度改善が行いやすい。 そもそもの処理速度が C ++などに比肩する程度だが、 メモリ確 保のやり方が悪いと動的型付けのスクリプト言語並の速度にな るので、 このようになっていないか確認しやすい。 メモリアロケー ションの実行回数の検出がベンチマー ク時 に出来( - b e n c h m e m )、 その最小化を目指すだけでも桁違 いに高速化する。
  7. 良い所(5) 標準ライブラリのソー スコー ドが容易に読める 実際に標準の正規表現ライブラリ( r e g e x

    p )を読んでみた話。 https://dev elop ers.eur e.jp/t ech/golang‑r egexp/ 手続き的だが素直な処理。 https://git hu b.com/golang/go/blob/mast er/sr c/r egexp/e x ec.go s o r t とか含めてアルゴリズム系のパッケー ジはその学 習にも良さそう。 G olang は 1.5系からコンパイラも G oで書かれるようになった ので、 その気になればコンパイラも読めるはず……! 言語仕様の小ささと黒魔術的な処理の書きにくさもあってか、 普段自身が書いているコー ドとライブラリのコー ドの書き方の 差異は思ったより小さい。
  8. つらい所(1) 総称型(ジェネリクス)が無い 似て非なる複数の型に対して、 コピペの様な処理を大量に書か なければならないことも。 このパッケー ジ https://git hu b.com/t

    ay lor chu/gener ic のよう に、 g o g e n e r a t e を使ったり、 i n t e r f a c e を使ったり、 埋 め込み構造体を上手く使えば実現可能だが、 あった方がシンプ ルではないかと思う。(個人差があります) パラダイムの違いとはいえ、 オブジェクト指向的に書ける言語 においてはあった方が楽だなと思うことがまれにある。
  9. つらい所(2) 例外が無い そのための e r r o r int er

    face 及び p k g / e r r o r s だが…… 大きめのアプリケー ションの場合、 例外機構で処理した方がシ ンプルになるのではないかと思うケー スも。
  10. つらい所(3) まだまだ使用者が少なく、 標準以外のライブラリの採用に慎重を要 する。 とあるlogger(結構メジャー)をアクロバティックな使い方をし ていた(1.5系使用時代)。 自社アプリケー ションを1.6系以上にアップデー トしようとし たら、

    修正中にp anic地獄。 logger の内部のmap が同時書き込みに対してu ns afeであること を明示するためp anicを起こす挙動になっていた……! https://t ip.golang.or g/doc/go1.6#ru nt ime あるべき姿にはなったわけであるが。 とはいえこれはcontributeチャンスではある。
  11. 学習方法(1) まずは A T our of G o(https://go‑t our‑jp.appsp ot.com/)

    で触ってみ る。 はじめての G o言語、 スター ティング G o言語 など、 初心者向けの書 籍は最初に手元にあった方がよい。 環境構築についてのはまりを減らす。 G O P A T H の考え方な ど。 理想はそのあたりを把握している人が近くにいること。
  12. 学習方法(2) T our of G o や書籍などで概要を把握したら、 コマンドラインツー ル などを作ってみる。

    既知の API のコマンドラインクライアントなど。 天気予報や T w itt er とか。
  13. 学習方法(3) 作りながら生じた疑問やライブラリの使い方などを、 以下を参照し て解決していく。 公式ドキュメント パッケー ジ https://golang.or g/p kg/

    E ffect iv e G o https://golang.or g/doc/effect iv e_go.ht ml T he G o B log https://blog.golang.or g/ G o W iki https://git hu b.com/golang/go/w iki G o by E x amp le https://goby ex amp le.com/ G olang コミュニティ界隈の人達の SNS やブログなど含めたアウト プットをフォロー する。
  14. まとめ G olangはコンパクトな仕様と充実した標準の機構、 及び公式ドキュ メントにより、 学習、 規約の最小化、 処理の最適化が容易。 オブジェクト指向言語として使う事ができるが、 他のオブジェクト

    指向言語がほとんど備えているが G olangに存在しない機構があるの で、 代替機構による独自のノウハウが必要になる。 まだまだこれからの言語なので、 一緒にやっていきましょう。