1から始まるjuliaプログラミング...julia...

17
1 から始める Julia プログラミング 進藤 裕之 佐藤 建太 共著 コロナ社

Upload: others

Post on 24-Jul-2020

0 views

Category:

Documents


0 download

TRANSCRIPT

1から始める

Juliaプログラミング

進藤 裕之佐藤 建太

共著

コロナ社

コロ

ナ社

ま え が き

世の中は第三次人工知能(AI)ブームを迎え,ビッグデータ,データサイエン

ス,機械学習などのワードが世間を賑わせている。そのような背景の中,Python

やMATLABなどのプログラミング言語や数値計算ソフトウェアが人気を集め

ており,手軽に扱えて高速に動作するプログラミング言語は,さまざまな分野

で今後ますます重要性を増していくだろう。

あらゆるプログラミング言語には一長一短があり,どのプログラミング言語

を選択するかは,つねに悩ましい問題である。スクリプト言語は,型を明示せ

ず簡潔に記述できるが,場合によっては動作速度が十分でない。一方,コンパ

イル型の言語は型にうるさく,しばしば冗長な記述となるが,実行速度はスク

リプト言語と比較して十分に速い。このようなジレンマを解消できるプログラ

ミング言語の一つとして,近年では Juliaが注目を集めている。

Juliaは,アメリカのマサチューセッツ工科大学(MIT)で開発された新し

いプログラミング言語で,その最大の特徴は,簡潔な文法と高速な実行速度が

両立している点にある。それ以外にも,Lispから影響を受けたと思われる多重

ディスパッチやメタプログラミングなど,他のプログラミング言語にはあまり

ない魅力的な機能が満載である。

「Juliaっていう名前を最近よく聞くけれど,どんなプログラミング言語なん

だろう?」

「PythonやMATLABとどこが違うの?」

そんな声も周囲からよく聞かれるようになってきた。

そこで,本書では Juliaを初めて学ぶ人のために,Juliaの言語設計や基本的

な文法について 1から説明し,Juliaについて広く知っていただくことを第一

の目的としている。また,後半では,Juliaをさらに使いこなすために,主要な

コロ

ナ社

ii ま え が き

外部パッケージの紹介や,高速化のためのプロファイリングやコード最適化な

ど,やや高度な内容についても解説を行っている。そのため,すでに Juliaを

使用しているユーザにとっても有益な情報となることを期待している。

私が最初に Juliaに出会ったのは 2012年頃で,まだバージョンは 0.2であっ

た。基本的な機能は当時から備わっていたが,新しい文法の導入や仕様の改変

に積極的であり,これまでは一部の企業やアカデミアでの利用に留まってきた。

しかし,ここ数年で Juliaのバージョンは 1.0に到達し,多くの外部パッケージ

が精力的に開発され,それに伴いユーザコミュニティも大きく拡大した。Julia

を学ぶなら,まさにいまが非常によいタイミングであると思う。

本書が,Juliaについて学ぶための入門書として,また,Juliaへの一層の興

味をかき立てるための一助となれば幸いである。

最後に,貴重な時間を割いて執筆に協力していただいた共著者の佐藤建太氏,

Juliaに関するさまざまな情報交換をさせていただいた JuliaTokyoのメンバー,

そしてこの企画を実現していただいたコロナ社の方々に深く感謝する。

2020年 2月

進藤 裕之

コロ

ナ社

目 次

1. Julia 入 門

1.1 次世代のプログラミング言語 Julia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1

1.1.1 Julia と は . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1

1.1.2 本 書 の 構 成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2

1.1.3 なぜ Juliaが必要なのか? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4

1.2 インストール . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6

1.2.1 REPL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8

1.2.2 Jupyter Notebook . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10

1.2.3 エディタとIDE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11

1.3 Julia の 情 報 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14

1.3.1 Julia公式ページ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15

1.3.2 Juliaのソースコード. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15

1.3.3 Julia Discourse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15

1.3.4 JuliaCon . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16

1.3.5 JuliaTokyo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16

2. Juliaの言語機能

2.1 Julia の 基 本 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17

2.1.1 変 数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17

2.1.2 プリミティブ型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18

