Juliaことはじめ

Juliaについて

ここ最近Alternative RもしくなNext Pythonってな感じで、統計・機械学習などの科学計算界隈で特に見かけることが多くなった言語 、Julia

メインストリームのプログラミング言語と比べると特徴・違和感がを感じるポイントが触れば触るほど出てくるのだけど、メリットとしては

  • LLVMベースのJITコンパイル→場合によってはC / Java並みに速い
  • Matlab / R 風の行列計算のネイティブサポート
  • ノードをまたいだ並列計算の言語レベルサポート
  • 型チェック機構
  • C, Fortran, Pythonのライブラリを直接呼べる

といったところが挙げられると思われる。

marui.hatenablog.com

上記のサイトによれば、Juliaの作者は以下のような目標を掲げて開発を始めたようです。

ゆるいライセンスのオープンソースで、Cの速度とRubyの動的さが欲しい。Lispのような真のマクロが使える同図象性のある言語で、Matlabのように分かりやすい数学の記述をしたい。Pythonのように汎用的に使いたいし、Rの統計処理、Perlの文字列処理、Matlab線形代数計算も要る。シェルのように簡単にいくつかのパーツをつなぎ合わせたい。チョー簡単に習えて、超上級ハッカーも満足する言語。インタラクティブに使えて、かつコンパイルできる言語が欲しい。
(そういえば、C言語の実行速度が必要だってのは言ったっけ?)
こんなにもワガママを言った上だけど、Hadoopみたいな大規模分散コンピューティングもやりたい。もちろん、JavaXMLで何キロバイトも常套句を書きたくないし、数千台のマシンに分散した何ギガバイトものログファイルを読んでデバッグするなんて論外だ。幾層にも重なった複雑さを押しつけられるようなことなく、純粋なパワーが欲しい。単純なスカラーのループを書いたら、一台のCPUのレジスターだけをブン回す機械語のコードが生成されて欲しい。A*Bと書くだけで千の計算をそれぞれ千のマシンに分散して実行して、巨大な行列の積をポンと計算してもらいたい。
型だって必要ないなら指定したくない。もしポリモーフィックな関数が必要な時には、ジェネリックプログラミングを使ってアルゴリズムを一度だけ書いて、あとは全ての型に使いたい。引数の型とかから自動的にメソッドを選択してくれる多重ディスパッチがあって、共通の機能がまったく違った型にも提供できるようにして欲しい。これだけのパワーがありながらも、言語としてシンプルでクリーンなものがいい。

これが本当なら最強だろ。ということで触り始めてみた。

表面をさらっと触る分にはごく普通の言語っぽいのだが、少し深堀りを始めると、メインストリームのPython / JS / Rubyみたいな言語を普段扱っている身からすると色々と「え!?」となる部分が出てくる出てくる。

というわけで、少しずつ解説していきたい。

インストール / 実験環境

Julia自体はHomebrewで入れる。

brew cask install Caskroom/cask/julia

インストールできたら

julia

インタラクティブシェルが起動する。

f:id:nullbyte:20150527005940p:plain

Hello, Julia

println("Hello, Julia!")

特に悩むことはなくて、上記の通り

FizzBuzz

julia> function fizzbuzz(n)
    for i in 1:n
        if i % 15 == 0
            println("fizzbuzz")
        elseif i % 5 == 0
            println("buzz")
        elseif i % 3 == 0
            println("fizz")
        else
            println(i)
        end
    end
end 

fizzbuzz (generic function with 1 method)

julia> fizzbuzz(20)
1
2
fizz
4
buzz
fizz
7
8
fizz
buzz
11
fizz
13
14
fizzbuzz
16
17
fizz
19
buzz

関数定義はfunction。if分は if / elseif / else。
ブロックはendで締める必要があり、インデントは強制されない。

julia> print("foo"); print("bar");
foobar

コロンで区切れば1行に複数行かける。

julia> is_odd(n) = if n % 2 == 1 true else false end
is_odd (generic function with 1 method)

julia> is_odd(3)
true

上記の通り、関数を1行で定義する方法もあり。
もっと簡単な例では

add(x, y) = x + y

よりJuliaっぽい部分

次回以降書く。