HHeLiBeXの日記 正道編

日々の記憶の記録とメモ‥

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)

いよいよインストール。
ビルドするには、gccC言語のライブラリ、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」と言われるだけ。ならなぜ分けているのだろう‥

参考リンク

いち早くUbuntu 9.10でのセットアップを試された方のブログ