コロ

ナ社

iv 目 次

2.1.3 任意精度演算 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21

2.1.4 定 数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21

2.1.5 基本的な演算子 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21

2.1.6 更 新 演 算 子 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22

2.1.7 複 素 数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22

2.1.8 文 字 列 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23

2.1.9 Unicode文字列 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24

2.1.10 文字列の関数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26

2.1.11 正 規 表 現 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27

2.2 制 御 構 文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28

2.2.1 条 件 評 価 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28

2.2.2 短 絡 評 価 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29

2.2.3 ル ー プ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30

2.2.4 ���/�����/����� . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31

2.3 関 数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32

2.3.1 可 変 長 引 数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34

2.3.2 オプショナル引数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36

2.3.3 キーワード引数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37

2.3.4 匿 名 関 数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37

2.4 型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38

2.4.1 型 の 宣 言 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40

2.4.2 型の階層関係 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41

2.4.3 � ��� 型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43

2.4.4 複 合 型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44

2.4.5 � 型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47

2.4.6 パラメトリック型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47

2.4.7 パラメトリック型の階層関係 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50

2.4.8 抽象型のパラメトリック型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52

コロ

ナ社

目 次 v

2.5 コレクション . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53

2.5.1 タ プ ル . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54

2.5.2 名前付きタプル . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55

2.5.3 リ ス ト . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56

2.5.4 辞 書 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58

2.5.5 集 合 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59

2.5.6 コレクション共通の関数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60

2.5.7 コレクションのイテレーション . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60

2.6 多 次 元 配 列 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62

2.6.1 初 期 化 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63

2.6.2 基本的な操作 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66

2.6.3 インデクシング . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67

2.6.4 多次元配列の演算 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68

2.6.5 ブロードキャスティング . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68

2.6.6 ���,������,����� . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71

2.6.7 サ ブ 配 列 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72

2.7 モ ジ ュ ー ル . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73

2.7.1 モジュールの機能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73

2.7.2 既存モジュールの利用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74

2.7.3 ���文の注意点 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76

2.7.4 新しいモジュールの定義 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76

2.7.5 モジュールの相対パス指定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79

2.7.6 ファイルの分割 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80

2.7.7 他のモジュールで定義された関数の拡張 . . . . . . . . . . . . . . . . . . . . . . . . 81

2.8 メタプログラミング . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82

2.8.1 シ ン ボ ル . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83

2.8.2 構文木の表現 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83

2.8.3 構文木の補間 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86

コロ

ナ社

vi 目 次

2.8.4 構文木の評価 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86

2.8.5 マクロの機能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88

2.8.6 標準ライブラリにあるマクロ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90

2.8.7 マクロの定義 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91

2.8.8 識別子の変換規則 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93

2.9 C言語の呼出し . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95

2.9.1 ����� 構 文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95

2.9.2 ポインタの受渡し . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97

2.9.3 構造体の受渡し . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100

2.10 外部プログラムの呼出し . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101

2.10.1 コマンドの作成・実行 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101

2.10.2 コマンド実行の注意点 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103

2.10.3 パイプライン処理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104

2.10.4 より発展的なコマンドの作成方法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104

2.11 パ ッ ケ ー ジ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106

2.11.1 パッケージ管理の基本 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107

2.11.2 プロジェクトのパッケージ管理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109

2.11.3 プロジェクトの有効化 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111

2.11.4 パッケージの作成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112

3. Juliaライブラリの使い方

3.1 線 形 代 数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117

3.1.1 ベクトルの演算 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117

3.1.2 行 列 の 演 算 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118

3.1.3 行 列 の 種 類 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119

3.1.4 行 列 分 解 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120

3.1.5 BLAS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121

コロ

ナ社

目 次 vii

3.2 ファイル入出力 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123

3.2.1 ファイルとストリーム . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123

3.2.2 シリアライズとデシリアライズ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125

3.2.3 JLD2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127

3.2.4 JSONファイルの入出力 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128

3.2.5 XMLファイルの入出力 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129

3.3 他言語の呼出し . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131

3.3.1 Pythonの呼出し準備 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131

3.3.2 Python関数の呼出し . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132

