エンタープライズギークス (Enterprise Geeks)

企業システムの企画・開発に携わる技術者集団のブログです。開発言語やフレームワークなどアプリケーション開発に関する各種情報を発信しています。ウルシステムズのエンジニア有志が運営しています。

プログラミング言語 Julia

エンタープライズ領域のシステム開発で使われるプログラミング言語はあまり多くないが、世の中には実に多種多様なプログラミング言語が存在する。
実際に業務で利用するかどうかはともかくとして、プログラミング言語が生まれた経緯や特徴を知ることで、視野を広げることができる。
今後、興味深い言語をいくつか取り上げ、簡単に紹介していきたい。

今回は Juliaを取り上げる。

マルチパラダイム言語 Julia

Julia は 2012 年に登場したばかりの比較的新しい言語だ。 プログラミング言語パラダイムを 7 つの言語から紹介する名著 "Seven Languages in Seven Weeks" (邦訳:『7 つの言語 7 つの世界』) の続編である "Seven More Languages in Seven Weeks" でも取り上げられる予定だ*1

Julia はマルチパラダイム言語だ。 手続き型的に記述することもできるし、多重ディスパッチにより関数を型ごとに拡張していく関数型プログラミング的な書き方もできる。 動的な強い型付けの型システムを持ち、軽量な記述を実現している。 動的型付けというと速度が遅いイメージがあるが、 LLVM への JIT コンパイラを搭載しており、高パフォーマンスという魅力を持つ。 そして Lisp のような強力なメタプログラミング機能を備えている。

Julia は、一応汎用言語の体裁はとっているが、標準ライブラリーに積分や疎行列に関するパッケージが並ぶあたり、数値計算を強く意識していることがわかる。 実際、製作者が Julia を紹介したブログ記事では、いの一番に彼らが Matlab ユーザーであると述べている。 彼らは Matlab の持つ強力な数値計算記述能力に加え、 Lisp のようなマクロ機能、 C のようなパフォーマンスを求めた。 さらに並列・分散処理が容易に記述できて、他言語関数を利用したい。 そのような様々な欲求を満たすべく作られたのが、 Julia なのだ。

Juliaのコード例

前置きが長くなったが、 Julia の例を見てみよう。 Julia でフィボナッチ数列の n 番目の要素を取得する関数を定義する。 フィボナッチ数列  \{F_{n}\}  F_{0} = 0, F_{1} = 1, F_{n} = F_{n-1} + F_{n-2} (n \geq 2) で定義される数列だ。

これをそのまま Julia に翻訳すると以下のようになる。

function fib(n)
   if n == 0
      0
   elseif n == 1
      1
   else
      fib(n - 1) + fib(n - 2)
   end
end

他のプログラミング言語の経験があれば、問題なく読めるだろうし、大きな違和感もないだろう。 大きい整数を引数として与えると、再帰呼び出しの回数が大きくなって計算時間が大きくなることも一緒だ*2

他の言語と同じように書けて同じように動くのであれば、一体 Julia を使うメリットはどこにあるというのか。 もう少しだけ我慢して付き合っていただきたい。

前述の遅いコードはアルゴリズムが問題なので、これを高速化してみよう。 証明は省くが、フィボナッチ数列の n 番目の要素  F_{n} は、 1 1 1 0 n の (2, 1) 要素に現れる*3。 これを利用すると、計算時間が劇的に短くなる。 これを Julia で書いてみよう。

function fib_fast(n)
   F = BigInt [1 1; 1 0]
   Fn = F ^ n
   Fn[2, 1]
end

2 行目の行列定義の部分は空白で列を、セミコロンで行を区切った行列を記述している。 空白で区切る形式はあまり見慣れないかもしれないが、数式の行列には区切り文字はなく、同等の記法を提供していると考えれば自然だ。 BigInt は行列の要素の型を示しており、任意桁数の整数が表現できる。 このように型を意識させるプログラミングスタイルというのは、流行している動的型付けプログラミング言語にはあまり見られないかもしれない。 しかし型が出てくるから冗長になるというわけでもなく、実際先ほどのコードにくらべて、定義の長さも短くなった。 そして計算時間も短くなった。 例えば n に 1000 を与えても、一瞬で答えが返ってくる。

Juliaの優位性

プログラミングは、実行したいことをプログラミング言語によって記述する行為だ。 思考と記述に乖離は小さい方が良い。 例えば科学計算のような数式を扱う分野では、行列やベクトルが数学に近い記法で記述できると嬉しい。 先に示したように、 Julia は行列の定義や演算もほとんど違和感なく記述できる。 ここに Julia の科学計算分野における優位性があるといえる。 フィボナッチ数列の例は、もちろん他の言語でも同等のことを記述できるが、 Julia の簡潔さには目を見張るものがある。

簡単な例であったが、 Julia の強力さを一部垣間見ることができたのではないだろうか。 読者の中には特に数式に興味がなく、ピンとこなかった人もいるかもしれない。 しかし Julia は欲張り言語だ。 あなたの琴線に触れる何かを持っているに違いない。 ぜひ Julia を一通り試してみてほしい。

Rとの比較

話は変わるが、 Julia が登場する少し前に、日本にはビッグデータ時代が到来した。 企業が保有する巨大なデータを、いかにして企業の価値につなげるかという課題が浮上してきた。 その課題を解決すべき人材は、データサイエンティストやグロースハッカーなどと呼ばれる。 彼らはデータから価値を導き出すために、さまざまな道具を使う。 ある人は、 SASSPSS、 Tableau といった商用ソフトウェアを利用するかもしれない。 別の人は、 R、 incanter、 Weka、 ELKI のようなデータマイニングツールを使うかもしれない。 また別の人は、 Numpy のような数値計算ライブラリーを用いて独自に開発を行っているかもしれない。 そんな様々なツールの中でも特に有名なのが、統計解析環境の R だろう。 R は Julia と次のような点で対比される存在だ。

  • 無料で使える
  • 数値・統計計算に偏った汎用言語である
  • コミュニティが積極的にパッケージを作成して公開している
    • 統計分析手法
    • データの可視化

今年 6 月に JuliaCon と呼ばれる Julia の会議が開催された。 データサイエンティストやグロースハッカーの間でも徐々に注目も高まってきているようだ。 Julia はまだ発展途上の言語ではあるが、もしかすると、将来 R を置き換えるような存在になるのかもしれない。

まとめ

Julia は非常に貪欲に様々な機能を取り入れている言語だ。 特に数値計算分野に強い力を発揮する。 数値計算というと、企業システムであまり使われる機会がないと思うかもしれない。 しかし、企業が扱うデータからさらなる付加価値を生み出すのは、数値計算が担うことになる。 そういう視点から Julia のような言語に着目すると、企業システムの上でできる面白いことが思いつくかもしれない。

[AK]

*1:本書のベータ電子版は既に出版社から購入可能であるが、本記事執筆時点では残念ながら Julia の章は未掲載だ。

*2:このコードは引数の型の指定していないので、不正な値 (例えば小数) を引数として与えると無限ループになるので注意。

*3: n = 0 の場合は単位行列なので、非対角成分は 0 となるので、 n = 0 の場合も計算できる。