概要

RやPythonでデータ分析をしている人がパフォーマンスの問題に悩まされた時に、救いを求めて手を出すことがあると言われているプログラミング言語、Julia。

歴史ある両言語と比べるとまだまだ至らないところは多々あるものの、現在の発展の仕方を見ると将来的には主流な言語の1つになるのではという期待感が漂う一品である。

今回はJuliaのインストール、コンソールの立ち上げ、パッケージの追加、そして簡単なグラフのplotまでを実行してみる。

@CretedDate 2014/12/20
@Versions Julia0.3.3

Juliaの特徴

en.wikipedia.orgに書いてあるところによると、Juliaの特徴は下記あたりらしい。

という感じで速度と連携面が売りにされていることが多い。Juliaが速い理由はLLVM使ったJITコンパイラがうんたらかんたら。

私自身はPython使ってて、C extentionが頑張ってくれてる分には高速だけど、Pandasでちょっと複雑なデータ加工しようとして apply でPythonのコードでごにょごにょすると急激に遅くなるのが嫌で流れてきた口。あと、使ってみて文字コードの扱いもPythonと比べて楽だなと感じた。2系は特に。

Pythonとの連携はけっこう売りになるところで、Pythonの資源(MatplotlibとかIPython Notebookとか)を使う為のパッケージとかも存在する。

インストール

インストール方法は下記を参照。

http://julialang.org/downloads/

ここではUbuntuでのインストールを紹介する。Ubuntuの場合は何も下準備をしなくてもapt-getで入るけど、Xubuntu14.04で実行したところ1つ前のバージョンの0.2.1がインストールされた。

せっかくなら最新の0.3.3が使いたいので、レポジトリの追加を行ってからinstallする。

sudo add-apt-repository ppa:staticfloat/juliareleases
sudo add-apt-repository ppa:staticfloat/julia-deps
sudo apt-get update
sudo apt-get install julia

これで0.3.3(2014年12月現在)が入った。

Windowsの場合はインストーラが用意されているので、それほど苦労なく入れることができそう。使ったことないから知らないけど。

Juliaの情報

最初に読む資料としては、下記を推薦したい。

Julia By Example
http://www.scolvin.com/juliabyexample/

学びはじめの段階で欲しいと思う情報がコンパクトにまとまっていて、とても助かった。

あとは公式サイトのlearningのところに、動画がいくつか置いてある。

learning
http://julialang.org/learning/

例えば下記の動画はこれから学び始める人向けの内容でわかりやすい。

Introduction to Julia
https://www.youtube.com/watch?v=vWkgEddb4-A&list=PLP8iPy9hna6T0dEHtj0GZymvT6ODIJWj0

英語で喋ってるけどコードを書いて実演してるので、なんとなく雰囲気で意味はわかると思う。

Julia自体のソースはgithubに置いてある。

github
https://github.com/JuliaLang/julia

バージョンごとにtagが切ってある。非常に見やすいコードなので、困った時は資料を探すよりもソースを読んだ方が早かったりすることもある。

公式サイトのdocs配下も結構充実している。

公式サイト
http://julialang.org/

ただかなり細かく長い説明がされているので、ここから読み始めるよりは、Julia By Exampleとかを先に読んで、慣れてから目を通した方が良いと思う。

難しい言語ではないので、これらの情報を眺めておけば、Juliaがどういった言語で、どんな風に書けば良いのか見当がつくと思う。

コンソールの立ち上げ

PythonやRと同じく、juliaコマンドでREPL(入力したコードを即時評価、即時実行してくれるヤツ)なコンソールが立ち上がる。

試しにTerminalを開いて julia と打ち込んでみる。

