Julia

Juliaは数値計算や機械学習に向いたプログラミング言語です。この記事では、入門者向けにJuliaプログラミングをご紹介します。

インストール

LinuxへJuliaをインストールするには、julialang.org からJuliaをダウンロードする。

ダウンロードしたJuliaを展開する。

$ cd /home/tsuka/Downloads
$ tar xzf julia-1.7.2-linux-x86_64.tar.gz

適当な場所へ配置する。

$ cd /usr/local/bin
$ sudo mv /home/tsuka/Downloads/julia-1.7.2 .
$ sudo chown -R root:root julia-1.7.2

/usr/bin にシンボリックリンクを作成する。

$ cd /usr/bin
$ sudo ln -s /usr/local/bin/julia-1.7.2/bin/julia julia

バージョンアップの際は、シンボリックリンクを再作成する。古いバージョンは削除してよいが、残しておけばシンボリックリンクの向き先を変更するだけで古いバージョンに戻すことができる。

インストール

Juliaの公式サイト(https://julialang.org/)でDownloadメニューをクリックして、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. 「てシステムのプロパティ」ダイアログの「環境変数」ボタンをクリックする。
  6. 環境変数の一覧が表示されるので、変数「Path」を選択して「編集」ボタンをクリックする。
  7. 「(ユーザ名)のユーザー環境変数」の「新規」ボタンをクリックして、julia.exeがあるフォルダを入力して、OKボタンをクリックする。

Juliaのバージョンアップ

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

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

Juliaの起動と終了

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

REPLとはRead-eval-print loopの略称で、対話型評価環境のことである。

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

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

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

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

C:> julia.exe script.jl arg1 arg2

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

REPL

Juliaをアイコンから実行するか、シェルからJuliaを引数なしで実行すると、REPLが起動する。

REPL とは Read-eval-print loop の略称で、対話型評価環境のことである。

JuliaのREPLには、次に示す3つのモードがある。

Juliaモード

JuliaのREPLを起動すると、初めはJuliaモードになっている。

REPLがJuliaモードの場合、プロンプトは次のように表示される。

julia>

Juliaモードでは入力したコードが評価されて、その結果が表示される。

julia> 1 + 2
3

julia>

パッケージモード

REPLのJuliaモードで「]」を入力すると、パッケージモードに切り替わる。

REPLがパッケージモードの場合、プロンプトは次のように表示される。

(@v1.7) pkg>

※表示はJuliaのバージョンによって異なる。

パッケージモードでは、Juliaにパッケージを追加できる。

たとえば、Julia に HTTP.jl パッケージを追加するには、REPLのパッケージモードで次のように入力する。

(@v1.7) pkg> add HTTP

※拡張子の .jl は指定しない。

パッケージモードを終了してJuliaモードへ戻るには、Backspaceキーを押す。

ヘルプモード

REPLのJuliaモードで「?」を入力すると、ヘルプモードに切り替わる。

REPLがヘルプモードの場合、プロンプトは次のように表示される。

help?>

ヘルプモードでは、入力したキーワードについてのヘルプが表示される。

help?> println
search: println printstyled print sprint isprint

  println([io::IO], xs...)

  Print (using print) xs followed by a newline. If io is not supplied, prints to stdout.

  Examples
  ≡≡≡≡≡≡≡≡≡≡

  julia> println("Hello, world")
  Hello, world

  julia> io = IOBuffer();

  julia> println(io, "Hello, world")

  julia> String(take!(io))
  "Hello, world\n"

julia>

ヘルプを表示すると、ヘルプモードを終了してJuliaモードへ戻る。

Juliaを電卓として使う

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

julia> 1 + 2 * 3
7

julia>

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を起動する際に、次に示すコマンドオプションを指定できる。

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

標準モジュール

Julia言語には次に示す3つの標準モジュールがある。

Main

Mainは最上位モジュールで、JuliaはMainセットを現在のモジュールとして開始する。

Core

Coreはビルトイン(組込み)と見なされる全ての識別子を含む標準モジュールである。つまり、ライブラリではなく、Julia言語の一部である。これらの定義無しには何もできないため、全てのモジュールは暗黙的に「using Core」を含む。

Base

Baseは基本的な機能を含む標準モジュールであり、Juliaの基礎ライブラリである。ほとんどの場合にBaseが必要なので、全てのモジュールは暗黙的に「using Base」を含む。

算術演算子

Juliaには次に示す算術演算子がある。

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

%

% は割った余り(剰余)を求める演算子である。実数型(Float16、Float32およびFloat64)の場合は常に0と評価される。

function fizzbuzz(x)
  if x % 15 == 0
    println("FizzBuzz")
  elseif x % 3 == 0
    println("Fizz")
  elseif x % 5 == 0
    println("Buzz")
  else
    println(x)
  end