3.3.3 Pythonモジュールの利用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133

3.3.4 Rの呼出し準備 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134

3.3.5 R関数の呼出し . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135

3.3.6 Rオブジェクトの操作 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136

3.3.7 REPLの Rモード . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138

3.4 ドキュメンテーション . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139

3.4.1 docstringの読み方 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139

3.4.2 Markdown . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140

3.4.3 関数の docstring . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142

3.4.4 関数以外の docstring . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145

3.4.5 Documenter.jl . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145

3.4.6 Documenter.jlの使用例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146

3.5 可 視 化 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148

3.5.1 PyPlot.jlのインストール . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149

3.5.2 基本的なプロット . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150

3.5.3 プロットの編集 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154

3.5.4 サブプロットの作成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157

3.5.5 オブジェクト指向インタフェース . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158

コロ

ナ社

viii 目 次

4. Juliaの高速化

4.1 プロファイリング . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 160

4.1.1 高速化の事前準備 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 160

4.1.2 実行時間の計測 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162

4.1.3 実行時間のプロファイリング . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165

4.1.4 メモリ割当てのプロファイリング . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167

4.2 最適化しやすいコード . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169

4.2.1 コードの書き方による性能差 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169

4.2.2 コンパイラの概要 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170

4.2.3 型に不確実性のあるコード . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174

4.2.4 グローバル変数への参照 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177

4.2.5 コレクションや構造体での型不確実性 . . . . . . . . . . . . . . . . . . . . . . . . . . . 179

4.2.6 メモリレイアウト . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 180

4.3 メモリ割当ての削減 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182

4.3.1 配列のメモリ割当て . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182

4.3.2 配列の再利用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183

4.3.3 ブロードキャスティングによるメモリ削減 . . . . . . . . . . . . . . . . . . . . . . 184

4.3.4 特殊な配列型の利用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185

4.4 コンパイラへのヒント . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 187

4.4.1 境界チェックの省略 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 187

4.4.2 浮動小数点数演算の高速化 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 188

4.4.3 関数のインライン化 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190

4.4.4 ����マクロによる並列処理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192

索 引 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193

コロ

ナ社

1 Julia 入 門

1.1 次世代のプログラミング言語Julia

Julia(ジュリア)は,マサチューセッツ工科大学のAlan Edelman教授らの

グループで開発された汎用プログラミング言語であり,近年,人工知能やデー

タサイエンス分野で大きな注目を集めている。

1.1.1 Julia と は

Juliaの特徴を一言で表すと,「コードが簡潔で高水準な記述ができる」こと

と,「プログラムの実行速度が速い」ことを両立している点にある。もう少し大

袈裟な言い方をすれば,「Pythonのように書けて,Cのように動く」のである。

これは,命令型,関数型,オブジェクト指向といったさまざまなプログラミン

グパラダイムを取り入れた Juliaの言語設計と,LLVMに基づく just-in-time

(JIT)コンパイラなどによって実現されている。ほかにも,Juliaには,多重

ディスパッチやメタプログラミングなどの柔軟で強力な機能が備えられており,

まさに時代の先端をいく次世代のプログラム言語であるといえる。

科学技術計算の分野では,古くは FORTRANに始まり,Cや C++といっ

た低水準な記述に基づくプログラミング言語が用いられてきた。これらは静的

型付けの言語で実行速度が速いという反面,コードが冗長で複雑になりやすく,

メンテナンス性はあまり高いとはいえない。

一方,近年では,Python,R,MATLABといったプログラミング言語が人

コロ

ナ社

2 1. Julia 入 門

気を集めている。これらは動的型付け言語であり,簡潔で高水準なコードを書

くことができるので生産性が高い反面,プログラムの実行効率について細かい

調整をすることが難しく,実行速度についてはあまり多くを期待できない。

もちろん,どんなプログラミング言語も一長一短ではあるけれど,生産性と

効率性を兼ね備えた理想的なプログラミング言語はないだろうか?

その答えの一つが Juliaである。

Juliaは動的型付けの言語であるが,型に関する豊富な機能を持ち合わせてお

り,生産性と効率性がバランスよく両立されている。

Juliaのおもな特徴をまとめると,以下のようになる。

