The Go Programming Languageで"Hello, 世界"
先を越された感が満載(謎)だが、めげずに自分の手を動かす。
2009年11月11日に、Googleからプログラミング言語「Go」が発表された。
The Go Programming Language
ということで、手元のUbuntu 8.04 (VMwareのゲストOS)の環境で試してみる。
とりあえずは、トップページからたどれるGetting Started - The Go Programming Languageに書いてある手順を一通り。
ここからは退屈な(!)コマンド履歴メモ。
セットアップから実行まで
環境設定 (Environment variables)
.bashrc に次の設定を追加する。
export GOROOT=${HOME}/goTest/go export GOARCH=386 export GOOS=linux # The GOBIN variable is optional export GOBIN=${HOME}/goTest/bin export PATH=${PATH}:${GOBIN}
確認。
$ env | grep '^GO' GOBIN=/home/hhelibex/goTest/bin GOARCH=386 GOROOT=/home/hhelibex/goTest/go GOOS=linux $
さらに、環境変数GOROOT、GOBINに設定したディレクトリはあらかじめ作成しておく必要があるので、ここで作成しておく。
$ mkdir -p ${GOROOT} $ mkdir -p ${GOBIN} $
ソースの取得 (Fetch the repository)
ソースを取得するには、Mercurialが必要なのでインストール。
$ sudo apt-get install mercurial パッケージリストを読み込んでいます... 完了 依存関係ツリーを作成しています 状態情報を読み取っています... 完了 提案パッケージ: python-elementtree qct tk8.4 wish 推奨パッケージ: rcs kdiff3 tkdiff meld 以下のパッケージが新たにインストールされます: mercurial アップグレード: 0 個、新規インストール: 1 個、削除: 0 個、保留: 0 個。 467kB 中 0B のアーカイブを取得する必要があります。 この操作後に追加で 2318kB のディスク容量が消費されます。 未選択パッケージ mercurial を選択しています。 (データベースを読み込んでいます ... 現在 159668 個のファイルとディレクトリがインストールされています。) (.../mercurial_0.9.5-3_i386.deb から) mercurial を展開しています... mercurial (0.9.5-3) を設定しています ... $
リポジトリからソースを取得する。
$ hg clone -r release https://go.googlecode.com/hg/ $GOROOT requesting all changes adding changesets adding manifests adding file changes added 4016 changesets with 16888 changes to 2931 files 1640 files updated, 0 files merged, 0 files removed, 0 files unresolved $
Goのインストール (Install Go)
いよいよインストール。
ビルドするには、gcc、C言語のライブラリ、Bison(パーサージェネレータ)、make、ed(テキストエディタ)が必要なので、先にそれらをインストール。
$ sudo apt-get install bison gcc libc6-dev ed make パッケージリストを読み込んでいます... 完了 依存関係ツリーを作成しています 状態情報を読み取っています... 完了 gcc はすでに最新バージョンです。 libc6-dev はすでに最新バージョンです。 libc6-dev は手動でインストールしたと設定されました。 ed はすでに最新バージョンです。 make はすでに最新バージョンです。 以下の特別パッケージがインストールされます: m4 提案パッケージ: bison-doc 以下のパッケージが新たにインストールされます: bison m4 アップグレード: 0 個、新規インストール: 2 個、削除: 0 個、保留: 0 個。 553kB のアーカイブを取得する必要があります。 この操作後に追加で 1913kB のディスク容量が消費されます。 続行しますか [Y/n]? y 取得:1 http://ubuntutym.u-toyama.ac.jp hardy/main m4 1.4.10-1 [207kB] 取得:2 http://ubuntutym.u-toyama.ac.jp hardy/main bison 1:2.3.dfsg-5 [347kB] 553kB を 0s で取得しました (759kB/s) 未選択パッケージ m4 を選択しています。 (データベースを読み込んでいます ... 現在 159914 個のファイルとディレクトリがインストールされています。) (.../archives/m4_1.4.10-1_i386.deb から) m4 を展開しています... 未選択パッケージ bison を選択しています。 (.../bison_1%3a2.3.dfsg-5_i386.deb から) bison を展開しています... m4 (1.4.10-1) を設定しています ... bison (1:2.3.dfsg-5) を設定しています ... $
続いてビルド。
$ cd ${GOROOT}/src $ ./all.bash rm -f *.o *.6 6.out lib9.a (あまりに長いので3791行を省略) --- cd ../test 0 known bugs; 0 unexpected bugs $
「unexpected bugs」が0 (zero)であればOK。
プログラムの作成(Writing programs)
まず最初に「識別子」の話が書いてある。
GOARCH | 識別子 | コンパイルコマンド | リンクコマンド | オブジェクトファイル名 | 実行可能ファイル名 |
386 | 8 | 8g | 8l | <ベース名>.8 | 8.out |
amd64 | 6 | 6g | 6l | <ベース名>.6 | 6.out |
arm | 5 | 5g | 5l | <ベース名>.5 | 5.out |
例えば、自分の環境はi386環境なので、
- GOARCH は 386
- 「8g file.go」でコンパイル
- 「8l file.8」でリンク
- 実行可能ファイル「8.out」が生成される
という感じ。
サンプルとして、次のコードを作成。ファイル名は"hello.go"。
ファイルの文字エンコーディングはUTF-8にする必要がある。
package main import "fmt" func main() { fmt.Printf("Hello, 世界\n") }
で、コンパイル、リンク&実行。
$ 8g hello.go $ 8l hello.8 $ ./8.out Hello, 世界 $
雑感
- なんか、C言語でプログラムを書いていた学生のころを思い出した。
- やっぱりセミコロンを書かないと落ち着かないなぁ(ぉ
- 「6g」とか「5g」とか打っても「command not found」と言われるだけ。ならなぜ分けているのだろう‥