Julia 1.3 のドキュメント
Julia 1.3 のドキュメントへようこそ。
前回のリリース以降の変更内容については、リリースノートをお読みください。
ドキュメントはPDF形式で利用可能です: julia-1.3.0.pdf.
はじめに
科学技術計算は、これまでに最高のパフォーマンスを性能を要求していましたが、その分野の専門家は日々の仕事のために速度で劣る動的言語に主に移行してきました。我々はこれらのアプリケーションで動的言語が好まれる多くの理由があると信じていますし、動的言語の使用が減少するとも思っていません。幸いなことに、現代の言語設計とコンパイラ技術により、パフォーマンスのトレードオフをほとんど解消し、プロトタイピングに向く生産性と、パフォーマンス重視のアプリケーションのデプロイに向く演算効率とを、単一環境で提供することが可能です。Julia言語は、この役割を果たします。柔軟な動的言語であり、パフォーマンスは従来の静的型付け言語に匹敵し科学的・数値的な計算に適しているのです。
JuliaのコンパイラはPythonやRのような言語で使われているインタプリタとは異なるので、Juliaのパフォーマンスは最初は直観的ではないことがわかります。プログラムが遅いと思われる場合は、何かを試す前にパフォーマンス・ティップスセクションを読むことを強くお勧めします。Juliaのしくみを理解すれば、Cと同じくらい速いコードを書くのは簡単です。
Juliaの特徴に、省略可能な型付け、多重ディスパッチ そして高パフォーマンスがあります。これらは、型推論とジャスト・イン・タイム(JIT)コンパイルによって達成され、LLVMを使って実装されています。Juliaはマルチパラダイム言語で、命令型、関数型、オブジェクト指向プログラムの特徴を併せ持っています。Juliaは、R・Matlab・Pythonといった言語と同じように、高度な数値計算向けの簡単で高い表現力を提供しつつ、汎用的なプログラミングもサポートします。これは、Juliaが数学的プログラム言語の系譜を踏まえつつ、Lisp, Perl, Python, Lua, Ruby など人気の動的言語から多くのアイディアをえているからです。
典型的な動的言語とJuliaとの主な違いは:
- 言語のコア部分は最小限の機能しか提供しません。整数の四則演算のような初等演算を含む標準ライブラリはJulia自身で書かれています
- オブジェクトを作成したり説明したりするのに使うことができる、型に関する豊富な機能を提供します。プログラマ自身で型を宣言することもできます
- 多重ディスパッチによってさまざまな引数の組み合わせごとに関数の振る舞いを定義できます
- それぞれの引数の型ごとに最適化されたコードを自動生成します
- Cのような静的コンパイル言語に迫る性能を実現します
動的言語は「型がない」と言われることがありますが、そんなことはありません。プリミティブであれユーザー定義であれ、全てのオブジェクトは何らかの型を持ちます。多くの動的言語における型宣言の欠落は、コンパイラに対して値の型を伝えられない、または型について何ら触れることができないということを意味します。一方静的言語においては、コンパイラのために型注釈をつけることができます(ほぼ必須でしょう)が、型の情報はコンパイル時にのみ存在し、実行時には操作したり取得したりすることができません。Juliaでは、型そのものが実行時オブジェクトとなり、同時にコンパイラに対して情報を伝えるために利用できます。
ちょっとプログラムを書きたいだけなら、わざわざ使う必要のない型や多重ディスパッチですが、 これらの昨日は実はJuliaの中核を担っています。関数はさまざまな引数の組み合わせに対して定義され、実行時には最も当てはまる定義が適用されます。 このモデルは数値計算にとても適しています。従来のオブジェクト指向ディスパッチのように、第一引数が演算子を「所有」するのは不自然です。これに対してJuliaの演算子は(特殊な記法を持った)単なる関数に過ぎません。 ユーザーが定義したデータ型に対して加算処理を追加したい場合は、 +
関数に対して新たなメソッドを定義します。 こうすることで、既存のコードをシームレスに新たなデータ型対応させることができます。
実行時型推論(任意の型注釈で補うこともできます)によって、またプロジェクト発足時からの性能に対する強い欲求によって、Juliaの計算効率は他の動的言語を圧倒し、静的コンパイル言語と競うレベルにあります。大規模な数値計算問題では計算速度はこれまでもこれからも、常に重大な問題です。処理されるデータ量は過去数十年にわたってムーアの法則にしたがって増え続けています。
Juliaは、扱いやすさ・強力さ・効率性の前例のない組み合わせを1つの言語で実現しようとしています。これに加え、Julia は以下のような長所を持ちます:
- フリーかつオープンソース(MITライセンス)
- コンパクトで組み込み型と同等の速度を持つユーザー定義型
- 性能のためにコードをベクトル化する必要がありません。ベクトル化されていないコードも高速に動作します
- 並列コンピューティング・分散コンピューティングを意図した設計
- 軽量で”greenな”スレッドシステム([コルーチン]https://en.wikipedia.org/wiki/Coroutine)
- 控えめかつ強力な型システム
- 数値型他の型の、エレガントで拡張性のある変換やプロモーション
- Unicode の効率的なサポート。UTF-8 も含みますが、これに限定しません
- ラッパーや特別なAPIを必要としない、Cの関数の直接の呼び出し
- シェルのような強力なプロセス管理
- Lispライクなマクロやその他のメタプログラミング機構