• オプショナルな型宣言,リッチな型システム,動的型付け

• 多重ディスパッチと呼ばれる,引数の型の組合せに応じて関数の振舞い

を定義できる仕組み

• just-in-time(JIT)コンパイラと LLVMバックエンドによる高速な実行

• Lispのようなマクロやその他のメタプログラミング機能

• Cなどの静的型付け言語に迫る速い実行速度

Juliaは,2012年にバージョン 0.1が発表されて以降,GitHub上で精力的に

開発が進められ,2018年にはついにバージョン 1.0が発表された。これまで,

Juliaは新しい文法の導入や仕様の改変に積極的であったため,一部の企業やア

カデミアでの導入に留まってきたが,バージョン 1.0の発表によって後方互換

性の問題が解消され,これを機にますます多くのユーザや開発者が参入するこ

とが期待される。

1.1.2 本 書 の 構 成

筆者は,バージョン 0.2のときからの Julia愛好者であり,おもにコンピュー

タサイエンスの研究開発や,日常的なスクリプト言語として Juliaを用いてい

る。当時は周囲に Juliaを使用している人は皆無であったが,最近ではコミュ

ニティの成長に伴って興味を持つ人が増えており,Juliaに対する認知度が日々

コロ

ナ社

1.1 次世代のプログラミング言語 Julia 3

向上していると感じる。

本書は,そんな次世代のプログラミング言語である Julia について紹介し,

その機能や魅力を広く伝えることを目的とした書籍である。前半では,おもに

Juliaの基本的な文法や使い方について説明し,Juliaで簡単なプログラムが書

けるようになることを目的としている。後半では,より実践的な内容として,標

準ライブラリには含まれない数値計算やデータ可視化などのパッケージを活用

したプログラミングについて説明する。

前述のように,Juliaは,命令型,関数型,オブジェクト指向などのプログラ

ミングパラダイムを取り込んだマルチパラダイム言語であり,「Pythonのよう

に書けて,Cのように動く」を実現する設計思想を学ぶことは,Juliaの理解だ

けに留まらず,他のあらゆるプログラミング言語をより深く理解することにも

つながるだろう。

一方で,Pythonのように豊富なライブラリ群を持つ言語と比較して,まだ

十分に成熟していない領域が存在することも確かである。そのため,必要に応

じて Cや Pythonなどの言語と連携することも必要となる。Juliaには,Cや

Pythonなどの言語と連携できる機能やライブラリが存在するため,それらの

使い方についても説明していく。

Juliaは動的型付けの言語であるため,すでに PythonやRubyなどの動的型

付け言語を学んだ人であれば,比較的容易に習得できるだろう。もちろん,本

書は最初のプログラミング言語として Juliaを選択する人にも理解できるよう

に書かれているので,安心して読み進めてほしい。

本書は Juliaの一通りの機能をカバーしているが,より詳細な機能の説明に

関しては,Juliaの公式ドキュメンテーション†を参照することをおすすめする。

なお,本書で紹介するすべての Juliaコードは,Juliaのバージョン 1.2で動作

確認を行っている。

† ��������� ����������� ���

コロ

ナ社

4 1. Julia 入 門

1.1.3 なぜ Julia が必要なのか?

2012年の Julia blogに,Julia作者による動機がつづられているので,その

和訳を紹介する†。

なぜ僕らは Juliaを作ったのか

Jeff Bezanson, Stefan Karpinski, Viral B. Shah, Alan Edelman

2012年 2月 14日(火)

一言でいえば,僕らは欲張りだからだ。

僕らはMATLABのパワーユーザだ。何人かはLispハッカーだし,Python使

いやRuby使いも,Perlハッカーだっている。髭が生える前からMathematica

を使っていた奴もいるし,まだ髭が生えてない奴だっている。僕らは異常な

ほど R のプロットを作ってきたし,無人島に一つだけ持っていくなら C が

いい。

これらの言語はどれも素晴らしいし強力で,みんな大好きだ。だけど,僕ら

がすること,科学技術計算,機械学習,データマイニング,大規模な線形代数,

分散や並列計算では,どれもいくつかの点では完璧だけれど,それ以外では使

