2009年11月11日水曜日

New programming language "Go"

Googleによる新しい言語Go

128x128 png
md5:daf1d775653ae401c8f3d88241762e1e

公式: The Go Programming Language
http://golang.org/
プログラミング言語 Go ドキュメント — golang_docjp v0.1 documentation
http://go.shibu.jp/
関連資料の日本語訳projectがあるっぽい。

Installing Go
http://golang.org/doc/install.html
-環境変数の設定
-Mercurialによるsourceの取得
-compile
-hello, world
の流れ。i386の人はhello, worldのtutorialは6gではなく8gで。
YouTube - The Go Programming Language
http://www.youtube.com/watch?v=rKnDgT73v8s

Ubuntu 9.10(i386)の~/.bashrcの例
export GOROOT="$HOME/dev/go"
export GOOS="linux"
export GOARCH="386"

$GOBINは指定しなければ$HOME/binで、defaultでは存在しないが$HOME/binがあればそこにPATHが自動的に通るようになっているので作っている人は少なくない筈。hello,worldだけのbinaryで500kB以上になるけれども、goを入れていないlinux machineにそのbinaryだけを移動させても当然ながら動作する。

確かにcodeは書きやすいがIDEやtest suiteが無い事を考えると自身の職務領域において必要な技術を究めた人間が使ってみるには良いが、初学者~中級者にとってはまだ手を出さない方が投資する時間と得られる効果という観点から良いのではないかと。simpleで実用的なsample codeやtutorialが世に溢れるまでは様子見を推奨。RubyよりもむしろScalaに手を出そうという類の人にはいいかもしれない。

sample codeはhttp://golang.org/doc/progs/
で、それらのcodeをcopy&pasteして
http://www1.atwiki.com/salvan-linux?cmd=upload&act=open&pageid=27&file=go.tar.bz2
に詰め合わせた。

そしてtutorialの頭だけ意訳した。

はじめに

この文書はプログラミング言語Go(以下Go)の入門書であり、Goに関する基本的な事柄を説明します。C言語やC++に精通したプログラマーを対象とし、包括的な内容とはなっていません。現時点では
言語仕様」に類する内容になっています。
この入門書を読んだ後に
効果的なGoの書き方」を読む事をお勧めします。
Goの利用についてより深く掘り下げた内容となっています。
また、スライドによる3日間の学習コースも提供しています。
1日目
2日目
3日目」をご覧下さい。

ここではいくつかのサンプルコードを用いてGoの特徴について解説します。動作確認済みのコードについてはリポジトリ/doc/progs/をご覧下さい。

ここで紹介するコードは上記のサンプルコードに行番号をつけたものです。空行については空白にしています。

Hello, World

お決まりの方法から見ていきましょう。


05    package main

07 import fmt "fmt" // Package implementing formatted I/O.

09 func main() { 10 fmt.Printf("Hello, world; or Καλημέρα κόσμε; or こんにちは 世界\n"); 11 }

Goの全てのソースファイルは、そのソースがどのパッケージ(package)の一部なのかという宣言から始まります。
また、必要とする機能を備えた他のパッケージの読み込みも宣言します。
このコードではfmtパッケージを読み込んでおり、パッケージ名-キャメル記法で修飾されたfmt.Printfメソッドを利用しています。

関数はfuncキーワードで宣言します。
初期化処理の後、mainパッケージのmain関数からプログラムは実行されます。

文字列定数にはUTF-8でエンコードされたUnicodeキャラクターを含める事が出来ます(実際には、GoのソースファイルはUTF-8でエンコードします)。

コメントの記法はC++と同じです。

/* ... */
    // ...

(printingについては)後ほど詳しく解説します。

コンパイル

Goはコンパイラ型言語です。現時点では2つのコンパイラが用意されています。
GccgoはバックエンドにGCCを利用するGoのコンパイラです。
もう一つのコンパイラ(群)は異なるCPUアーキテクチャにちなんだ名前になっています。
6gは64-bit x86用、8gは32-bit x86用、その他。
これらのコンパイラはgccgoよりも大幅に短い時間でより効率的なコードを生成します。
この記事の執筆時点(2009年の終わり)ではgccgoもまた、より堅牢性を増してきています。

ここではどのようにコードをコンパイルし、プログラムを実行するかを紹介します。6gの場合です。

$ 6g helloworld.go  # コンパイルします。helloworld.6が出来上がります。
    $ 6l helloworld.6   # ライブラリをリンクします。6.outが出来上がります。
    $ 6.out
    Hello, world; or Καλημέρα κόσμε; or こんにちは 世界
    $

gccgoではより伝統的な方法に見えます。

$ gccgo helloworld.go
    $ a.out
    Hello, world; or Καλημέρα κόσμε; or こんにちは 世界
    $

Echo

次はUNIXコマンドのecho(1)を作成します。


05    package main

