Julia 1.5.4 ドキュメント
Julia 1.5.4 のドキュメントにようこそ。
一つ前のリリースからの変更点についてはリリースノートを参照してください。
このドキュメントの英語版は PDF フォーマットでも公開されています: julia-1.5.4.pdf
Julia の紹介
伝統的に科学計算は最上のパフォーマンスを要求してきましたが、一方でドメインエキスパートの大部分が日常的な計算で使う言語は低速な動的言語に移行してきました。一部の応用分野で動的言語が好まれるのはもっともなことであり、動的言語が将来使われなくなることはないだろうと私たちは考えています。幸いにも、現代的な言語設計とコンパイラ技術を使えば動的言語が迫られる柔軟性と性能のトレードオフをおおむね解消でき、プロトタイプに使える生産性と性能が重視されるアプリケーションで実際に使える実行速度を兼ね備えた単一環境の作成が可能になります。プログラミング言語 Julia が担うのがこの役割です: Julia は柔軟な動的言語であり、科学計算および数値計算に適していて、古くからある静的型付けの言語に迫る性能を持ちます。
Julia のコンパイラは Python や R といった言語のインタープリタとは異なるので、最初は Julia のパフォーマンスが直感的に思えないかもしれません。もし何らかの処理が遅いと感じたら、何か試す前にまずパフォーマンス Tips に目を通すことを強く推奨します。Julia の動作を一度理解すれば、C と同程度に高速なコードを書くのは簡単です。
Julia の特徴は省略可能な型付け・多重ディスパッチ・高い性能です。これらの特徴は型推論と just-in-time (JIT) コンパイル で実現されており、実装には LLVM が使われています。Julia は手続き型プログラミング・関数型プログラミング・オブジェクト指向プログラミングの機能を兼ね備えるマルチパラダイムな言語です。R, MATLAB, Python といった言語と同じように高水準数値計算が必要とする簡便さと表現力を Julia は提供しますが、加えて汎用プログラミングもサポートします。このため、Julia は数学的プログラミング言語だけではなく、Lisp, Perl, Python, Lua, Ruby といった有名な動的言語からも様々なアイデアを借りてきています。
典型的な動的言語と比べたときの最も重要な Julia の特徴を示します:
- 言語のコアにできないことはほとんどありません。Julia Base ライブラリと標準ライブラリは Julia で書かれており、整数演算のような基本的な操作さえ Julia で書かれています。
- オブジェクトを構築・記述するための型の構文が充実しており、必要に応じて型の宣言にも利用できます。
- 多重ディスパッチ (multiple dispatch) の機能を使えば、引数の型の組み合わせに応じて関数の振る舞いを切り替えることができます。
- 特定の引数の型に対して特殊化された高速なコードを自動的に生成できます。
- C のような静的にコンパイルされる言語と同等の高い性能を持ちます。
「動的言語には型がない」などと言われることがありますが、これは全くの間違いです。Julia の全てのオブジェクトは型 (プリミティブ型もしくはユーザー定義型) を持ちます。多くの動的言語では型宣言がないためにコンパイラへ型を明示できず、プログラムからは型について何もできないことがよくあります。これに対して静的言語では型の注釈を入れることが可能 ──あるいは必要── なものの、型が存在するのはコンパイル時のみであり、実行時に型を操作したり読み取ったりすることはできません。Julia の型はそれ自身実行時オブジェクトで、かつコンパイラへ情報を伝えるのにも利用できます。
Julia を簡単に使うだけであれば型や多重ディスパッチを明示的に使う必要はありませんが、この二つは Julia に欠かせない中心的な機能です。関数は引数の型の組み合わせごとに別々に定義され、型の組み合わせに最も特定的に適合する定義をディスパッチ (起動) することで呼び出されます。伝統的なオブジェクト指向のディスパッチでは第一引数が操作を "持って" いますが、数学的プログラミングではこの考え方は上手く当てはまらず、多重ディスパッチの方が適しています。Julia の演算子は特殊な記法を持つただの関数です ──例えば加算を拡張してユーザー定義型に対応させるには +
関数に対する新しいメソッドを定義します。このとき既存のコードは新しいデータ型に対する定義があってもシームレスに動作します。
実行時の型推論 (および型推論を補強する省略可能な型注釈) があること、そしてプロジェクト発足当初からパフォーマンスに注力してきたことで、Julia の計算性能は他の動的言語を上回り、静的にコンパイルされる言語に匹敵します。これまで大規模計算の問題では常に速度が重要でしたが、これからも重要であり続け、その重要性は今後揺るがないでしょう: 過去数十年に渡って、処理されるデータの量はムーアの法則と軽々と肩を並べるペースで増加しているのです。
Julia は使いやすさ・パワー・性能を今までにない形で組み合わせて単一の言語を作成するという前例のない試みです。上で説明した事項に加えて、Julia は他のシステムに対して次の利点を持ちます:
- 無料かつオープンソース (MIT ライセンス) である。
- ユーザー定義型がビルトイン型と同程度に高速かつコンパクトである。
- 高速化のためにコードをベクトル化する必要がない: ベクトル化しなくてもコードが高速になる。
- 並列計算と分散計算のために設計されている。
- 軽量な「グリーンスレッド (コルーチン)」 を持つ。
- 控えめでありながらも強力な型システムを持つ。
- 数値型およびその他の型に対する高い拡張性を持ったエレガントな変換・昇格システムを持つ。
- UTF-8 をはじめとして、Unicode を効率的にサポートする。
- C 関数を直接呼び出せる (ラッパーや特殊な API は必要ない)。
- プロセスを管理するためのシェルに似た強力な機能を持つ。
- Lisp 風のマクロとメタプログラミングの機能を持つ。