い物にならない。どれもトレードオフなんだ。

僕らは欲張りだ。これじゃあ満足できない。

僕らがほしいのは,緩いライセンスのオープンソースで,Cの速度と Ruby

の動的さがあって,Lispのような本当の意味でのマクロを持つ同図像性の言語

で,わかりやすくて,MATLABのように見慣れた数学の記述ができる言語だ。

しかも,Pythonのように汎用的で,Rの統計処理のように簡単で,Perlの文

字列処理のように自然で,MATLABの線形代数のように強力で,シェルのよ

うにプログラムをくっつけるのが得意なものがほしい。学ぶのが超簡単で,超

† ���������������� ����� �����������������������������

コロ

ナ社

1.1 次世代のプログラミング言語 Julia 5

慎重なハッカーも満足して,インタラクティブでコンパイルできるのがいい。

(Cと同じくらい速いことが必要なのはもういった?)

やたらと注文が多いのはわかっているけれど,Hadoop のような分散コン

ピューティングもほしい。もちろん,何キロバイトもの JavaやXMLの決まり

文句を書きたくないし,バグを見つけるのに何百ものマシンにあるギガバイトの

ログファイルを調べたくない。いくつにも重なった不可解な複雑さはいらない

し,単純なスカラーのループを書いたら,一つのCPUにあるレジスタを使うだ

けのタイトな機械語にコンパイルされてほしい。‌ !" ‌と書いたら,いくつもの計

算をいくつものマシンで実行して,膨大な行列積を一斉に計算してほしいんだ。

型だって必要ないなら書きたくない。でも多相な関数がいるときには,ジェ

ネリックプログラミングでアルゴリズムを一度だけ書いて,それをすべての型

に適用したい。たくさんのメソッド定義から引数の型によって最適なものを選

んでくれる多重ディスパッチを使って,まったく違った型にも共通の機能を提

供できるようにしたい。こんなにパワフルにもかかわらず,シンプルですっき

りした言語がいい。

これって多くを望みすぎているわけじゃないよね?

僕らは言い訳ができないほど欲張りだとわかっているけれど,それでもすべ

てがほしいんだ。2年半ほど前,僕らはこの欲張りな言語を作り始めた。まだ

完成していないけれど,もうすぐ 1.0のリリースのときだ。僕らの作った言語

の名前は Julia。すでに僕らの無作法な要求の 90%に応えてくれているけれど,

さらに形作るためには,僕ら以外の無作法な要求も必要だ。だから,もし君も

僕らと同じように欲張りで,理不尽で,注文の多いプログラマーなら,これを

ぜひ試してみてほしいんだ。

この blogから 6年半が経ち,この欲張りな言語 Juliaは,ようやくバージョ

コロ

ナ社

索 引

【い,え,お】 イテレーション 60

インライン化 190

衛生的マクロ 93

エディタ 11

オプショナル引数 36

【か】 外部プログラム 101

可視化 148

型システム 38

型推論 172

型注釈 40

型の階層関係 41

型パラメータ 48

型不確実性 179

可変長引数 34

関 数 32

【き】 機械語 173

境界チェック 187

行 列 62

行列分解 120

キーワード引数 37

【く】 クォート 84

具体型 41

グローバル変数 177

【こ】 構文木 83

構文木の補間 86

コマンド 101

コレクション 53

コンパイラ 170, 187

【さ】 サブ配列 72

三項演算子 29

参 照 98

【し】 シェル 103

辞 書 58

集 合 59

条件評価 28

シリアライズ 125

シンボル 83

【す,せ,そ】 ストライド 63

ストリーム 123

正規表現 27

線形代数 117

相対パス 79

【た】 多次元配列 62

多重ディスパッチ 40, 81

タプル 54

短絡評価 29

【ち,て】 抽象型 41

抽象構文木 84

デシリアライズ 125

展 開 88

【と】 統計的プロファイリング 165

統合開発環境 11

ドキュメンテーション 139

匿名関数 37

ドット演算子 68

【な,に】 名前空間 73

名前付きタプル 55

任意精度整数 21

任意精度浮動小数 21

【は】 パイプライン 104

