実行速度が速く、機械学習やデータサイエンスの分野で人気のプログラミング言語Juliaの使い方について、入門者向けにサンプルを交えて解説します。

目次

Juliaのインストール

Juliaの公式サイト(https://julialang.org/)でDownloadメニューをクリックして、Juliaのインストーラをダウンロードする。

JuliaをWindows 10にインストールする

JuliaをWindows 10にインストールする場合、ダウンロードしたインストーラをダブルクリックして実行する。

Juliaのインストーラはいたってシンプルで、インストール先のフォルダ名を聞いてくるだけである。

Juliaのスクリプト(*.jl)をエクスプローラでダブルクリックして起動したり、Windows PowerShellから起動するためには、Juliaの実行ファイル(julia.exe)のパスを環境変数PATHに含める必要がある。

環境変数PATHの設定は、Juliaのインストーラではやってくれないので、手動で設定する必要がある。

Windows 10で環境変数を設定する手順は次のとおり。

  1. スタートメニューから [Windows システムツール] - [コントロール パネル] をクリックしてコントロールパネルを開く。
  2. コントロールパネルで [システムとセキュリティ] - [システム] をクリックする。
  3. [システムの詳細設定]をクリックしてシステムのプロパティを開く。
  4. システムのプロパティで「環境設定」ボタンをクリックする。
  5. 環境変数の一覧が表示されるので、変数「PATH」を選択して「編集」ボタンをクリックする。
  6. 「新規」ボタンをクリックして、julia.exeがあるフォルダ(C:\Users\tsuka\AppData\Local\Julia-1.0.1\binなど)を入力して、OKボタンをクリックする。

UbuntuにJuliaをインストールする

UbuntuにJuliaをインストールするには、ダウンロードしたファイルをtarコマンドで展開する。

tar xzf julia-1.1.0-linux-x86_64.tar.gz

環境変数PATHにJuliaのbinディレクトリを追加する。

Juliaのバージョンアップ

既にインストールされているJuliaをアップデートするには、既存のJuliaをアンインストールしてから新しいバージョンのJuliaをインストールする。

Juliaのバージョンが変わるとインストール先のパスが変わるので、環境変数PATHも変更が必要になる。

Juliaの起動と終了

Windowsの場合、スタートメニューからJuliaをクリックするとJuliaのREPLが起動する。

JuliaのREPLを起動すると、バナーとコマンド入力を促すプロンプトが表示される。

Julia

Juliaを終了させるには、Ctrl + D または exit() とタイプする。

Windows PowerShellコマンドプロンプトからJuliaを起動するには、julia.exeを実行する。

ファイルの実行コードを非対話的に実行するには、julia.exeの引数に実行するスクリプトファイル名と引数を指定する。

C:> julia.exe script.jl arg1 arg2

スクリプトの名前はグローバル定数PROGRAM_FILE、スクリプトの引数はグローバル定数ARGSで参照できる。

グローバル定数 説明
PROGRAM_FILE スクリプト名
ARGS スクリプトの引数
# スクリプト名を表示
println(PROGRAM_FILE)

for arg in ARGS
  # スクリプトの引数を表示
  println(arg)
end

Juliaの起動オプションには次のものを指定できる。

オプション 説明
--banner={yes|no|auto} 起動時のバナーを有効化または無効化する。
--color={yes|no|auto} カラーテキストを有効化または無効化する。
-h ヘルプ情報を表示する。
--help
-q バナーを表示せず、REPL警告を抑制する。
--quiet
-v バージョン情報を表示する。
--version

REPL

REPLとはRead-eval-print loopの略称で、対話型評価環境のことである。Juliaを起動するとき、引数でソースコードを指定しないと、REPLが起動する。

REPLでは記号を簡単に入力できる機能がある。たとえば、\piと入力してタブキーを押すと、πに変換される。

julia> π
π = 3.1415926535897...

julia>

他にも次の文字を変換できる。

入力文字列 タブキーで変換できる記号
\Alpha Α
\alpha α
\beta β
\gamma γ
\delta δ
\delta δ
\epsilon ϵ
\zeta ζ
\eta η
\theta θ
\iota ι
\kappa κ
\lambda λ
\mu μ
\nu ν
\pi π
\rho ρ
\sigma σ
\tau τ
\upsilon υ
\phi ϕ
\chi χ
\psi ψ
\omega ω

Juliaを電卓として使う

Juliaのプロンプトに計算式を入力してEnterキーを押下すると、計算結果が表示される。

julia> 1 + 2 * 3
7

julia>

Juliaの演算子

算術演算子

演算子 説明
x + y 加算
x - y 減算
x * y 乗算
x / y 除算
x ÷ y 整数除算
x ^ y
x % y 剰余

ブール演算子

演算子 説明
!x 否定

ビット演算子

演算子 説明
~x ビット否定
x & y 論理積
x | y 論理和
x ⊻ y 排他的論理和
x >>> y 論理右シフト
x >> y 算術右シフト
x << y 左シフト

代入演算子

演算子 説明
x = y 代入
x += y 加算代入
x -= y 減算代入
x *= y 乗算代入
x /= y 除算代入
x ÷= y 整数除算代入
x %= y 剰余代入
x ^= y 乗代入
x &= y 論理積代入
x |= y 論理和代入
x ⊻= y 排他的論理和代入
x >>>= y 論理右シフト代入
x >>= y 算術右シフト代入
x <<= y 左シフト代入

比較演算子

比較演算子とは2つの値の関係性を比較して、正しければ真(true)、間違っていれば偽(false)と評価する演算子であり、関係演算子とも呼ばれる。if文やwhile文で使われることが多い。

Juliaの比較演算子はPythonなど他のプログラミング言語と似ているが、Unicodeを使って数学の記号をそのまま使えるようにしているので、≠(ノットイコール)などが使えるのが特徴である。

演算子 説明
x == y 等しい
x != y 等しくない
x ≠ y
x < y 小さい
x <= y 小さいか等しい
x ≤ y
x > y 大きい
x >= y 大きいか等しい
x ≥ y

Juliaのデータ型

Juliaのデータ型には次のものがある。

整数型

符号 バイト数 最小値 最大値
Int8 あり 8 -27 27 - 1
UInt8 なし 8 0 2^8 - 1
Int16 あり 16 -2^15 2^15 - 1
UInt16 なし 16 0 2^16 - 1
Int32 あり 32 -2^31 2^31 - 1
UInt32 なし 32 0 2^32 - 1
Int64 あり 64 -2^63 2^63 - 1
UInt64 なし 64 -0 2^64 - 1
Int128 あり 128 -2^127 2^127 - 1
UInt128 なし 128 0 2^128 - 1
Bool N/A 8 false (0) true (1)

浮動小数点型

精度 バイト数
Float16 half 16
Float32 single 32
Float64 double 64

ローカル変数のデータ型

ローカル変数を宣言するときに、データ型を指定することができる。

local x::Int32

関数の引数や戻り値のデータ型

関数の引数や戻り値のデータ型を指定することができる。

function f(x::UInt32)::Float64
  return Float64(pi * x)
end

データ型の確認

Juliaのデータ型はtypeof関数で確認できる。

julia> typeof(1)
Int64

julia> typeof(1.0)
Float64

julia> typeof(true)
Bool

julia> typeof('A')
Char

julia> typeof('あ')
Char

julia> typeof("ABC")
String

julia>

データ型の変換

型変換関数を使ってデータ型を変換することができる。

julia> Float64(pi)
3.141592653589793

julia> Float64(pi * 2)
6.283185307179586

julia> BigFloat(pi)
3.141592653589793238462643383279502884197169399375105820974944592307816406286198

julia>

型変換関数を使う方法のほかに、データ型を指定してもよい。

julia> (pi * 2)::Float64
6.283185307179586

julia>

コメント

Juliaのスクリプトにはコメントを埋め込むことができる。コメントとはスクリプトの注釈で、プログラムの実行には影響を及ぼさない。

#以降は行末までコメントとなる、これを単一行コメントという。

radius = 2 #半径

#=から=#までの範囲もコメントとなる、これを複数行コメントといい、複数の行にわたってコメントを記述できる。

#=
  円の面積
  引数 半径
  戻り値 面積
=#
function area(r)
  r * r * π
end

文字列

Julia言語で文字列リテラルを表すには、文字列を2重引用符で囲む。

str = "Hello, world!"

2重引用符を含む文字列の場合は、文字列を3つの2重引用符で囲む。

str = """Say "Hello, world!"."""

文字列を格納した変数や文字列リテラルは、配列として使うことができる。他の多くのプログラミング言語では配列の添字は0から始まるが、Juliaでは配列の添字は1から始まる。

println("Hello, world!"[1])

配列の添字は範囲指定することもできる。たとえば2文字目から4文字目までの場合は次のようにする。

println("Hello, world!"[2:4])

文字列の最後の文字を参照するには、配列の特殊な添字 end を使う。

str = "Hello, world!"
println(str[end])

Juliaで文字列を表示するには、printlnを使用する。

julia> println("Hello World!")
Hello World!

julia>

文字列の結合

Juliaで複数の文字列を結合するには、2通りのやり方がある。

stirng関数を使って文字列を結合する

string関数は、渡されたすべての引数を連結した文字列を返す。引数に文字列以外の数値などを渡しても、キャストされる。

url = "http://itref.fc2web.com/"

# "<loc>http://itref.fc2web.com/</loc>"
loc = string("<loc>", url, "</loc>")

*演算子を使って文字列を結合する

*」は文字列を結合する演算子である。被演算子(オペランド)に文字列以外を指定することはできない。

url = "http://itref.fc2web.com/"

# "<loc>http://itref.fc2web.com/</loc>"
loc = "<loc>" * url * "</loc>"

*演算子を使うとプログラムコードがすっきりして見やすくなるが、文字列以外は明示的にキャストする必要があることに注意する。

文字列の置換

Julia言語で文字列を置き換えるには、replace関数を使う

s = "Hello, world!"
replace(s, "world" => "Japan")
println(s)

変数

変数とは値に関連付けられた名前で、後で使用するために値を保存する場合に便利である。

Julia言語の変数に型宣言は不要で、変数名の大文字と小文字は区別される。

julia> x = 10
10

julia> x = "Hello World!"
Hello World!

julia>

多くのプログラミング言語では、変数に使える文字をASCII/ISO 8859-1 (Latin-1)の英数字記号に限っているが、Julia言語は変数名にUnicodeを使うことができるユニークな特徴がある。そのため、変数名に日本語やさまざまな記号を使うことができる。

長さ = 5
println(長さ)

♡ = "I love you"
println(♡)

制御構造

制御構造とは、条件によって処理を分岐したり、条件を満たす間は処理を繰り返すなど、処理の流れを制御する構文である。

制御構造 説明
if 条件によって処理を分岐する。
while 条件を満たす間、処理を繰り返す。
for あらかじめ決まった回数分、処理を繰り返す。

if

Juliaにおいて、条件によって処理を分岐させるにはif分を使う。

if x > y
  println("xはyより大きい")
elseif x < y
  println("xはyより小さい")
else
  println("xはyと等しい")
end

Juliaでは三項演算子を使うことができる。

condition ? expr1 : expr2

conditionがtrueの場合はexpr1が評価され、falseの場合はexpr2が評価される。

三項演算子のサンプルを示す。

println(x > y ? "xはyより大きい" : x < y ? "xはyより小さい" : "xはyと等しい")

while

while文は条件を満たす間、処理を繰り返す制御構造である。

i = 1
# iが3以下の間は繰り返す
while i <= 3
  println(i)
  global i += 1
end

繰り返しを途中で抜けるには、break文を使用する。

i = 1
# 問答無用で繰り返す
while true
  println(i)
  # iが3以上なら繰り返しを抜ける
  if i >= 3
    break
  end
  global i += 1
end

for文

あらかじめ決まった回数だけ繰り返し処理をJuliaで行うには、for文を使う。

たとえば、1から10までの数字を表示するには、次のようにする。

for i = 1:10
  println(i)
end

ここでの1:10は範囲オブジェクトであり、1から10までの連続した数値を表している。

1から2刻みで9まで(1, 3, 5, 7, 9)繰り返す場合は、範囲オブジェクトを1:2:9とする。

for i = 1:2:9
  println(i)
end

数値の集合をfor文で使うには、次のようにする。

for i in [1, 3, 2]
  println(i)
end

Juliaのfor文で文字列の集合を使うには、を使う。

for s ∈ ["foo","bar","baz"]
  println(s)
end

関数

Juliaで関数を定義するための基本的な構文は次のとおり。

function f(x, y)
  x + y
end

関数は次のように簡潔な構文で記述することもできる。

f(x, y) = x + y

Juliaの関数では、評価された最後の式が関数の戻り値として返される。他の多くのプログラミング言語のように、戻り値を return で明示することもできる。

function f(x, y)
  return x + y
end

Juliaでは数式をそのまま記述できるようにする方針なので、関数によって返される値を return で明示する必要はない。しかし、関数の戻り値をソースコード上で検索しにくくなるため、あえて明示する方が望ましい。

標準エラーへ出力する

標準エラーへ出力するには、標準エラーストリームを参照するグローバル変数stderrを使う。

標準エラーへ改行ありで出力するには、println関数の第1引数にstderrを指定する。

println(stderr, "ファイルのオープンに失敗しました。")

標準エラーへ改行なしで出力するには、print関数またはwrite関数の第1引数にstderrを指定する。

print(stderr, "ファイルのオープンに失敗しました。")
write(stderr, "ファイルのオープンに失敗しました。")

Juliaであらかじめ定義されている定数

Juliaでは次の定数があらかじめ定義されている。

定数 説明
ARGS Juliaに渡されるコマンドライン引数の文字列としての配列
JULIA_HOME 実行可能ファイルjuliaを含むディレクトリのフルパス
PROGRAM_FILE コマンドラインからJuliaに渡されたスクリプト名
VERSION Juliaのバージョン

Juliaプログラムに渡されたコマンドライン引数を取得する

Juliaプログラムに渡されたコマンドライン引数は、ARGS定数に文字列の配列として格納されている。

for arg in ARGS
  println(arg)
end

上記プログラムを実行すると、スクリプトに渡した引数が表示される。

$ julia example.jl foo bar baz
foo
bar
baz
$

JULIA_HOME

juliaの実行可能ファイルを含むディレクトリのフルパスを取得するには、JULIA_HOME定数を参照すればよい。

try
  println(JULIA_HOME)
catch e
  if isa(e, UndefVarError)
    println("現在のスコープ内で", e.var, "は定義されていません。")
  end
end

JULIA_HOMEが定義されていない場合、UndefVarErrorがスローされる。

PROGRAM_FILE

コマンドラインからJuliaに渡されたスクリプト名を取得するには、PROGRAM_FILE定数を参照すればよい。

println(PROGRAM_FILE)

上記プログラムを実行すると、Juliaで実行したスクリプト名が表示される。

$ julia example.jl
example.jl
$

VERSION

Juliaのバージョンを取得するには、VERSION定数を参照すればよい。

println(VERSION)

上記プログラムを実行すると、Juliaのバージョンが表示される。

$ julia example.jl
1.1.0
$

Juliaのバージョンを判定するには、VERSION定数をバージョン番号リテラルと比較する。バージョン番号リテラルは、文字列の前にvを付ける。

if v"1.1" <= VERSION < v"1.2-"
  println("バージョン1.1.x")
end

Juliaからファイルを操作する

ファイルを開く

Juliaでファイルをオープンするには、open関数を使う。

try
  f = open("example.txt")
  close(f)
catch
  println("ファイルのオープンに失敗しました。")
end

ファイルのオープンに失敗すると、SystemError例外がスローされる。

ファイルに書き込むためにオープンするには、open関数の第2引数に"w"オプションを指定する。

f = open("example.txt", "w")

ファイルから読み込む

ファイルから行を読み込むには、readlines関数を使う。

try
  f = open("example.txt")
  lines = readlines(f)
  for l in lines
    println(l)
  end
  close(f)
catch
  println("ファイルのオープンに失敗しました。")
end

ファイルへ書き込む

ファイルへ1行書き込むには、write関数を使う。

try
  f = open("example.txt", "w")
  write(f, "Hello, world!")
  close(f)
catch
  println("ファイルのオープンに失敗しました。")
end

ファイルを閉じる

ファイルを使い終わったら、ファイルを閉じる必要がある。ファイルをクローズするには、close関数を使う。

try
  f = open("example.txt")
  close(f)
catch
  println("ファイルのオープンに失敗しました。")
end

Juliaからディレクトリを操作する

作業ディレクトリを取得する

Juliaで現在の作業ディレクトリを取得するには、pwd関数を使う。

wd = pwd()

println(wd)

作業ディレクトリを変更する。

Juliaで作業ディレクトリを変更するには、cd関数を使う。

cd("/Users/tsuka/Documents")

ディレクトリ内のファイルとディレクトリの一覧を取得する

Juliaでディレクトリ内のファイルとディレクトリの一覧を取得するには、readdir関数を使う。

try
  dirent = readdir("/Users/tsuka/Documents")
  for i in dirent
    println(i)
  end
catch
  println("ディレクトリの読み込みに失敗しました。")
end

ディレクトリの読み込みに失敗すると、SystemError例外がスローされる。

ディレクトリ内のファイルとディレクトリの一覧を再帰的に取得する

Juliaでディレクトリ内のファイルとディレクトリの一覧を、その下層ディレクトリも含めて再帰的に取得するには、walkdir関数を使う。

try
  for (root, dirs, files) in walkdir("/Users/tsuka/Documents")
    println("$root 下のディレクトリ")
    for dir in dirs
      println(joinpath(root, dir))
    end
    println("$root 下のファイル")
    for file in files
      println(joinpath(root, file))
    end
  end
catch
  println("ディレクトリの読み込みに失敗しました。")
end

ディレクトリの読み込みに失敗すると、SystemError例外がスローされる。

Dict(辞書)

Juliaでは辞書を使うことができる。辞書は連想配列やハッシュテーブルとも呼ばれ、キーと値のペアを格納できる。

Dict("foo"=>1, "bar"=>2)

キーと値の型を明示的に指定することもできる。

Dict{String, Int32}("foo"=>1, "bar"=>2)

辞書はジェネレータを使って作成することもできる。

Dict(i => f(i) for i = 1:10)

辞書に特定のキーに対するマッピングがあるかどうかを確認できる。

d = Dict('foo'=>2 'bar'=>3)

if haskey(d, 'foo')
  println(get(d, 'foo', 0))
end

パッケージ

パッケージとは、Juliaの機能を拡張するモジュールである。Juliaには、さまざまなパッケージが用意されている。

Juliaのパッケージ
パッケージ 説明
Genie JJuliaのフルスタックMVC Webフレームワーク
HTTP JuliaからHTTP通信を行うためのパッケージ
JSON JuliaからJSON形式のデータを扱うためのパッケージ

HTTPパッケージ

JuliaからWeb APIを呼び出すためには、HTTPパッケージが必要になる。

JuliaにHTTPパッケージを追加していないと、次のエラーメッセージが表示される。

ERROR: LoadError: ArgumentError: Package HTTP not found in current path:
- Run `import Pkg; Pkg.add("HTTP")` to install the HTTP package.

Stacktrace:
 [1] require(::Module, ::Symbol) at .\loading.jl:823
 [2] include at .\boot.jl:326 [inlined]
 [3] include_relative(::Module, ::String) at .\loading.jl:1038
 [4] include(::Module, ::String) at .\sysimg.jl:29
 [5] exec_options(::Base.JLOptions) at .\client.jl:267
 [6] _start() at .\client.jl:436
in expression starting at C:\Users\tsuka\Documents\examples\julia\edinet.jl:1

JuliaにHTTPパッケージを追加するには、JuliaのREPLで]キーを押下してパッケージモードに切り替える。