07 import ( 08 "os"; 09 "flag"; // command line option parser 10 )

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

14 const ( 15 Space = " "; 16 Newline = "\n"; 17 )

19 func main() { 20 flag.Parse(); // Scans the arg list and sets up flags 21 var s string = ""; 22 for i := 0; i < flag.NArg(); i++ { 23 if i > 0 { 24 s += Space 25 } 26 s += flag.Arg(i) 27 } 28 if !*omitNewline { 29 s += Newline 30 } 31 os.Stdout.WriteString(s); 32 }

このプログラムは小さいながらもいくつかの新しい要素が含まれています。
前の例で私たちはfuncが関数の宣言である事を知っています。
新しいキーワードvarconsttype
(未使用)はimport同様、宣言に使われます。
これらは必要に応じて括弧で囲み、セミコロンで区切る事でまとめて宣言する事が出来ます。
7行目~10行目、14行目~17行目にかけてがそうです。
セミコロンを必要としない方法もあります。

const Space = " "
    const Newline = "\n"

この例ではセミコロンは必要ありません。括弧で囲まれていない、トップレベルの宣言では
セミコロンによる分割は不要です。

このプログラムで読み込んだ"os"パッケージは*os.File型の変数Stdoutの操作に使われます。
import文(statement)は実際には宣言(declaration)です。
「hello world」プログラムで使われたパッケージの識別子「fmt」は同じディレクトリか、或いは規程の場所にある
ファイル「"fmt"」のメンバーにアクセスする為に使われます。
このプログラムではimportするpackageの場所を明示的に指定していませんが
使用するファイル名そのものをimportするpackageとして指定するのが通例です。
この文書における「hello world」プログラムではimport "fmt"としています。

パッケージ名の衝突を避ける為に必要に応じて使い分ける事が出来ます。

文字列を出力するWriteStringメソッドを利用する為にos.Stdoutと指定する事が出来ます。

flagパッケージを読み込み, 12行目のグローバル変数の生成によりオプションの-nフラグを管理します。変数omitNewline*boolで、bool値のポインタとします。

main.mainでは、引数の解析(20行目)をし、ローカル変数に文字列として代入し、出力に使います。

文字列用の変数の宣言は以下のようになります。

var s string = "";

varキーワードに、変数の名前、変数の型、「=」の後にその変数の初期値が続きます。

Goではより簡潔に書く事が出来ます。文字列定数はコンパイラにそれが文字列である事を指定する必要はありません。
以下のように書いたり、

var s = "";

さらに短く書く事が出来ます。

s := "";

:=」演算子は変数の宣言時に値を初期化する為に使います。
for文での例は以下のようになります。


22        for i := 0; i < flag.NArg(); i++ {

flagパッケージによって引数を解析し、引数の中のフラグではない値についても明解な方法で処理する事が出来ます。

Goのfor文はC言語とは異なる意味を持ちます。
まず、これがループ処理用の唯一の構造だという事です。
while文やdo文は存在しません。
次に、式を括弧で囲みません。しかし、処理の内容については波括弧で囲む必要があります。
これらのルールはif文やswitch文にも摘要されます。
前述のサンプルコードでのfor文についていくつか説明をします。
ループ処理の中では、変数sに対して引数の各文字列を空白文字で区切りながら、式+=を使って追加しています。
もし-nフラグが設定されていない場合、プログラムはループ処理の後に改行を追加します。
最後に処理の結果を出力します。

このmain.mainは引数を持たず、返値もありません。そのように定義されています。
main.mainの終了はすなわち処理が正常に終了した事を意味します。
もし、エラー処理を行いたい場合は以下のように書いて下さい。

os.Exit(1)

osパッケージにはそのような処理に必要な様々な機能が含まれています。
例えばos.Argsflagパッケージがコマンドライン引数を処理する際に使われています。


参考
シンプルで高速、Googleの新プログラミング言語「Go」 | エンタープライズ | マイコミジャーナル
http://journal.mycom.co.jp/news/2009/11/11/025/index.html

GoogleがUNIX作者らが開発した新言語「Go」をオープンソースとして公開 - ニュース:ITpro
http://itpro.nikkeibp.co.jp/article/NEWS/20091111/340273/

Google、オープンソースのプログラミング言語「Go」リリース - ITmedia エンタープライズ
http://www.itmedia.co.jp/enterprise/articles/0911/11/news041.html

Googleの新しいプログラミング言語Go == Python(開発が速い) + C++(実行速度が速い)
http://jp.techcrunch.com/archives/20091110google-go-language/
-多重処理と、オブジェクト指向設計に対するまったく新しい軽量級の取り組みをサポート
-真のクロージャやリフレクションといった先端的機能をいくつか持つ

グーグル、オープンソースのプログラミング言語「Go」を発表:ニュースクリップ - CNET Japan
http://japan.cnet.com/clip/global/story/0,3800097347,20403335,00.htm
-ウェブブラウザ内でも使用可能にするなどの汎用性を備えている
-オブジェクト指向プログラミングが持つ問題点を緩和するためのアプローチが取られている
-Pythonのようなダイナミック言語で作業する場合の開発速度
-CやC++といったコンパイラ型言語のようなパフォーマンスと安全性を兼ね備えている

グーグル、新たなプログラミング言語「Go」をオープンソースとして公開 : Googleウォッチ - Computerworld.jp
http://www.computerworld.jp/topics/google/167190.html
-目的は、ライブラリなどとの依存関係を管理する仕組みを改善すること
-マルチプロセッサ処理の扱いにすぐれている
-以前からGoogle社内でテストされてきた
-現時点でまだ発展途上の言語
-まだ実験段階から抜け出せないでいる
-Googleのサービスやアプリケーションには使われていない
-今後の開発にオープンソース・コミュニティの力を借りる

0 件のコメント:

コメントを投稿