配列の初期化 63

パッケージ 106

パッケージモード 10

パラメトリック型 47

【ひ】 非標準文字列リテラル 89

評 価 86

標準ライブラリ 107

【ふ】 ファイル 123

——の分割 80

フィールド 45

複合型 44

複素数 22

コロ

ナ社

194 索 引

浮動小数点数演算 188

プリミティブ型 18

プロジェクトの有効化 111

ブロードキャスティング68, 184

プロファイリング 160

【へ,ほ】 ベクトル 62

ヘルプモード 9

変 数 17

ポインタ 97

【ま,め】 マクロ 88

メタプログラミング 82

メモリレイアウト 180

メモリ割当て 167, 182

【も】 モジュール 73

文字列 23

——の補間 24

【り,る】 リスト 56

ループ 30

� �

【A,B】 Atom 12

BLAS 121

【C】 ����� 31

����� 構文 95

column-major order

62, 180

【D,E】 docstring 139

�C�� 関数 86

�%� �� 文 77

【F】 ����� 31

� � 文 30

���� 32

【H】 HDF5 127

hygienic マクロ 93

【I】 immutable 46

�� �� 文 76

����� 関数 80

【J】 JSON 128

Julia モード 9

Juno 12

Jupyter Notebook 10

【L,M,N】 LLVM 中間表現 173

I������� �� 109

Markdown 140

Matplotlib 149

� ���� 76

mutable 46

������� ������ 46

��� 43

【P】 -� ������ �� 109

Python 131

【R】 R 134

REPL 8

����� 32

row-major order 62, 180

【S】 SIMD 192

������ 45

【T】 TOML 110

��� 31

2���� 34

【U】 Unicode 24

� 47

��� 文 75

UUID 111

【W,X】 ���� 文 30

XML 129

コロ

ナ社

—— 著 者 略 歴 ——

進藤 裕之(しんどう ひろゆき)2007年 早稲田大学先進理工学部電気・情報生命工学科卒業2009年 早稲田大学大学院先進理工学研究科修士課程修了(電気・情報生命専攻)2009年 NTT コミュニケーション科学基礎研究所研究員2013年 奈良先端科学技術大学院大学情報科学研究科博士後期課程修了(自然言語処理学専攻),

博士(工学)2014年 奈良先端科学技術大学院大学助教2019年 MatBrain 株式会社代表取締役(兼任)

現在に至る

佐藤 建太(さとう けんた)2014年 東京大学農学部生命化学・工学専修卒業2016年 東京大学大学院農学生命科学研究科修士課程修了(農学専攻)2019年 東京大学大学院農学生命科学研究科博士課程単位取得退学2019年 理化学研究所生命機能科学研究センター勤務

現在に至る

1から始める JuliaプログラミングLearn Julia Programming from Scratch

c© Hiroyuki Shindo, Kenta Sato 2020

2020 年 4 月 17日 初版第 1 刷発行 ★2020 年 5 月 5 日 初版第 2 刷発行

著 者検印省略

進 藤 裕 之佐 藤 建 太

発 行 者 株式会社 コ ロ ナ 社代 表 者 牛 来 真 也

印 刷 所 三 美 印 刷 株 式 会 社製 本 所 有限会社 愛千製本所

112–0011 東京都文京区千石 4–46–10

発 行 所 株式会社 コ ロ ナ 社CORONA PUBLISHING CO., LTD.

Tokyo Japan

振替 00140–8–14844・電話(03)3941–3131(代)ホームページ https://www.coronasha.co.jp

ISBN 978–4–339–02905–5 C3055 Printed in Japan (齋藤)

<出版者著作権管理機構 委託出版物>本書の無断複製は著作権法上での例外を除き禁じられています。複製される場合は,そのつど事前に,出版者著作権管理機構(電話 03-5244-5088,FAX 03-5244-5089,e-mail: [email protected])の許諾を得てください。

本書のコピー,スキャン,デジタル化等の無断複製・転載は著作権法上での例外を除き禁じられています。購入者以外の第三者による本書の電子データ化及び電子書籍化は,いかなる場合も認めていません。落丁・乱丁はお取替えいたします。

コロ

ナ社