お気楽 Julia プログラミング超入門のフォントを Web フォント (Noto Sans JP, Noto Sans Mono) に変更し、印刷用の CSS を追加しました。Web ブラウザの印刷機能を使って PDF に変換することもできます。表示が崩れるときはフォント Noto Sans Mono CJK JP をインストールしてください。
Julia (ジュリア) は科学技術計算向きのオープンソース (MIT License) なプログラミング言語です。参考 URL 4 によると、『一般的なプログラミングから高水準の科学計算処理まで対処するよう設計された高水準言語及び動的プログラミング言語である。』 とのことです。
Julia は LLVM をベースにした JIT (Just-In-Time) コンパイラを搭載することで、ネイティブなコードにコンパイルするプログラミング言語にせまる実行速度を達成しています。JIT を使った動的なプログラミング言語では Node.js (JavaScript) も速いのですが、Julia はそれを上回る速さのようです。これはあとで試してみましょう。
Julia の関数は CLOS (Common Lisp Object System) の総称関数と同様に、引数のデータ型 (複数ある場合はそれぞれのデータ型) により呼び出される処理が決まります。これを「多重ディスパッチ」といいます。CLOS 以外で多重ディスパッチを採用している (動的な) 言語を M.Hiroi は知らなかったので、Julia にはとても興味を持っています。このほかにも、行列の演算処理、関数型言語の機能 (無名関数や高階関数など)、Lisp 風のマクロなど、興味深い機能がたくさんあります。
Julia は 2018 年 8 月にバージョン 1.0 がリリースされました。今後は Julia 1.0 に対応したプログラムが増えていくと思われます。本ページでは簡単なプログラムを作りながら、Julia 1.0 の基本を勉強していきたいと思っております。なお、本ページは M.Hiroi の「覚え書」にすぎません。なにぶんにも初心者が作るページなので、勘違いや間違いがあると思います。何かお気づきの点がありましたら、メールでご指摘いただけると助かります。たいしたことはできませんが、よろしければお付き合いくださいませ。
Julia は次のサイトからダウンロードできます。Windows 用のバイナリが用意されているので、簡単にインストールすることができます。
現在 (2021 年 11 月時点) のバージョンは次の通りです。
Windows のインストールでパスが設定されなかった場合は手動で行ってください。Windows 10 の場合、コントロールパネル > システムとセキュリティ > システム の左端にある「システムの詳細設定」をクリックしてください。「システムのプロパティ」が表示されるので、その下側にある「環境変数」をクリックすると環境変数を設定することができます。
コントロールパネルは スタートボタン > Windows システムツール > コントロールパネル で起動することができますが、シェルや「ファイル名を指定して実行」から control と打ち込んでも OK です。実はもうひとつ簡単な方法があって、[Windows] キーと [Pause] キーを同時に押すと、コントロールパネルのシステム画面を表示することができます。
Linux の場合、バイナリファイル (Generic Linux Binaries for x86) をダウンロードして tar で展開します。あとは、PATH が設定されているディレクトリから実行ファイル julia にシンボリックリンクを張ります。
たとえば julia のフルパスが ~/julia-1.6.4/bin/julia で /usr/local/bin にパスが通っているとすると、次のコマンドでリンクを張ることができます。
sudo ln -s ~/julia-1.6.4/bin/julia /usr/local/bin/julia
ls -al /usr/local/bin を実行すると、julia にリンクが張られていることが確認できます。
Julia の基本を学ぶのであれば、Lisp / Scheme の REPL (read eval print loop) のような対話モードがあると便利です。Python にも対話モードがありますし、Ruby には irb (interactive ruby) というツールがあります。Julia の場合、プログラムを実行するコマンド julia をコマンドプロンプトで起動すると、次のようなプロンプトが表示されて入力待ちになります。
$ julia _ _ _ _(_)_ | Documentation: https://docs.julialang.org (_) | (_) (_) | _ _ _| |_ __ _ | Type "?" for help, "]?" for Pkg help. | | | | | | |/ _` | | | | |_| | | | (_| | | Version 1.6.4 (2021-11-19) _/ |\__'_|_|_|\__'_| | Official https://julialang.org/ release |__/ | julia>
これで REPL のようにプログラムを入力して実行することができます。終了する場合は CTRL-D を入力する、または関数 exit() を実行してください。
さて、肝心な 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))
それでは実行結果を示します。tak(22, 11, 0) を計算しました。使用した Julia のバージョンは 1.6.4 (LTS) です。プログラムは Ubunts 18.04 (WSL) で実行しました。
処理系 | 秒 |
---|---|
Python (ver 3.6.9) | 69.6 |
Lua (ver 5.3.3) | 37.2 |
Ruby (ver 2.5.1p57) | 25.4 |
Gauche (ver 0.9.9) | 25.3 |
ocamlc (ver 4.05.0) | 10.8 |
SBCL (ver 1.4.5) | 6.38 |
LuaJIT (var 2.1.0-β) | 4.02 |
SML/NJ (ver 110.98) | 2.66 |
GHC (ver 8.8.4) | 1.96 |
Julia (ver 1.6.4) | 1.95 |
SBCL (最適化) | 1.57 |
GCC -O2 (ver 7.4.0) | 1.23 |
ocamlopt (ver 4.05.0) | 0.97 |
Julia は Python や Ruby とは次元の異なる速さで、ネイティブコードにコンパイルするプログラミング言語に匹敵する結果になりました。この結果には M.Hiroi も大変驚きました。興味のある方はいろいろ試してみてください。
『お気楽 Julia プログラミング超入門』の著作権は筆者「広井誠 (Makoto Hiroi)」が保持します。無断使用や無断転載は禁止いたします。『お気楽 Julia プログラミング超入門』で作成したプログラムはフリーソフトウェアとします。ご自由にお使いください。プログラムの改造や配布もご自由にどうぞ。その際は、出典を明記してくださるようお願いいたします。
ただし、これらのプログラムは無保証であり、使用したことにより生じた損害について、作者「広井誠 (Makoto Hiroi)」は一切の責任を負いません。また、これらのプログラムを販売することで利益を得るといった商行為は禁止いたします。