$ julia
               _
   _       _ _(_)_     |  A fresh approach to technical computing
  (_)     | (_) (_)    |  Documentation: http://docs.julialang.org
   _ _   _| |_  __ _   |  Type "help()" for help.
  | | | | | | |/ _` |  |
  | | |_| | | | (_| |  |  Version 0.3.3 (2014-10-21 20:18 UTC)
 _/ |\__'_|_|_|\__'_|  |  Official http://julialang.org release
|__/                   |  x86_64-linux-gnu

julia>

色まで着いた画面が表示される。

適当にコードを打ち込んでみる。

julia> VERSION
v"0.3.3"

julia> 1 + 1
2

julia> pi * 3 ^ 2 # pi * 3の2乗
28.274333882308138

julia> π * 3 ^ 2 # πで定数登録されてたりもする
28.274333882308138

既存の言語からそれほど大きく離れるような文法ではないので、こんな感じで適当にコードを書いていくと、なんとなく動かせる。

パッケージの追加

Juliaのコアのみだと、DataFrameもないし、PyLab的なものも入っていない。そうした機能が必要な場合は、パッケージを追加していく必要がある。

追加方法は簡単で、上で立ち上げたコンソール上で Pkg.add("パッケージ名") と記述するだけ。

試しにグラフの描画などで利用するWinston を入れてみる。

julia> Pkg.add("Winston")

依存するパッケージも含めて、ずらずらとインストールが行われたと思う。

さっそくインストールしたパッケージを使ってみよう。importして簡単なグラフを表示してみる。

julia> import Winston
julia> Winston.plot( [0, 1], [0, 2] )

plot

グラフが表示された。

上では配列( [0, 1] )を使っているけど、下記のようにRangeを使った方がこの場合はスマートかもしれない。

julia> Winston.plot( 0:1, 0:2 )

パッケージを探す

利用可能なパッケージの一覧は下記に載っている。

Julia Package Listing
http://pkg.julialang.org/

仕組み的には、下記のMETADATA.jlにパッケージの情報が入ったディレクトリ一覧があって、そこに書かれたgitのパスをcloneすることでパッケージを取得しているっぽい。

JuliaLang/METADATA.jl
https://github.com/JuliaLang/METADATA.jl

試しに上記ページから先ほどインストールしたWinstonを開いてみると、urlというファイルがあって、gitのパスが記述されていることがわかる。

こうして管理されているので、少なくとも名前の重複はありえないはず。

インストール済みのパッケージ一覧を表示したい場合は、下記。

julia> Pkg.installed()

パッケージを更新したい場合は、下記で実行できる。

julia> Pkg.update()

他のパッケージを入れてplotしてみる

最後におさらいとして他のグラフ表示用のパッケージをインストールして、-pi〜piまでのsinの値をplotしてみる。

JuliaにはWinston以外にもいろいろなグラフ描画用パッケージがあって、有名どころだとPythonのコードを実行できるパッケージを通して、PyLabを使えてしまうものも存在する。ただ、PyLabは自分が試した環境のうちいくつかはうまく呼び出せなかった(原因調査中)ので、実演は割愛する。

plotする際はTKとの連携とかでハマることがJuliaに限らずちょくちょくあるが、そうした場合はGadflyというSVGを使ってブラウザに表示してくれるパッケージを使うと回避できるかもしれない。

そしてそれ以上に、今回ここで使うTextPlotsは、より環境に依存しないplotツールとして安心感がある。名前の通り、テキストでplotするからね。

julia> Pkg.add( "TextPlots" )
julia> import TextPlots
julia> TextPlots.plot( x -> sin(x), -pi:pi )

          sin(x)
       1 ⡤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⠤⢤
         ⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡠⠊⠉⠉⠑⢄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸
         ⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⠊⠀⠀⠀⠀⠀⠀⠢⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸
         ⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⠂⠀⠀⠀⠀⠀⠀⠀⠀⠡⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸
         ⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⠂⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠡⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠌⢸
         ⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠌⠀⢸
         ⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡈⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠂⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠐⠀⠀⢸
         ⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠐⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠠⠁⠀⠀⢸
         ⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠐⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠂⠀⠀⠀⢸
         ⡇⠂⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠂⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠌⠀⠀⠀⠀⢸
         ⡇⠨⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡈⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠂⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠐⠀⠀⠀⠀⠀⢸
         ⡇⠀⢂⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠐⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠠⠁⠀⠀⠀⠀⠀⢸
         ⡇⠀⠀⠄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠠⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠐⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⠂⠀⠀⠀⠀⠀⠀⢸
         ⡇⠀⠀⠀⠡⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⠂⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠠⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠂⠀⠀⠀⠀⠀⠀⠀⢸
         ⡇⠀⠀⠀⠀⠢⠀⠀⠀⠀⠀⠀⠀⠀⢀⠂⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠡⠀⠀⠀⠀⠀⠀⠀⠀⢀⠌⠀⠀⠀⠀⠀⠀⠀⠀⢸
         ⡇⠀⠀⠀⠀⠀⠡⡀⠀⠀⠀⠀⠀⠠⠂⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠑⡀⠀⠀⠀⠀⠀⢀⠂⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸
         ⡇⠀⠀⠀⠀⠀⠀⠐⠤⣀⣀⡠⠔⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠢⣀⣀⣀⠔⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸
      -1 ⠓⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠒⠚
        -1π                                                           7

どうですか、奥さん。この美しい曲線。これは惚れるよね。

補足しておくと、x -> sin(x) という記述は関数になる。

julia> typeof( x -> sin(x) )
Function

Pythonユーザには lambda x: sin(x) のようなものと言えば良いだろうか。いけない気もする。

まとめ

今回はJuliaのインストールから、パッケージの追加、簡単なグラフのplotするところまでを追ってみた。

詳しい文法の話は出ていないが、Juliaが非常に手軽な言語だということはこれだけでも伝わったのではないだろうか。

手軽である割には8bitの整数型とか16bitの浮動小数点型とか、細かく数値型を使い分けられたり、関数の引数に型を指定できたりと、一般的な動的型付け言語にはない厳密さも持っていたりする。

是非、発展していって欲しい言語の1つである。