日本は惜しくも、コパ・アメリカ敗退しちゃいましたね、、。あとは、僕の楽しみとしてはメッシが機能していないアルゼンチンを応援する事ぐらいです。明日のブラジル戦、、、果たしてどうなるのか?乞うGo期待!、、、おっと、、、今回のテーマのせいで、変換が上手くいきませんでしたね。
Go言語とはなんなのか
Goはプログラミング言語の1つである。2009年、GoogleでRobert Griesemer、ロブ・パイク、ケン・トンプソンによって設計された。Goは、静的型付け、C言語の伝統に則ったコンパイル言語、メモリ安全性(英語版)、ガベージコレクション、構造的型付け(英語版)、CSPスタイルの並行性などの特徴を持つ。Goのコンパイラ、ツール、およびソースコードは、すべてフリーかつオープンソースである。
また、軽量スレッディングのための機能、Pythonのような動的型付け言語のようなプログラミングの容易性、などの特徴もある。Go処理系としてはコンパイラのみが開発されている。マスコット・キャラクターはGopher(ホリネズミ)
引用:wikipedia
wikipediaから引用しましたが、注目して欲しいのはこれです「マスコット・キャラクターはGopher(ホリネズミ)」
どんな姿かというと、、、。
どうでしょうか?美大の一年生がインスタントラーメンの待ち時間に書いたぐらいのユルさは。今回の記事ではGo言語の事も少し書くのですが、本当に注目して欲しかったのは「コンパイル言語」の部分です。
スクールではpython(パイソン)を主に教えていますが、pythonは「スクリプト言語」と呼ばれるものです。今回は「コンパイル言語」と「スクリプト言語」の違いについてざっくり説明していきます。
コンパイル言語とスクリプト言語の違い
プログラミングとはプログラムにさせたい処理をC,Java, python, php等のプログラミング言語で書くことです。コンピュータはプログラミング言語で書かれた手順に沿って動作します。つまりコンピュータへの手順書を作る作業がプログラミングになります。この手順書を作成する言語をざっくり分けるとコンパイル言語とスクリプト言語に分類することができます。「コンパイル言語かスクリプト言語か」今巷を騒がせているローランド風な言い回しが決まったところで、深く解説していきましょう。
スクリプト言語とは逐次翻訳型のイメージ
スクリプト言語で代表的なものはjavascript, python, php等でみなさんもよく目にするものがたくさんあります。スクリプト言語の定義はいくつかありますが、一言で表すならば「逐次マシン語に変換して実行される言語」です。プログラミングはコンピュータの処理内容を記述したものですが、コンピュータはプログラミングで書かれた言葉をそのまま認識することはできません。下のようなプログラムで書かれた命令は
1 |
print("HelloWorld") |
コンピュータの内部では次のような0と1の羅列に変換され実行されます。
1 |
0101010101010101010101111001001.... |
実はコンピュータは1と0の並びしか処理できません!!。
あなたが読んでいるこのページもいつもみているユーチューブもTwitterやインスタの画像もパソコンの中では0と1の並びで認識されています。話はそれましたが、スクリプト言語と言うものはプログラムで書かれた1行を随時マシン語の0又は1に変換して実行します。同時通訳で1行1行パソコンに処理内容を伝えているイメージです。
コンパイル言語とは一括翻訳のイメージ
スクリプト言語は大体イメージできたと思います。次にコンパイル言語ですが、まとめて一括翻訳のイメージです。命令を書き、処理手順を全て翻訳したのち、翻訳結果をコンピュータに処理してもらいます。
代表的なものはC, Java, Go等です。
スクリプト言語とコンパイル言語のメリットとデメリット
スクリプト言語とコンパイル言語にはそれぞれメリットとデメリットがあります。
スクリプト言語
メリット | デメリット |
環境構築が比較的容易 | 実行速度が遅い |
プログラムの記述ルールが緩い(デメリット?) |
コンパイル言語
メリット | デメリット |
環境構築に手間がかかる | |
実行速度が高速 | プログラムの記述ルールが厳しい(メリット) |
スクリプト言語は「同時翻訳」しながらコンピュータに処理をお願いするため、どうしても
処理に時間がかかってしまいますが、変数の作成時に型の明示が不要だったりと
比較的記述しやすいという特徴があります。
一方コンパイル言語は記述方法が厳密であり、また開発環境を整えるのにすこし手間が
かかりますが、一括でマシン語に変換してコンピュータに処理させるため処理を高速で行える
という特徴があります。
コンパイル言語のGo言語で円周率を近似してみる
ここまで色々書いてきましたが、冒頭で紹介したGo言語は「コンパイル言語」です。高速で処理を行うことができます。前回の記事でpythonで円周率を近似しましたが、そのプログラムをGo言語で書いたらどれくらいスピードが違うか確かめてみましょう。Go言語で作成したプログラムは次のようになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
package main import ( "fmt" "math/rand" "time" "strconv" ) func main() { point := 0 N := 100 repeat := 6 start := time.Now() x:=0.0 y:=0.0 pi:=0.0 rand.Seed(time.Now().UnixNano()) for count := 0; count < repeat; count++ { N *= 10 point = 0 for i := 0; i < N; i++ { x = rand.Float64() y = rand.Float64() if x*x + y*y < 1.0 { point += 1 } // 円周率の近似解 pi = 4.0 * float64(point) / float64(N) } end := time.Now() fmt.Println("N="+ strconv.Itoa(N) + " \t" + "pi="+ strconv.FormatFloat(pi,'f', 10, 64) + " \t " + "time =" + strconv.FormatFloat(end.Sub(start).Seconds(),'f', 4, 64) ) } } |
実行結果は次の通りです。
1 2 3 4 5 |
N=1000 pi=3.1080000000 time =0.0001 N=10000 pi=3.1688000000 time =0.0012 N=100000 pi=3.1364800000 time =0.0098 N=1000000 pi=3.1423720000 time =0.0966 N=10000000 pi=3.1412880000 time =0.9523 |
ちなみにpythonの実行結果はこれです。
1 2 3 4 5 |
N=1000 pi=3.188 time=0.0013 N=10000 pi=3.1612 time=0.015 N=100000 pi=3.14284 time=0.14 N=1000000 pi=3.138936 time=1.39 N=10000000 pi=3.14151 time=13.65 |
1千万回の試行回数では10倍近い差が生まれています。
コンパイル言語のGoがとても早いのがわかります。
なぜスクリプト言語のpythonが機械学習で利用されるのか
皆さんはこう思ったはずです。なぜに、処理の遅いpythonがなぜ複雑な処理が多い機械学習等に多く利用されているか?これは
pythonに機械学習に必要な複雑な計算をしてくれる機能(ライブラリ)が関係していますpythonでは機械学習等で利用される学術系のライブラリ群がとても充実しており、また、それらの複雑な計算を行うライブラリはC/C++等のコンパイル言語で作成され、高速に動作するためです。
ということでpythonでライブラリを利用して円周率を近似するプログラムを再度実行してみます。プログラムは次の通りです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
import numpy import time N = 100 repeat = 5 start = time.time() for count in range(repeat): N = N * 10 #ランダムなN個の要素をもつ配列を作成(x軸値) x = numpy.random.rand(1, N) #x値のランダム値を2乗する xx = numpy.power(x, 2) #ランダムなN個の要素をもつ配列を作成(y軸値) y = numpy.random.rand(1, N) #y値のランダム値を2乗する yy = numpy.power(y, 2) #xxとyyの各要素を加算する r = xx + yy #加算結果が1以下のものを取り出す pointArray = r[r < 1] #piの算出 pi = 4.0 * pointArray.size / N #表示 process_time = time.time() - start print('N=' + str(N) + " \t" + 'pi=' + str(pi) + " \t" + 'time=' + str(process_time)) |
実行結果
1 2 3 4 5 |
N=1000 pi=3.232 time=0.002772092819213867 N=10000 pi=3.146 time=0.005331993103027344 N=100000 pi=3.1372 time=0.03507590293884277 N=1000000 pi=3.140628 time=0.28050994873046875 N=10000000 pi=3.1415932 time=3.076838970184326 |
1千万回の試行回数では通常のpythonと比較して3倍早く結果を得ることができました。コンパイル型のgo言語と比べるとまだ少し遅いですが、プログラムの組み方、ライブラリの変更によっては違う結果になるかもしれません。初心者に描きやすいと言うことでpythonからプログラムの世界に触れてもらうことが多いのですが慣れてきたらコンパイル言語を学習してみるとまた違う発見や、可能性が広がると思います。
pythonの合間にぜひGo言語も試してみてはいかがでしょうか。それでは、また。