Julia (ジュリア) は科学技術計算向きのオープンソース (MIT License) なプログラミング言語です。参考 URL 2 によると、『一般的なプログラミングから高水準の科学計算処理まで対処するよう設計された高水準言語及び動的プログラミング言語である。』 とのことです。
Julia は LLVM をベースにした JIT (Just-In-Time) コンパイラを搭載することで、ネイティブなコードにコンパイルするプログラミング言語にせまる実行速度を達成しています。JIT を使った動的なプログラミング言語では PyPy もかなり速いのですが、Julia はそれよりも速いようです。これはあとで試してみましょう。
Julia の関数は CLOS (Common Lisp Object System) の総称関数と同様に、引数のデータ型 (複数ある場合はそれぞれのデータ型) により呼び出される処理が決まります。これを「多重ディスパッチ」といいます。CLOS 以外で多重ディスパッチを採用している (動的な) 言語を M.Hiroi は知らなかったので、Julia にはとても興味を持っています。このほかにも、行列の演算処理、関数型言語の機能 (無名関数や高階関数など)、Lisp 風のマクロなど、興味深い機能がたくさんあります。
Julia のバージョンは 0.4 (2015 年 10 月時点) で、現在も活発に開発が行われています。これからも新しい機能が追加されたり仕様が変更されることもあるでしょうが、とりあえず難しいことはおいといて、簡単なプログラムを作りながら Julia の基本を勉強していきたいと思っております。
本ページは M.Hiroi の「覚え書」にすぎません。なにぶんにも初心者が作るページなので、勘違いや間違いがあると思います。何かお気づきの点がありましたら、メールでご指摘いただけると助かります。たいしたことはできませんが、よろしければお付き合いくださいませ。
Julia は次のサイトからダウンロードできます。Windows 用のバイナリが用意されているので、とても簡単にインストールすることができます。
Julia の基本を学ぶのであれば、Lisp / Scheme の REPL (read eval print loop) のような対話モードがあると便利です。Python にも対話モードがありますし、Ruby には irb (interactive ruby) というツールがあります。Julia の場合、プログラムを実行するコマンド julia をコマンドプロンプトで起動すると、次のようなプロンプトが表示されて入力待ちになります。
C>julia
_
_ _ _(_)_ | A fresh approach to technical computing
(_) | (_) (_) | Documentation: http://docs.julialang.org
_ _ _| |_ __ _ | Type "?help" for help.
| | | | | | |/ _` | |
| | |_| | | | (_| | | Version 0.4.1 (2015-11-08 10:33 UTC)
_/ |\__'_|_|_|\__'_| | Official http://julialang.org/ release
|__/ | i686-w64-mingw32
julia>
これで REPL のようにプログラムを入力して実行することができます。終了する場合は CTRL-D を入力する、または関数 exit() を実行してください。なお、現在のバージョンでは Julia の起動に少々時間がかかるようです。
さて、肝心な Julia の実行速度ですが、いつものように「たらいまわし関数」を使って調べてみました。
リスト:たらいまわし関数 (tarai.jl)
function tak(x, y, z)
if x <= y
z
else
tak(tak(x - 1, y, z), tak(y - 1, z, x), tak(z - 1, x, y))
end
end
# 時間計測
@time(tak(22, 11, 0))
C>julia tarai.jl 2.310083 seconds (1.01 k allocations: 36.131 KB)
それでは実行結果を示します。tak(22, 11, 0) を計算しました。使用した Julia のバージョンは 0.4.1 です。比較のため、Python, PyPy, Java, Scala, GCC (C言語), SML/NJ, SBCL (Common Lisp), OCaml (ocamlopt), Haskell (GHC) の実行結果を示します。Python, PyPy, Java, Scala, Julia 以外の処理系はプログラムをネイティブコードにコンパイルするものです。
| 処理系 | 秒 |
|---|---|
| Python (ver 2.7.3) | 91.9 |
| PyPy (ver 4.0.1) | 17.9 |
| SBCL (ver 1.0.55) | 5.85 |
| SML/NJ (ver 110.74) | 3.48 |
| GCC -O (ver 4.5.3) | 2.37 |
| Julia (ver 0.4.1) | 2.31 |
| 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 |
| Scala (ver 2.11.1) | 1.79 |
| Java (ver 1.8.0_05) | 1.09 |
| ocamlopt (ver 3.12.1) | 1.09 |
Julia は Python や PyPy とは次元の異なる速さで、ネイティブコードにコンパイルするプログラミング言語に匹敵する結果になりました。こんなに速いとは M.Hiroi も予想していなかったので大変驚きました。興味のある方はいろいろ試してみてください。
『Julia Language Programming』の著作権は筆者「広井誠 (Makoto Hiroi) 」が保持します。無断使用や無断転載は禁止いたします。『Julia Language Programming』で作成したプログラムはフリーソフトウェアとします。ご自由にお使いください。プログラムの改造や配布もご自由にどうぞ。その際は、出典を明記してくださるようお願いいたします。
ただし、これらのプログラムは無保証であり、使用したことにより生じた損害について、作者「広井誠 (Makoto Hiroi) 」は一切の責任を負いません。また、これらのプログラムを販売することで利益を得るといった商行為は禁止いたします。