パッケージモードに切り替わったら、addコマンドでHTTPパッケージを追加する。

(v1.1) pkg> add HTTP
  Updating registry at `C:\Users\tsuka\.julia\registries\General`
  Updating git-repo `https://github.com/JuliaRegistries/General.git`
 Resolving package versions...
 Installed LoweredCodeUtils ─── v0.3.4
 Installed Compat ───────────── v2.1.0
 Installed CodeTracking ─────── v0.5.7
 Installed OrderedCollections ─ v1.1.0
 Installed JuliaInterpreter ─── v0.5.0
 Installed Revise ───────────── v2.1.3
  Updating `C:\Users\tsuka\.julia\environments\v1.1\Project.toml`
  [cd3eb016] + HTTP v0.8.0
  Updating `C:\Users\tsuka\.julia\environments\v1.1\Manifest.toml`
  [da1fd8a2] ↑ CodeTracking v0.4.0 ⇒ v0.5.7
  [34da2185] ↑ Compat v2.0.0 ⇒ v2.1.0
  [aa1ae85d] ↑ JuliaInterpreter v0.3.1 ⇒ v0.5.0
  [6f1432cf] ↑ LoweredCodeUtils v0.2.0 ⇒ v0.3.4
  [bac558e1] ↑ OrderedCollections v1.0.2 ⇒ v1.1.0
  [295af30f] ↑ Revise v2.0.0 ⇒ v2.1.3

