++C++; // 未確認飛行 C ブログ

http://ufcpp.net/

Go Language

leave a comment »

さて、こんなのが出たわけですが。

The Go Programming Language

どんな言語?

さて、まず、公式ページの FAQ のとこの説明を意訳。

  • 背景
    • コンピューターはずいぶん早くなったのにソフトウェア開発はそんな早くなってない
    • C 言語のヘッダー、いい加減死ねよ
    • Java とか C++ みたいな型システムだけじゃなくて、動的言語の型システムもあるよね
    • ガベコレとか同時実行(parallel)プログラミングとか、ちゃんとサポートしないとね
    • マルチコアな時代来た
  • ってことでこんな言語(Go Language)作ったんだ
    • コンパイル速いよ
    • ヘッダー?何それ?
    • 継承の階層持たないライトウェイトな感じの型システムを型安全に実現
    • ガベコレ持ってるし、並列処理を書くための機能を提供
    • マルチコアマシン上で動くシステムソフトウェアを作るために設計されてる

要点

  • 型システム
    • 仮想関数テーブルじゃなくて動的な型を見ながら動的ディスパッチしてるっぽい
    • C#er な人向けの説明すると:
      • メソッドは全部、C# でいうところの拡張メソッド
      • dynamic を使って動的多態性を実現してるようなイメージ
        • ちょうどこないだ清書したばかりの記事に動的ディスパッチの話もあるんで、そこを参照
        • 仕様見てる感じ、多分ね。内部実装まで見てないんで自信持ってはいえないですが
          • 追記:中身追った人に聞いたらこっちらしい → ひょっとすると、頑張って VTable 作って Boxing してくれてる可能性もありますが。
    • 基本的にダックタイピング
      • ただし、C++ 0x の(正確には 0x に入るはずだったけど仕様から漏れた)Concept っぽい機構で型安全性を確保してる
      • interface for duck typing って感じ
    • 継承の実現の仕方も C++ 系のやつとは全然違う
      • 匿名フィールド(メンバー変数)ってのを持つことで、そのフィールドのメソッドを mix-in できる
  • GC
    • Mark & Sweep っぽい
    • GC 持ちのくせにポインターがある!
      • まあ、C# 的にいうと、& は Boxing Operator なのかも
      • 基本は値型、*Type で Nurable<Type>、&x で x を Boxing
  • 同時実行(parallel 処理)
    • Erlang 系の、いわゆるアクター型の同時実行
    • MS 風に言うところのエージェント型
      • Axum が採用してるやつ
    • スレッド間でデータを直接共有せずに、通信はチャネルを通したメッセージ送受信だけで行う

個人的な感想

全体的な感想としては、Scala とかの関数型言語の文化を、きれいに C 系文化に移植したって感じかなぁ。(型システムの辺りだけね。変数の immutability とか関数の再帰地獄とかはない。)

C++ や Java、C# の競合っていうよりは、個人的には Erlang とか Scala、F# の競合に見える。

「関数型言語の発想を、C 系の OOP 言語の文化に馴染ませた」って意味では発想はなかなか素晴らしいと思う。

Q. C# の競合になる?

正直ないなぁ。

まだまだ詰めが甘いってのもあるけども、その問題は時間が解決する可能性もあるんで今は責めない。

それよりは、なんか立ってる土俵が違いすぎる。

  • なんか、思想の裏にあるのが基本的に Erlang 的な関数型言語
    • それを C 系統の OOP 言語の文化に馴染ませた感じ
  • C# は当然 .NET な言語で、Go はネイティブな言語

Q. じゃあ、他の言語との競合関係は?

C++ の置き換えは無理だろうなぁ。それは頑張って欲しい気もするけど、できたとして10年後ってところか。

Erlang よりは流行ると思う。

D はきわどい。C# と同じ理由で D と Go も微妙に土俵が違うんだけど、D は C++ と Go の間で人知れず忘れられていきそうな気も。

面白そうって思うところ

こいつの型システムと同時実行機能はなかなか興味深いと思う。それ以外だと:

  • var x int; とか x := 0; って書き方は結構好き
  • メソッドはもっといい
    • func (x InstanceType) MethodName (arg1 T1, arg2 T2) (ret1 U1, ret2 U2) { Body }
    • 最近、「自分で文法考えるならこうする」って思ってたのにかなり近い
  • 多重代入
    • a, b = b, a; でスワップになる
    • これ、右辺値が短いうちは可読性も失われないしいいんだけどなぁ。長くなってくるとどうだろう・・・
  • const block と iota ちょっと面白い
    • ちょっと不格好だけど
  • ++ と — を Expression からはずしたのはいい判断かも
    • ただし、Statement としては Increment/Decrement Statement はある

キモいって思うところ

  • Go って名前はないと思うなぁ・・・
    • 日常語として頻繁に使われる動詞と同綴りとかやめて
  • マスコット・・・
    • これはない。むしろいない方がいいだろうに
  • メンバーのアクセス制限が緩い(public, protected, private とかがない)
    • C++ よりもむしろ Erlang だから・・・
  • 配列型・・・
    • int[] じゃなくて []int
    • map との兼ね合いなんだろうなぁ
      • 例えば、「map の配列」の書き方は [] map [string] int
  • string の要素が byte、すなわちマルチバイト文字にはつらい
    • 日本じゃ致命的
      • 始まる前からオワタ\(^o^)/
    • UTF8 だって
  • map の仕様キメぇ
    • r, ok := a[x]; で、キーが x の要素を持ってるかどうかが ok に、もし持ってるならその値が r に入るんだって
  • RangeClause 持ちの for キメぇ
    • for i, s := range a { body }
    • i にインデックス、s に値
  • switch・・・
    • C# な人間としてこれだけは言いたい:
      • switch だけは C 系文化を引きずっちゃダメだ!
    • まあ、break とか書かなくてもデフォルトで break してくれるところはまだマシか
    • でも、fallthrough 文・・・それはそれでキメぇ
  • 構造化例外がない
    • まあ、例外に否定的なわけじゃなくて「複雑なんで当面勘弁」って感じっぽい
  • ジェネリクスもないけど、まあそれはいいや
    • 基本的に duck typing な言語なんで、ジェネリクスは不要かも

ネイティブってそんないいかねぇ

あと、言語の文法の話から離れると、やっぱネイティブより Managed な方がいいなぁ。

  • Common Type System 持ってない = ライブラリの互換性ない = 言語用にライブラリ作らないとダメってのがきつすぎる
    • その辺りは C/C++ との interop で何とかするんだろうけど
  • あと、処理をランタイム側に投げれないせいで、実行ファイルサイズ肥大化する
    • Hello World 書くだけでもコンパイル結果が結構でかくなるみたいだし

Written by ufcpp

2009年11月11日 @ 14:50

カテゴリー: Computers and Internet

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。