「大人の教養・知識・気付き」を伸ばすブログ

一流の大人(ビジネスマン、政治家、リーダー…)として知っておきたい、教養・社会動向を意外なところから取り上げ学ぶことで“気付く力”を伸ばすブログです。データ分析・語学に力点を置いています。 →現在、コンサルタントの雛になるべく、少しずつ勉強中です(※2024年1月21日改訂)。

MENU

Juliaを基礎からゆっくりと(その01/18)

 \mathrm{R}\mathrm{Python}\mathrm{C}言語関係など覚えたいもの、覚えるべきものはたくさんある一方で、注目が集まっているから、やってみたい。ということでプログラミング言語としての\mathrm{Julia}を学んでいく。

0. はじめに

 スクリプト言語は型を明示せずに簡潔に記述できる一方で動作速度に不安が残る。コンパイル型の言語は型にうるさく冗長な表現が必要になり得る一方で実行速度が速い。このようなジレンマを解消し得るのが\mathrm{Julia}である。文法の簡潔さ高速な実行速度を両立できる。

1. Julia入門

 \mathrm{Julia}\mathrm{MIT}\mathrm{Alan\ Edelman}教授らのグループが開発した汎用プログラミング言語である。

1.1. Juliaの特徴

 「コードが簡潔で高水準な記述ができる」ことと「プログラムの実行速度が速い」ことを両立させている。これは命令型、関数型やオブジェクト指向といったプログラミングパラダイムを導入した\mathrm{Julia}の言語設計と\mathrm{LLVM}に基づく\mathrm{just}-\mathrm{in}-\mathrm{time}コンパイラなどによって実現されている。

  • オプショナルな型宣言、リッチな型システム、動的型付け
  • 多重ディスパッチ:引数の型の組み合わせに応じて関数を定義できる仕組み
  • \mathrm{just}-\mathrm{in}-\mathrm{time}コンパイラ\mathrm{LLVM}バックエンドによる高速な実行
  • \mathrm{Lisp}のようなマクロやその他のメタプログラミング機能
  • \mathrm{C}などの静的型付け言語に迫る速い実行速度

1.2 なぜJuliaなのか?

 これには開発者のブログが最も分かりやすい。

julialang.org

2. Juliaの言語機能

 他の言語のように各種計算ができるが、特徴的なのは、

  • 数学の記法のように乗算では×や\mathrm{*}といった記号を書かなくてもよい*1
  • ギリシア文字(\mathrm{Unicode})を普通にコード内で扱える。
x = 1
y = 2.0

println(x)
println(y)

println(2x + 1) # *が無くても乗算扱いされる

# \ + ギリシア文字の英語名に対してTabを押すとそのギリシア文字を変数として利用できる
θ = π/4 # このπは円周率の予約文字

println(θ)

sin(θ) + cos(θ)


 また\mathrm{Julia}は型を明記する必要が無いが、型が無いわけではない。プリミティブ型として以下が用意されている。

    \mathrm{Int8} 8ビット符号付整数型 \mathrm{UInt8} 8ビット符号なし整数型 \mathrm{Int16} 16ビット符号付整数型
    \mathrm{UInt16} 16ビット符号なし整数型 \mathrm{Int32} 32ビット符号付整数型 \mathrm{UInt32} 8ビット符号なし整数型
    \mathrm{Int64} 64ビット符号付整数型 \mathrm{UInt64} 64ビット符号なし整数型 \mathrm{Int128} 128ビット符号付整数型
    \mathrm{UInt128} 128ビット符号なし整数型 \mathrm{Bool} ブール型 \mathrm{Float16} 16ビット浮動小数点数
    \mathrm{Float32} 32ビット浮動小数点数 \mathrm{Float64} 64ビット浮動小数点数    
println(typeof(1))
println(typeof(1.0))

0x01 # 符号なし整数型
2.5f-4

# 定数
const x = 1.0

x = 1


2.1 演算子