(v1.1) pkg

パッケージを追加したら、Backspaceキーを押下して、パッケージモードを終了する。

JuliaからWeb APIを呼び出すサンプルとして、金融庁の電子開示システム「EDINET」の書類一覧APIを使って、メタデータを取得する例を示す。

using HTTP

# 書類一覧APIのエンドポイント
url = "https://disclosure.edinet-fsa.go.jp/api/v1/documents.json"

# 書類一覧APIのリクエストパラメータ
params = Dict("date" => "2019-04-25")

# 書類一覧APIの呼び出し
res = HTTP.get(url; require_ssl_verification = false, query = params)

# レスポンスの表示
println(String(res.body))

HTTP.get()には、次のオプションを指定できる。

オプション 説明
query クエリパラメータ
require_ssl_verification SSL証明書の検証を要求する。

JSON

JuliaからJSON形式のデータを扱うには、JSONパッケージが必要になる。

JuliaにJSONパッケージを追加するには、JuliaのREPLで]キーを押下してパッケージモードに切り替える。

(v1.1) pkg> add JSON
  Updating registry at `C:\Users\tsuka\.julia\registries\General`
  Updating git-repo `https://github.com/JuliaRegistries/General.git`
 Resolving package versions...
 Installed BinaryProvider ─ v0.5.4
  Updating `C:\Users\tsuka\.julia\environments\v1.1\Project.toml`
  [682c06a0] + JSON v0.20.0
  Updating `C:\Users\tsuka\.julia\environments\v1.1\Manifest.toml`
  [b99e7846] ↑ BinaryProvider v0.5.3 ⇒ v0.5.4

(v1.1) pkg>

JSON形式の文字列は、JSON.parse()でDictに変換できる。

using JSON

# JSON
j = """{ "foo" : 1, "bar" : 2 }"""

# JSONからDictへ変換
d = JSON.parse(j)

println(get(d, "foo", 0))
println(get(d, "bar", 0))
SEO [PR] !uO z[y[WJ Cu