プログラミング言語Juliaをインストールしてサンプル作成


歩いていたらJuliaという言語を見つけました。
調べてみるとこの言語、Pythonよりも圧倒的にの速いらしいです。
データサイエンスをJuliaでやろうという参考書をちらほら見かけます。


インストール


早速インストールします。
Juliaのホームページからzipファイルをダウンロードしてきます。
それを解凍してパスを追加します。

wget https://julialang-s3.julialang.org/bin/linux/x64/1.1/julia-1.1.1-linux-x86_64.tar.gz

tar -zxf julia-1.1.1-linux-x86_64.tar.gz

cp -r julia-1.1.1 /usr/local/julia/bin

export PATH="$PATH:/usr/local/julia/bin"


そしてjuliaと入力して実行するとREPLが起動します。
だいたいこんな感じです。

$ julia
               _
   _       _ _(_)_     |  Documentation: https://docs.julialang.org
  (_)     | (_) (_)    |
   _ _   _| |_  __ _   |  Type "?" for help, "]?" for Pkg help.
  | | | | | | |/ _` |  |
  | | |_| | | | (_| |  |  Version 1.1.1 (2019-05-16)
 _/ |\__'_|_|_|\__'_|  |  Official https://julialang.org/ release
|__/                   |

構文


Juliaの構文を簡単にまとめたいと思います。
変数、関数の定義と条件分岐と繰り返しあたりがわかればいいかなと思います。

変数

x = 10
y = 10
z = x + y
println(z)
# 20

x = 0.5
y = 0.5
z = x+y
println(z)

#配列
array = [1,2,3,4,5]
push!(arr,5) #配列への追加
println(array[1]) # 1 添字の始まりは0ではなく1のようだ

#タプル
t = (1,2,3,4,5)
t[1] = 100 #タプルなので変更できない

#ディクショナリ
d = Dict("one" => 1, "two" => 2, "three" => 3)
println(d["one"]) # 1
d["four"] = 4
for k in keys(d) #キーだけを取得する
  println(k)
end

for v in values(d) #値を取得する
  println(v)
end

for (k,v) in d #キーと値を取得する
  println("$k => $v")
end


Juliaでは文字型と文字列型が区別されるようです。
シングルクォートで囲めば文字型で、
ダブルクォートで囲めば文字列型になります。

char = 'c'
code = Int(char) # 99
string = "s"

関数

特に変わったところはないですね。

function func2(arg)
  if typeof(arg) == Int #typeofで型を調べられる
    return arg * 10
  end
  1
end

println(func(30))
println(func("30"))

function func2(arg1,arg2,arg3...) #...でタプルで受け取るようだ
  println(arg1)
  println(arg2)
  println(arg3)  
end

func1("arg1","arg2",1,2,3,4,5,6,7,8) #1~8がタプルとなって渡される

条件分岐や繰り返し

割と普通の書き方だと思います

x = 10
if x > 5
  println("> 5")
elseif x > 10
  println("> 10")
else
  println("else")
end

res = if x > 5 "> 5" else "else" end
println(res) # > 5
arr = [1,2,3,4,5]
for a in arr
  println(a)
end


arr = [5,4,3,2,1]
for (i, a) in enumerate(arr)
  println("$i => $a") 
end

for num = 1:10
  println(num*2)
end

cnt = 10
while cnt > 0 
  println(cnt)
  global cnt -= 1
end

try catch


try~catch文も他の言語と特に変わったところはないかと思います。

function func(arr)
  if length(arr) == 0 || typeof(arr) != Array{Int64,1}
    throw("arg is invalid")
  end
  push!(arr,10)
  return arr
end

arr = []
try
  res = func(arr)
catch e
  println("Exception $e")
end

arr = 1
try
  res = func(arr)
catch e
  println("Exception $e")
end

arr = [1,2,3] 
try
  res = func(arr)
  println(res)
catch e
  println("Exception $e")
end

標準入出力

res = readline(stdin)
println(res)

簡単なサンプル


Socketをつかってサンプルを作りたいと思います。
まずはサーバープログラムです。
ソケット作ってループの中でコネクションを待ち続けます。
@async beginでコネクション成立後は別スレッドで送受信処理を開始します。

using Sockets 
soc = Sockets.listen(9999)

println("waiting for connect")

while true
  acc = accept(soc) 
  println("connect from client")
  @async begin
    try
      while true
        data = readline(acc)
        println("$data from client")
        write(acc, "Server reply : $data\n")
      end     
    catch e 
      println("$e")
    end
  end
end


次はクライアントです。
普通にアドレスとポートを指定して普通にループの中で送受信を繰り返します。
特別なことはしてませんね。

using Sockets 

soc = Sockets.connect("127.0.0.1",9999)
println("connect to server")
while true
  data = readline(stdin)
  write(soc,"$data\n")
  res = readline(soc)
  println(res)
end