The Go Blog
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人は、Goole以外の初のプロジェクトコミッターとなりました)。ARMポートも大きな進歩を遂げ、最近すべてのテストに合格するというマイルストーンに到達しました。
Goツールセットは拡張され、改善されました。Goドキュメンテーションツールであるgodocは、他のソースツリーのドキュメンテーション(自身のコードを閲覧・検索できます)をサポートし、チュートリアル資料を提示するための「コードウォーク」インターフェース(その他多くの改善点)を提供します。Goinstallは、新しいパッケージ管理ツールで、ユーザーが外部パッケージを単一のコマンドでインストールおよび更新できるようにします。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フロントエンドは、gcコンパイラと並行するGo実装として追随してきました。現在、動作するガベージコレクタを搭載し、GCCコアに採用されました。私たちは現在、gofrontendをBSDライセンスのGoコンパイラフロントエンドとして、GCCから完全に切り離して提供することを目指しています。
Goプロジェクト自体以外でも、Goは実際にソフトウェアを構築するために使われ始めています。私たちのプロジェクトダッシュボードには200以上のGoプログラムとライブラリがリストされており、Google CodeやGitHubにはさらに数百件あります。私たちのメーリングリストやIRCチャンネルでは、世界中のコーダーがGoをプログラミングプロジェクトに利用しているのを見つけることができます。(実際の例については、先月のゲストブログ記事をご覧ください。)Google社内では、本番ソフトウェア構築のためにGoを選択するいくつかのチームがあり、Goで大規模なシステムを開発している他の企業からも報告を受けています。また、Goを教育言語として使用しているいくつかの教育者とも連絡を取っています。
言語自体も成長し、成熟しました。この1年間で、私たちは多くの機能リクエストを受けました。しかしGoは小さな言語であり、新しい機能がシンプルさと有用性の適切な妥協点となるよう、懸命に努力してきました。ローンチ以来、私たちは多くの言語変更を行い、その多くはコミュニティからのフィードバックによって推進されました。
- ほとんどすべての場合でセミコロンは任意になりました。仕様
- 新しい組み込み関数
copyとappendは、スライスの管理をより効率的かつ簡単にする。 仕様 - サブスライスを作成する際、上限と下限を省略できるようになりました。これは、
s[:]がs[0:len(s)]の略記であることを意味します。 仕様 - 新しい組み込み関数
recoverは、エラー処理メカニズムとしてpanicとdeferを補完します。ブログ、仕様 - 新しい複素数型(
complex、complex64、complex128)は、特定の数学演算を簡素化します。仕様、仕様 - 複合リテラル構文により、冗長な型情報(たとえば、2次元配列を指定する場合)を省略できます。release.2010-10-27、spec
- 変数関数引数(
...T)とその伝播(v...)の一般的な構文が現在規定されています。仕様、 仕様、release.2010-09-29
Goは本番環境での利用に間違いなく対応していますが、改善の余地はまだあります。当面の私たちの焦点は、高性能システムにおいてGoプログラムをより高速かつ効率的にすることです。これは、ガベージコレクタの改善、生成コードの最適化、およびコアライブラリの改善を意味します。また、ジェネリックプログラミングを容易にするための型システムへのさらなる追加も検討しています。この1年間で多くのことが起こりました。それは刺激的で満足のいくものでした。私たちは、この来る1年が昨年よりもさらに実り多いものになることを願っています。
Goに[再び]取り組むことを考えているなら、今が絶好の機会です!詳細については、ドキュメントとGetting Startedページを確認するか、Go Playgroundで自由に試してみてください。
次の記事: Goスライス: 使い方と内部構造
前の記事: Goコードのデバッグ(進捗報告)
ブログインデックス