2009年11月11日水曜日

はてなに追加 MyYahoo!に追加 Googleに追加 del.icio.usに追加 livedoorClipに追加 Buzzurlに追加 Ubuntu Linux 9.10 でGo言語(Go Programming Language)

またまたGoogleさんがやってくれました。

Go Programming Language

プログラミング言語ですか。。
この前、JavaScriptアプリ開発ツール「Closure」を出してビックリしたのに。

とりあえず、どんな言語か
言語の基本Hello world
まで触って見ました。

開発環境
OS: Ubuntu Linux 9.10
CPU: Atom N280

<インストール>
Install Go
を参考に
作業+インストールディレクトリ作成
とりあえず自分はホームディレクトリ以下に
% tree work -d -L 1
work
|-- bin
|-- dev
`-- go
こんな感じでwork以下に作りました

環境変数
設定した項目は
  • GOROOT(goのroot)
  • GOOS(使用するOS)

    • Linux系ならlinux, Macならdarwin, それ以外(?)nacl

  • GOARCH(使用するCPU)

    • 64bit x86ならamd64、32bit x86なら386、32bitARMなら、arm

  • GOBIN(go バイナリの位置)
  • PATH (パス)
ということで自分の設定値
export GOROOT=$HOME/work/go
export GOOS=linux
export GOARCH=386
export GOBIN=$HOME/work/bin
export PATH=$GOBIN:$PATH
こいつらを.zshrcに追加

<ソース取得>
と、その前に
mercurialなるものをインストール。
実はこのmercurial って知りませんでした。
git, cvs, svn見たいなものって考えていいんですよね?w

sudo apt-get install mercurial

ソースコードをチェックアウト
$ hg clone -r release https://go.googlecode.com/hg/ $GOROOT

<インストール> 
と、その前に必要なパッケージを入れる

sudo apt-get install bison gcc libc6-dev ed
ってマニュアルには書いてましたが、自分の環境で新たにインストールされたのはbisonのみでした

後はインストール

$ cd $GOROOT/src
$ ./all.bash
結構時間かかります
これで開発環境完成。

後は、動かしてみる。

Hello World
tutorialページにあったものをそのまま。 先ほど作った ~/work/dev 以下に hello.goを作る
package main

import "fmt"

func main() {
fmt.Printf("Hello, world; or Καλημέρα κόσμε; or こんにちは 世界\n");
}
コンパイル
環境変数で386を選択したので
 8g hello.go
それ以外はこんな感じ
amd64 (a.k.a. x86-64); 6g,6l,6c,6a
The most mature implementation. The compiler has an effective optimizer (registerizer) and generates good code (although gccgo can do noticeably better sometimes).
386 (a.k.a. x86 or x86-32); 8g,8l,8c,8a
Comparable to the amd64 port. Not as well soaked but should be nearly as solid.
arm (a.k.a. ARM); 5g,5l,5c,5a
It's got a couple of outstanding bugs but is improving. Tested against QEMU and an android phone.
ファイルとリンク
8l hello.8
実行
caraml-laptop% ./8.out 
Hello, world; or Καλημέρα κόσμε; or こんにちは 世界

echo
もう一つ簡単そうなものから、これもtutorialより
package main

import (
        "os";
        "flag"; // command line option parser
        )

  var omitNewline = flag.Bool("n", false, "don't print final newline")

const (
       Space = " ";
       Newline = "\n";
       )

  func main() {
  flag.Parse(); // Scans the arg list and sets up flags
  var s string = "";
  for i := 0; i < flag.NArg(); i++ {
    if i > 0 {
 s += Space
          }
    s += flag.Arg(i)
      }
  if !*omitNewline {
     s += Newline
      }
   os.Stdout.WriteString(s);
 }
コンパイル&リンク&実行
caraml-laptop% 8g echo.go
caraml-laptop% 8l -o echo echo.8
caraml-laptop% ./echo hoge
hoge
caraml-laptop% 
すげー簡単というか、取っ付きやすい

マニュアルにもGo For C++ Programmersってあるように
C++を知っている人はすんなり移行できるように作ってあるのかもしれません。
あいにく自分は今までC++を読んだ事はあっても、書いた事は無いのですが、
C言語の知識でも雰囲気はつかめました。

Go                           C++
var v1 int;               // int v1;
var v2 string;            // const std::string v2;  (approximately)
var v3 [10]int;           // int v3[10];
var v4 []int;             // int* v4;  (approximately)
var v5 struct { f int };  // struct { int f; } v5;
var v6 *int;              // int* v6;  (but no pointer arithmetic)
var v7 map[string]int;    // unordered_map* v7;  (approximately)
var v8 func(a int) int;   // int (*v8)(int a);
変数の宣言は順番が異なるらしく
CとかC++は
型 変数名
だったのが
変数名 型
になってます
Type declarations may be read easily from left to right.
って書いてあるけど。 何となくですが、JavaScriptのような、C++のような。。 しばらく触ってみたいと思います

0 件のコメント:

コメントを投稿