2010年07月27日
GoogleのGo言語のソースを見てみた
Googleの発表したプログラミング言語Goはソースが公開されています。
この言語の特徴などは他のサイトをみてもらうこととして、ここではソースをながめて気がついたことを紹介します。
(2009年12月の段階で書いたものを下書きのまま置いておいたのですが公開することにしました。もしかしたら内容が古くなっていることがあるかもしれません。)
2種類のGo
Goの処理系には2種類あるそうです。ひとつはPlan9由来のオリジナルのもので、もうひとつはgccのフロントエンドとして実装されたものです。
今回インストールしたのは前者のほうなので、ここではこちらをメインに紹介します。
なお、gccのフロントエンドとして実装されたものは現状(2009年12月の段階)では以下のような制限があるそうです。
- ガベージコレクションが実装されていない
- スレッドのスタックサイズは固定
- 同時に生成できるgoroutineの個数に制限がある
2010.7.30追記
インストール
まずはインストールです。
このページの手順に従ってソースを入手してビルドします。Ubuntu 9.04 (x86_64)のマシンで問題なくインストールすることができました。
ビルド自体はall.bashというシェルスクリプトで一発でしたが、そのログをみてみると以下のようなことをしていました。
- 前回の生成物を全て削除 (clean)
- gccでライブラリをビルド: lib9, libbio, libmach
- gccでツールチェインをビルド(上記のライブラリを使用)
- リンカ (6l)
- アセンブラ (6a)
- Cコンパイラ (6c)
- Goコンパイラ (6g)
- その他のコマンド (gopack, nm, cov, godefs, prof)
- Goのパッケージをビルド
- Goで書かれているファイルは6gでコンパイル
- Cで書かれているファイルは6cでコンパイル
- Goで書かれているコマンドのビルド
- テスト (各パッケージごとと全体)
このようにツールチェインからまるごと作っているわけですが、これだけのことがたったの2分で完了しました。
ソースを探検してみる
アセンブラ、リンカ、Cコンパイラは本当にシンプルなものでCコンパイラはたかだが30個のソースファイルです。
普通に見慣れているGNUのbinutils, gccのビルドに比べてあまりにシンプルすぎて不安になるほど。
これらは全てBSDライセンスで提供されているので、これらを修正して使ってもGPLのようにソース開示の義務は発生しません。
Cコンパイラは純粋のCでC++の拡張は入っていません。(gccはCとC++とobjetive Cなどを統合してしまっているのでCの部分でも相当の拡張が入っています。)
よく言えばまだ手垢にまみれていない、純粋なコードです。コンパイラの勉強をするにはちょうどいいかもしれません。