たかはらです。
Googleが新しいプログラム言語を発表しました。早速プログラムされている方(1 2)とか尊敬します。最近はご無沙汰ですが、C++最強説を今だに唱え続ける自分としてはGo For C++ Programmersのようなドキュメントをみるとうれしくなってしまいまして、Go For C++ Programmersの最初の”Conceptual Differences”部分を勝手に和訳しました。権利的に問題があれば削除します。
適当に訳したので致命的な誤訳はありそうです。コメント欄で指摘頂けるとありがたいです。
以下、訳となります。
GoはC++のような汎用システム用のプログラム言語を目指しています。C++プログラマ向けにいくつかの注意点があります。このドキュメントでは、GoとC++の違いについて説明する事であまり違わない事が判るよ。
Goのもっと一般的な紹介は、”Go tutorial”や”Effective Go”を見てくださいね。
Goの細かい仕様を知りたいなら、”Go spec”をみてね。
GoとC++の概念的な違い:
- Goにはコンストラクタやデストラクタをもったクラスはないよ。クラスメソッド・階層的なクラスの継承・仮想関数の替わりにGoにはこの後に詳しく説明するインターフェイスがあるよ。インターフェイスはC++でいうとテンプレートみたいなものだ。
- Goはガベージコレクションを使うよ。メモリーを明確にリリースする事は必要ないよ。ガベージコレクションは最近のプロセッサーではますます効果的になっているよ。
- GOはポインターを持ってるけど、加減算はできないよ。文字列の各バイトを順に調べるのにポインタの値を使う事はできないよ。
- Goの配列はファーストクラスの値です。配列が関数のパラメータとしてつかわれると、関数は配列のポインター(参照)ではなくコピーを受け取るよ。しかしながら、実用的な関数では、よくパラメータにスライスが使われるよ。スライスは配列の元になるポインタをもっているよ。スライスについてはあとで説明するね。
- 文字列が言語の機能にあるよ。文字列は生成されてから変更されないよ。
- ハッシュテーブルも言語の機能にあるよ。これらはマップと呼ばれているよ。
- チャンネルというスレッド間通信も言語の機能にあるよ。これについてはあとで説明するね。
- いくつかの型(map, channel, etc.)は値渡しではなく参照で渡されるよ。つまり、マップは関数に渡される時にコピーされないし、関数の中で変更されると、呼び出し側も変わるよ。C++でいうと参照型ですね。
- Goはヘッダファイルを使わないよ。かわりに、それぞれのソースファイルは定義されたパッケージの一部になるよ。パッケージが大文字から始まる名前のオブジェクト(型,定数,変数,関数)として定義されると、そのオブジェクトはそのパッケージをインポートした他のファイルからも見えるようになるよ。
- Go は 暗黙の型変換はしないよ。異なる型の変換にはキャストが必要ですよ(Goではコンバージョンとよびます)
- Go は関数のオーバーロードやユーザが定義できる演算子はないよ。
- Go にはconst や volatile制約はないよ。
- C++ではNULLや0だったけど、Go無効なポインタにはnilを使うよ。
以上:
あれ、C++ と Boost の組み合わせってやっぱ最強ですか。
追記1: 2009-11-12 20:27 tokuhiromさんのご指摘によりfirst class value を修正しました。多謝。
追記2: #interfaceの和訳を発見しました!。つづきはこちらで
ならって本稿のタイトルも修正しました。

コメント / トラックバック 2 件
> Arrays in Go are first class values.
ここは「Goでは配列はファーストクラスの値です」かと。
tokuhiromさん
ご指摘ありがとう御座います。修正させていただきました。
ファーストクラス
http://sky.zero.ad.jp/~zaa54437/programming/concepts/index3.htm#f0
コメントする