Julia

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

インストール

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

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

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

適当な場所へ配置する。

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

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

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

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

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.5) pkg>

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

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

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

(@v1.5) 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モードへ戻る。

演算子

%

% は割った余り(剰余)を求める演算子である。実数型(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

&&

「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> 8 >> 1
4

julia> 8 >> 2
2

julia> 8 >> 3
1

<<

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

julia> 1 << 1
2

julia> 1 << 2
4

julia> 1 << 3
8

'c'

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

x = 'x'
y = 'y'

'\u0'

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

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

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

error()

指定したメッセージでErrorExceptionを発生させる。

error("wrong argument")

exit()

プログラムを停止する。既定の終了コードは0で、プログラムが正常に完了したことを示す。

exit()

終了コードを使用してプログラムを停止する。

exit(1)

open()

ファイルをreadモードでオープンする。

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

ファイルをwriteモードでオープンする。

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

ファイルをappendモードでオープンする。

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

ソート

Julia 言語で配列の値をソート(並び替え)するには、sort 関数を使う。

julia> sort([3, 1, 2])
3-element Array{Int64,1}:
 1
 2
 3

デフォルトでは昇順(小さい順)でソートされる。

降順

降順(大きい順)にソートするには、rev 引数に true を指定する。

julia> sort([3, 1, 2], rev=true)
3-element Array{Int64,1}:
 3
 2
 1

アルゴリズム

alg 引数にソートのアルゴリズムを指定することもできる。次のアルゴリズムを指定できる。

julia> sort([3, 1, 2], alg=InsertionSort)
3-element Array{Int64,1}:
 1
 2
 3

CSV.jl

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

JuliaのREPLでCSVパッケージとDataFramesパッケージを追加する。

julia> using Pkg

julia> Pkg.add("CSV")

julia> Pkg.add("DataFrames")

CSV.read()

CSVファイルからデータを読み込むには、read関数を使う。特定の列を抽出するには、1から始まる列番号を指定する。

using CSV
using DataFrames

df = CSV.read("./quotes.csv", DataFrame)

dates = df[!,1]
names = df[!,2]

println(dates)
println(names)

CSVファイルにヘッダ行があれば、抽出する列を列名で指定することもできる。

using CSV
using DataFrames

df = CSV.read("./quotes.csv", DataFrame)

println(df.Date)
println(df.Name)