はじめに

科学技術計算には常に最高の性能が求められますが、この分野のエキスパートたちはより低速な動的言語を使って仕事をしています。 私達はこの分野で動的言語を用いることにたくさんの利点があることを理解していますし、動的言語が使われないようにしたいわけでもありません。 幸い、最近の言語設計やコンパイラの進歩によって、性能の低下を避けつつ、「生産的なプロトタイピング」と「高性能なアプリケーションの効率的なデプロイ」の両方をひとつの環境で提供することが可能になりました。 Juliaはこのような目的のために開発されています。つまり、Juliaは柔軟な動的言語であると同時に、古くからの静的型付け言語と同等の性能を実現することで科学計算や数値計算に適してたものになっています。

JuliaのコンパイラはPythonやRで使われるようなインタプリタとは異なるので、もしかしたら最初はその性能に気づかないかもしれません。 遅いと感じたら、何かを試す前に Performance Tips を参照することをお勧めします。 Juliaがどのように動作するかを理解すれば、C言語と同等の速さで動くコードを簡単に書くことができるでしょう。

Juliaは任意の型付け、多重ディスパッチ、そして優れた性能を提供します。 これは型推論と、 LLVM によって実装された just-in-time (JIT) コンパイラ によって実現されるものです。 Juliaは命令型プログラミング・関数型プログラミング・オブジェクト指向プログラミングの機能を組み合わせたマルチパラダイム言語です。 JuliaはR、MATLAB、Pythonなどと同様に高度な数値計算のための簡単で高い表現力を持つ記法を提供しつつ、一般的なプログラミングもサポートします。 このことを実現するために、Juliaは数値計算言語の系譜を踏まえつつも、 LispPerlPythonLua 、そして Ruby などの広く使われている動的言語からも多くのアイデアを得ています。

一般の動的言語と比べてJuliaが特に優れている点としては以下のようなものが挙げられます。

  • 言語のコア部分は最小限の機能しか提供しません。整数の四則演算のような初等演算を含む標準ライブラリはJulia自身で書かれています
  • オブジェクトを作成したり説明したりするのに使うことができる、型に関する豊富な機能を提供します。プログラマ自身で型を宣言することもできます
  • 多重ディスパッチ によってさまざまな引数の組み合わせごとに関数の振る舞いを定義できます
  • それぞれの引数の型ごとに最適化されたコードを自動生成します
  • Cのような静的コンパイル言語に迫る性能を実現します

動的言語は「型がない」と言われることがありますが、そんなことはありません。 プリミティブであれユーザー定義であれ、全てのオブジェクトは何らかの型を持ちます。 多くの動的言語における型宣言の欠落は、コンパイラに対して値の型を伝えられない、または型について何ら触れることができないということを意味します。 一方静的言語においては、コンパイラのために型注釈をつけることができます(ほぼ必須でしょう)が、型の情報はコンパイル時にのみ存在し、実行時には操作したり取得したりすることができません。 Juliaでは、型そのものが実行時オブジェクトとなり、同時にコンパイラに対して情報を伝えるために利用できます。

カジュアルプログラマは型や多重ディスパッチを明示的に使う必要はありませんが、これらはJuliaの基礎となる機能です。 関数はさまざまな引数の組み合わせに対して定義され、実行時には最も当てはまる定義が適用されます。 このモデルは数値計算にとても適しています。 従来のオブジェクト指向ディスパッチのように、第一引数が演算子を「所有」するのは不自然です。 これに対してJuliaの演算子は(特殊な記法を持った)単なる関数に過ぎません。 ユーザーが定義したデータ型に対して加算処理を追加したい場合は、 + 関数に対して新たなメソッドを定義します。 こうすることで、既存のコードをシームレスに新たなデータ型対応させることができます。

実行時型推論(任意の型注釈で補うこともできます)によって、またプロジェクト発足時からの性能に対する強い欲求によって、Juliaの計算効率は他の動的言語を圧倒し、静的コンパイル言語と競うレベルにあります。 大規模数値計算問題では計算速度はこれまでもこれからも、常に重大な問題です。 処理されるデータ量は過去数十年にわたってムーアの法則にしたがって増え続けています。

Juliaは、扱いやすさ・強力さ・効率性の前例のない組み合わせを1つの言語で実現しようとしています。これに加え、Juliaは以下のような長所を持ちます。

  • フリーかつオープンソース( MITライセンス
  • コンパクトで組み込み型と同等の速度を持つユーザー定義型
  • 性能のためにコードをベクトル化する必要がありません。ベクトル化されていないコードも高速に動作します
  • 並列コンピューティング・分散コンピューティングを意図した設計
  • 軽量で”greenな”スレッドシステム [1]コルーチン
  • 控えめかつ強力な型システム
  • 数値型他の型の、エレガントで拡張性のある変換やプロモーション [2]
  • Unicode の効率的なサポート。 UTF-8 も含みますが、これに限定しません
  • ラッパーや特別なAPIを必要としない、Cの関数の直接の呼び出し
  • シェルのような強力なプロセス管理
  • Lispライクなマクロやその他のメタプログラミング機構
[1]訳注: グリーン・スレッド(Green Threads)とは、OSではなくランタイムライブラリによってスケジュールされるスレッドのこと。対義として「ネイティブ・スレッド」がある。
[2]訳注: プロモーションの詳細については 変換とプロモーション を参照のこと。