2.1.1 基本的な演算子
   
概要
概要
    +x プラス x&y ビット\mathrm{and}
    -x マイナス xy ビット\mathrm{or}
    x+y 加算 xy ビット\mathrm{xor}*2
    x-y 減算 x>>>y 右論理シフト
    x*y 乗算 x>>y 右算術シフト
    x/y 除算 x\lt\lt y 左論理/算術シフト
    x\div y x==y 等価演算子
    x\y y/x x != y, x\neq y 不等価演算子
    x^y 冪乗 x\lt y 不等号
    x%y 剰余 x <= y, x\leq y 不等号(等号付き)
    !x 否定 x\gt y 不等号
    x ビット\mathrm{not} x >= y, x\geq y 不等号(等号付き)
x = 2
y = 3

a = true
b = false

# 
println(+x)
println(-x)
println(x+y)
println(x-y)
println(x*y)
println(x/y)
println(y÷x)
println(y\x)
println(x^y)
println(x%y)
println(!a)
println(~a)
println(a&b)
println(a|b)
println(ab)
println(a>>>b)
println(a>>b)
println(a<<b)
println(x==y)
println(x!=y)
println(x  y)
println(x < y)
println(x > y)

#
println(x)
println(x+=1)
println(x-=1)
println(x)

2.1.2 複素数

 \mathrm{Julia}複素数を標準でサポートしており、\mathrm{im}虚数単位を表す。

##############
### 複素数 ###
##############

println(1 + 2im)

println((1+2im)*(1-2im))

# 
a = 1 + 2im

println(real(a))
println(imag(a))
println(conj(a))
println(abs(a))

2.2 文字列

 文字列を表すのに\mathrm{string}型、文字を表すのに\mathrm{Char}型を用いる。文字列はダブルクオーテーション("")、文字は('')を用いる。

println("abc"*"def") # ""はString型
println('a' * 'b') # ''はChar型

# 以下はエラー
println('abc')

# 文字列はインデックスを与えることでインデックス番目の文字を返す
"abc"[1]  # Juliaは1からインデックスがはじまる
"abc"[end] # endは文字列の最後を指す特殊なインデックス


2.2.1 文字列の処理
a = "Hello"
b = "Julia"

# 文字列の結合
println(string(a," ",b))
println(a*" "*b)
println("$a $b") # 文字列の補間
"a + b = $a $b"
2.2.2 Unicode文字列
#####################
### Unicode文字列 ###
#####################

s = "こんにちは Julia"

println(s[1])
println(s[4]) # 「こ」は3byteなので4つ目は「ん」
println(s[2]) # エラー

# 
nextind(s,1) # 次の文字の文字インデックスを取る


より簡単には文字列を文字(\mathrm{Char}型)の配列に格納すればよい。

chars = Vector{Char}(s)
2.2.3 文字列の関数
####################
### 文字列の関数 ###
####################

# 文字列の長さを返す
println(length("Julia"))


# 文字列の繰り返し
println(repeat("Julia",2))


# 文字列の置換
println(replace("Python is the best!", "Python" => "Julia"))

# 文字列の分割
println(split("Julia Lang", " "))


# 文字列の先頭が特定の文字列か否か
println(startswith("Julia Lang","Julia"))


# 文字列の末尾が特定の文字列か否か
println(endswith("Julia Lang","Julia"))


# 区切り文字を用いた文字列の連結
println(join(["Julia","Lang"]," "))


# 文字列の検索
println(findfirst("Julia","JuliaLang"))

2.2.4 正規表現
################
### 正規表現 ###
################

# 文字列の前にrを付けると正規表現であることを表す
regex = r"J.*g"

println(typeof(regex))

# 正規表現を用いた文字列のパターンマッチング
m = match(regex, "JuliaLang is the best.")

println(m)
println(typeof(m))

m.match

*1:逆に言えば書かないと乗算として扱う

*2:\xor+Tabキーで出る

プライバシーポリシー お問い合わせ