M.Hiroi's Home Page

Go Language Programming

[ Home ]

WHAT'S NEW


CONTENTS


お気楽 Go 言語プログラミング入門

CONTENTS

Puzzle DE Go!

Yet Another Golang Problems


はじめに

Go 言語は Google 社によって開発されているコンパイル形式の新しいプログラミング言語です。Go 言語はシンプルな言語仕様で、コンパイル・実行速度が速いといわれています。C++と違って Go 言語にはガベージコレクションがあり、クロージャや並列処理もサポートしています。クラスや継承といったオブジェクト指向機能はありませんが、構造体、メソッド、インターフェースを使って、オブジェクト指向プログラミングを行うことは可能です。使い方も簡単で、実行形式ファイルを作成するだけではなく、スクリプト言語のようにコンパイルしたあとすぐに実行することもできます。

ただし、Go 言語にはC言語で有名な「ポインタ」があります。プログラミング言語の学習には、どの言語にもいくつかの難関がありますが、C言語最大の難関がポインタと言われています。ポインタはコンピュータの基本 (特にメモリの概念) を正しく理解していれば、けっして難しい話ではありません。問題は、C言語のポインタが不適切な操作や演算によってプログラムを簡単に暴走させてしまうことです。そのてん、Go 言語のポインタはC言語のような危険な操作や演算が禁止されているので、C言語よりもずっと安全にポインタを使うことができます。

M.Hiroi は Go 言語でプログラミングするのは初めてです。Go 言語の特徴のひとつである goroutine と channel による並行プログラミングを目標に、簡単なプログラムを作りながら Go 言語を勉強していきたいと思っています。まあ、初心者が作るプログラムなので、Go 言語らしいプログラムは書けないと思います。間違いやお気づきの点がありましたらご指摘お願いいたします。たいしたことはできませんが、よろしければお付き合いくださいませ。

●ダウンロード

Go 言語は次のサイトからダウンロードできます。Windows 用のバイナリが用意されているので、とても簡単にインストールすることができます。

●簡単なベンチマーク

Go 言語はプログラムをネイティブコードにコンパイルするので、バイトコードにコンパイルする処理系よりもプログラムを高速に実行することができます。その実行速度ですが、たらいまわし関数を使って調べてみました。

リスト:たらいまわし関数 (Go 言語)

package main

import (
    "fmt"
    "time"
)

func tak(x, y, z int) int {
    if x <= y {
        return z
    } else {
        return tak(tak(x - 1, y, z), tak(y - 1, z, x), tak(z - 1, x, y))
    }
}

func main() {
    s := time.Now()
    fmt.Println(tak(22, 11, 0))
    e := time.Now().Sub(s)
    fmt.Println(e)
}

ファイル名を tak.go とすると、シェル上で次のように入力すると実行ファイル tak.exe を生成することができます。

C>go build tak.go

また、build のかわりに run を指定すると、プログラムをコンパイルしたあと、実行形式ファイルを作らないですぐに実行することができます。

C>go run tarai.go
11
1.9861136s

それでは実行結果を示します。tak(22, 11, 0) を計算しました。使用した Go 言語のバージョンは 1.2 です。比較のため、GCC (C言語), SML/NJ, SBCL (Common Lisp), OCaml (ocamlopt), Haskell (GHC) の実行結果を示します。いずれの処理系もプログラムをネイティブコードにコンパイルするものです。

表 : tak(22, 11, 0) の結果
処理系
SBCL (ver 1.0.55)5.85
SML/NJ (ver 110.74)3.48
GCC -O (ver 4.5.3)2.37
SBCL (最適化)2.01
Go (ver 1.2)1.98
GHC -O (ver 7.4.1)1.92
GCC -O2 (ver 4.5.3)1.89
ocamlopt (ver 3.12.1)1.09

Go 言語は SML/NJ や SBCL よりも速い結果になりましたが、OCaml にはかないませんでした。それでも、GCC や Haskell と同程度の速度をたたき出しているのですから、Go 言語は大変優れたコンパイラ (処理系) だと思います。


参考 URL

  1. The Go Programming Language (本家)
  2. golang.jp - プログラミング言語Goの情報サイト
  3. A Tour of Go (チュートリアル, 日本語版)

権利・免責事項など

『お気楽 Go 言語プログラミング入門』の著作権は筆者「広井誠 (Makoto Hiroi) 」が保持します。無断使用や無断転載は禁止いたします。『お気楽 Go 言語プログラミング入門』で作成したプログラムはフリーソフトウェアとします。ご自由にお使いください。プログラムの改造や配布もご自由にどうぞ。その際は、出典を明記してくださるようお願いいたします。

ただし、これらのプログラムは無保証であり、使用したことにより生じた損害について、作者「広井誠 (Makoto Hiroi) 」は一切の責任を負いません。また、これらのプログラムを販売することで利益を得るといった商行為は禁止いたします。

Copyright (C) 2014 Makoto Hiroi
All rights reserved.

[ Home ]