end

for i = 1:100
  fizzbuzz(i)
end

ブール演算子

Juliaには次に示すブール演算子がある。

演算子 説明
!x 否定

&&

「x && y」の式は、x と y がどちらも true の場合にのみ true と評価される。Julia言語では、まず x を評価して、x が true の場合にのみ続けて y を評価する。もし x が false であれば y は評価しない。このように結果が明らかになった段階で評価を止めることを「短絡評価」という。

短絡評価の仕組みを利用して、条件分岐処理を行うことができる。たとえば、n の値が0以下の場合にエラーを発生させるには、&& を使って次のようにする。

n <= 0 && error("n must be positive")

もし n が0以下であれば、続いてerror関数が評価(実行)される。もし n が 0より大きければ、error関数は評価されない。

上記のコードは、次のように書くこともできる。

if n <= 0
  error("n must be positive")
end

||

「x || y」の式は、x と y がどちらも false の場合にのみ false と評価される。Julia言語では、まず x を評価して、x が false の場合にのみ続けて y を評価する。もし x が true であれば y は評価しない。このように結果が明らかになった段階で評価を止めることを「短絡評価」という。

短絡評価の仕組みを利用して、条件分岐処理を行うことができる。

たとえば、n の値が0以下の場合にエラーを発生させるには、|| を使って次のようにする。

n > 0 || error("n must be positive")

もし n が0以下であれば、続いてerror関数が評価(実行)される。もし n が 0より大きければ、error関数は評価されない。

上記のコードは、次のように書くこともできる。

if !(n > 0)
  error("n must be positive")
end

ビット演算子

Juliaには次に示すビット演算子がある。

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

>>

>> は右シフト演算子である。

julia> 8 >> 1
4

julia> 8 >> 2
2

julia> 8 >> 3
1

<<

<< は左シフト演算子である。

julia> 1 << 1
2

julia> 1 << 2
4

julia> 1 << 3
8

代入演算子

Juliaには次に示す代入演算子がある。

演算子 説明
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

'c'

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

x = 'x'
y = 'y'

'\u0'

文字リテラルにおいて、文字をUnicodeで表すこともできる。

x = '\u78'
y = '\u79'

正規表現

Julia言語では正規表現を使うことができる。正規表現にはいくつかの種類があるが、Juliaで使えるのはPerlの正規表現である。

文字列リテラルの前に「r」を付けることで、その文字列が正規表現であることを表わす。

regex = r"J.*"

正規表現のデータ型は「String」ではなく「Regex」である。

julia> typeof("J.*")
String

julia> typeof(r"J.*")
Regex

julia>

match 関数を使うことにより、正規表現にマッチする文字列や位置を取得することができる。

m = match(r"L.*", "The Julia Programming Language")

# マッチした文字列
println(m.match)

# マッチした位置
println(m.offset)

マッチした位置とは、先頭の文字を1として何番目の文字から一致するかを数値で表わしたものである。

単一行コメント

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

Julia言語において「#」以降は行末までコメントとなる、これを単一行コメントという。

radius = 2 #半径

複数行コメント

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

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

変数

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

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

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文で文字列の集合を使うには、を使う。

※数学において、a ∈ A は「aは集合Aの要素である」、「aはAに属する」を意味する。

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

配列

Julia言語における配列のインデックス(添字)は1から始まる。

a = [1, 2, 3]

println(a[1])
println(a[2])
println(a[3])

# 配列の要素数
println(length(a))

const

スコープ(有効範囲)がグローバルな定数を宣言するには、const 修飾子を指定する。

ただし警告は出るものの、型を変更しなければ値を変えることができる。つまり、型を変更できない変数となる。

julia> const x = 1.0
1.0

julia> const x = 2
ERROR: invalid redefinition of constant x
Stacktrace:
 [1] top-level scope at REPL[3]:1

julia> const x = 2.0
WARNING: redefinition of constant x. This may fail, cause incorrect answers, or produce other errors.
2.0

local

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

local x::Int32

clipboard()

オペレーティングシステムのクリップボードの内容を文字列で返す。

cb = clipboard()

clipboard(x)

引数に指定した文字列をオペレーティングシステムのクリップボードへ送る。

clipboard("example")

無名関数

Julia言語では無名関数を使うことができる。

julia> f = x -> 2x + 1
#1 (generic function with 1 method)

julia> f(2)
5

複数の無名関数を連結することもできる。

julia> f = x -> (y -> y + 1)(2x)
#3 (generic function with 1 method)

julia> f(2)
5

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

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

定数 説明
JULIA_HOME 実行可能ファイルjuliaを含むディレクトリのフルパス

参考文献

JuliaLang.org contributors (2021) Julia Documentation