Goブログ
Go:1年前の今日
2009年11月10日、私たちはGoプロジェクトを開始しました。シンプルさと効率性を重視したオープンソースのプログラミング言語です。この1年間で、Goプロジェクト自体とコミュニティの両方で多くの開発が行われました。
私たちはシステムプログラミングのための言語、つまりCやC++で通常記述するようなプログラムを構築することを目指していましたが、Goが汎用言語としても有用であることに驚きました。C、C++、Javaプログラマーからの関心を予想していましたが、PythonやJavaScriptなどの動的型付け言語のユーザーからの関心の高まりは予想外でした。Goのネイティブコンパイル、静的型付け、メモリ管理、軽量構文の組み合わせは、プログラミングコミュニティの幅広い層に共感を呼んだようです。
その幅広い層は、熱心なGoコーダーの献身的なコミュニティへと成長しました。私たちのメーリングリストには3,800人を超えるメンバーがおり、毎月約1,500件の投稿があります。このプロジェクトには130人を超える貢献者(コードやドキュメントを提出した人)がおり、開始以降の2,800件のコミットのうち、約3分の1はコアチーム以外のプログラマーによって貢献されました。そのすべてのコードを整理するために、私たちの開発メーリングリストで約14,000件のメールが交換されました。
これらの数値は、プロジェクトのコードベースに明確に示されている成果を反映しています。コンパイラは大幅に改善され、より高速で効率的なコード生成、100件以上の報告されたバグの修正、およびより広範囲のオペレーティングシステムとアーキテクチャのサポートが実現しました。Windowsポートは、献身的な貢献者グループ(そのうちの1人がプロジェクトの最初のGoogle以外のコミッターになりました)のおかげで完成に近づいています。ARMポートも大きな進歩を遂げ、最近すべてのテストに合格するというマイルストーンに到達しました。
Goツールセットは拡張および改善されました。godocであるGoドキュメントツールは、他のソースツリーのドキュメントをサポートするようになりました(独自のコードを参照して検索できます)また、チュートリアル資料を提示するための“コードウォーク”インターフェースを提供します(多くの改善点の中でも)。新しいパッケージ管理ツールであるgoinstallを使用すると、1つのコマンドで外部パッケージをインストールおよび更新できます。gofmtであるGoプリティプリンターは、可能な場合は構文の簡素化を行います。Goplayは、ウェブベースの「入力時にコンパイル」ツールであり、Go Playgroundにアクセスできない場合にGoを試す便利な方法です。
標準ライブラリは42,000行以上のコードが増加し、20個の新しいパッケージが含まれるようになりました。追加されたものとしては、jpeg、jsonrpc、mime、netchan、smtpパッケージ、および多数の新しい暗号化パッケージなどがあります。より一般的には、Goのイディオムに関する理解が深まるにつれて、標準ライブラリは継続的に改良および改訂されてきました。
デバッグも改善されました。gcコンパイラのDWARF出力の最近の改善により、GNUデバッガーであるGDBがGoバイナリで有用になり、そのデバッグ情報をより完全なものにするための作業を積極的に行っています。(詳細は最近のブログ記事を参照してください。)
Go以外の言語で記述された既存のライブラリにリンクすることがこれまで以上に容易になりました。Goのサポートは最新のSWIGリリース(バージョン2.0.1)に含まれており、CおよびC++コードへのリンクが容易になり、cgoツールには多くの修正と改善が加えられています。
gccgoであるGNU CコンパイラのGoフロントエンドは、並列Go実装としてgcコンパイラと歩調を合わせてきました。これで動作するガベージコレクタが備わり、GCCコアに受け入れられました。現在、gofrontendを、GCCから完全に切り離されたBSDライセンスのGoコンパイラフロントエンドとして提供できるように取り組んでいます。
Goプロジェクトの外では、Goが実際のソフトウェアの構築に使用され始めています。私たちのプロジェクトダッシュボードには200以上のGoプログラムとライブラリがリストされており、Google CodeとGitHubにはさらに数百ものプログラムとライブラリがあります。私たちのメーリングリストとIRCチャンネルでは、プログラミングプロジェクトにGoを使用している世界中のコーダーを見つけることができます。(先月のゲストブログ記事で、現実世界の例を参照してください。)Google内部には、本番ソフトウェアの構築にGoを選択するいくつかのチームがあり、他の企業からもGoで大規模なシステムを開発しているという報告を受けています。また、Goを教育言語として使用している多くの教育者とも連絡を取っています。
言語自体も成長し、成熟しました。昨年は多くの機能要求を受けました。しかし、Goは小さな言語であり、新しい機能がシンプルさと有用性のバランスを適切に保つように努力してきました。開始以来、多くの言語の変更が行われ、その多くはコミュニティからのフィードバックに基づいて行われました。
- セミコロンはほとんどの場合省略可能になりました。仕様
- 新しい組み込み関数
copy
とappend
により、スライスの管理がより効率的で簡単になりました。仕様 - サブスライスを作成する場合、上限と下限は省略できます。つまり、
s[:]
はs[0:len(s)]
の略記です。仕様 - 新しい組み込み関数
recover
は、エラー処理メカニズムとしてpanic
とdefer
を補完します。ブログ、仕様 - 新しい複素数型(
complex
、complex64
、complex128
)により、特定の数学演算が簡素化されます。仕様、仕様 - 複合リテラル構文により、冗長な型情報の省略が可能になりました(2次元配列を指定する場合など)。release.2010-10-27、仕様
- 可変関数引数(
...T
)とその伝播(v...
)の一般的な構文が指定されるようになりました。仕様、仕様、release.2010-09-29
Goは確かに本番使用の準備ができていますが、まだ改善の余地があります。当面の焦点は、高性能システムのコンテキストでGoプログラムをより高速で効率的にすることです。つまり、ガベージコレクターの改善、生成されたコードの最適化、コアライブラリの改善です。ジェネリックプログラミングを容易にするために、型システムへのさらなる追加についても検討しています。1年間で多くのことが起こりました。それはスリリングであり、同時に満足のいくものでした。来年の成果が今年よりもさらに大きくなることを願っています。
Goに[戻って]取り組むことを検討しているなら、今が最適な時期です!詳細については、ドキュメントと入門のページをご覧ください。または、Go Playgroundで自由に試してみてください。
次の記事:Goスライス:使用方法と内部動作
前の記事:Goコードのデバッグ(状況報告)
ブログ索引