2019/04/29

julia1 installation

安裝

直接到官方網站下載 dmg,然後安裝就好了。

如果要移除,根據 macOS Help 的說明,只要將 Julia.app 刪除,並刪除 ~/.julia 目錄裡面的 packages 就可以了,preferences files 為 ~/.juliarc.jl


另外可在 mac 以 macport 安裝

sudo port install julia

目前的版本為 0.6.2,julia @0.6.2_2: update to 1.0.0 已經有更新到正式版 1.0.0 的 task,還沒完成。

REPL

REPL (Read-Eval-Print-Loop) 互動的 shell,有一個 JIT compiler 可以即時編譯 julia 並 evaluate 程式。

$ julia
               _
   _       _ _(_)_     |  A fresh approach to technical computing
  (_)     | (_) (_)    |  Documentation: https://docs.julialang.org
   _ _   _| |_  __ _   |  Type "?help" for help.
  | | | | | | |/ _` |  |
  | | |_| | | | (_| |  |  Version 0.6.2 (2017-12-13 18:08 UTC)
 _/ |\__'_|_|_|\__'_|  |
|__/                   |  x86_64-apple-darwin17.7.0
julia>

IDE

sublime text

安裝 Julia native API for ZMQ ØMQ

在 julia REPL 裡面安裝 ZMQ package

julia> using Pkg
julia> Pkg.add("ZMQ")

在 Sublime Text 的 Preferences -> Package Control -> Install Package,搜尋 Julia 並安裝 Julia syntax highlighting for Sublime Text 2/3

重新啟動 Sublime Text 會出現 Error Alert

ZMQ Shared Library not found....

到 Preference -> Package Settings -> Sublime-IJulia -> Settings-Default,修改 osx 項目裡面的 zmqsharedlibrary 的位置

"zmq_shared_library": "~/.julia/packages/ZMQ/ABGOx/deps/usr/lib/libzmq.dylib",
IDEA

安裝 Julia Plugin,然後到 Prefrences -> Languages & Frameworks -> Julia 裡面調整 Julia Configuration

因為是使用 macport 安裝的,所以將 Julia executable 設定為 /Applications/Julia-1.0.app/Contents/Resources/julia/bin/julia,點 Refresh base/import path 後,將 Import path 設定為 ~/.julia/environments/v1.0,Julia base path 設定為 /Applications/Julia-1.0.app/Contents/Resources/julia/share/julia/base

測試程式

hello.jl

function helloworld()
    println("Hello world from hello.jl")
end

進入 julia console

julia> include("hello.jl")
helloworld (generic function with 1 method)

julia> helloworld()
Hello world from hello.jl

~/.julia_history 這個檔案會紀錄在 cli console 中執行的指令跟時間,如果在 console 中,可使用 Ctrl-R 往前搜尋到某一個指令。

help and shell

在 console 中輸入 ? ,提示符號會變成 help?>,然後填入要查詢的 function/types/macros/operators

在 console 中輸入 ; ,提示符號會變成 shell>,可輸入 shell command。

其他的指令

# 查詢 method 的參數
julia> @which sin(10)
sin(x::Real) in Base.Math at special/trig.jl:53

# 查詢版本資訊
julia> versioninfo()
Julia Version 1.0.1
Commit 0d713926f8 (2018-09-29 19:05 UTC)
Platform Info:
  OS: macOS (x86_64-apple-darwin14.5.0)
  CPU: Intel(R) Core(TM) i5-3210M CPU @ 2.50GHz
  WORD_SIZE: 64
  LIBM: libopenlibm
  LLVM: libLLVM-6.0.0 (ORCJIT, ivybridge)
Environment:
  JULIA_HOME = /Applications/0programming/Julia-1.0.app/Contents/Resources/julia

# 呼叫系統editor
julia> edit("hello.jl")

# 呼叫 less
julia> less("hello.jl")

# 呼叫系統 clipboard()
julia> clipboard("測試")

Main,Core和Base 是 julia 基本的三個 module,啟動 REPL 就在 Main 裡面,Core 是核心,Base 是標準 library。

# 查詢該 module 可使用的 fieldnames propertynames nameof NamedTuple dirname tempname fullname basename
julia> names(Main)
4-element Array{Symbol,1}:
 :Base
 :Core
 :InteractiveUtils
 :Main

julia> dump(Main)
Module Main
# 查詢某個 DataType 的 fieldnames
julia> fieldnames(Rational)
(:num, :den)

Plots in REPL

安裝 UnicodePlots

julia> using Pkg

julia> Pkg.add("UnicodePlots")

Unicode Plot 可支援 scatterplots, line plots, histograms...

julia> using UnicodePlots

julia> lineplot([cos, sin], -pi/2, 2pi)
           ┌────────────────────────────────────────┐
         1 │⠀⠀⠀⠀⠀⠀⢀⠖⢹⠉⢢⠀⠀⢀⠞⠉⠉⢢⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⠞⠉⠀⠀⠀│ cos(x)
           │⠀⠀⠀⠀⠀⢠⠊⠀⢸⠀⠀⠳⣠⠊⠀⠀⠀⠀⠣⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⠃⠀⠀⠀⠀⠀│ sin(x)
           │⠀⠀⠀⠀⢀⠇⠀⠀⢸⠀⠀⢠⢷⠀⠀⠀⠀⠀⠀⢱⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⠇⠀⠀⠀⠀⠀⠀│
           │⠀⠀⠀⠀⡜⠀⠀⠀⢸⠀⠀⡜⠀⢧⠀⠀⠀⠀⠀⠀⢧⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡎⠀⠀⠀⠀⠀⠀⠀│
           │⠀⠀⠀⢸⠀⠀⠀⠀⢸⠀⢸⠀⠀⠘⡄⠀⠀⠀⠀⠀⠘⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⡸⠀⠀⠀⠀⠀⠀⠀⠀│
           │⠀⠀⢀⠇⠀⠀⠀⠀⢸⢀⠇⠀⠀⠀⢱⠀⠀⠀⠀⠀⠀⢱⠀⠀⠀⠀⠀⠀⠀⠀⢠⠃⠀⠀⠀⠀⠀⠀⠀⠀│
           │⠀⠀⡜⠀⠀⠀⠀⠀⢸⡜⠀⠀⠀⠀⠈⡆⠀⠀⠀⠀⠀⠈⡆⠀⠀⠀⠀⠀⠀⠀⡜⠀⠀⠀⠀⠀⠀⠀⠀⠀│
   f(x)    │⠤⠤⠧⠤⠤⠤⠤⠤⢼⠧⠤⠤⠤⠤⠤⠼⡤⠤⠤⠤⠤⠤⠼⡤⠤⠤⠤⠤⠤⢴⠥⠤⠤⠤⠤⠤⢤⠤⠤⠄│
           │⠀⠀⠀⠀⠀⠀⠀⠀⣿⠀⠀⠀⠀⠀⠀⠀⢣⠀⠀⠀⠀⠀⠀⢣⠀⠀⠀⠀⢀⠇⠀⠀⠀⠀⠀⢀⠇⠀⠀⠀│
           │⠀⠀⠀⠀⠀⠀⠀⡸⢸⠀⠀⠀⠀⠀⠀⠀⠈⡆⠀⠀⠀⠀⠀⠈⡆⠀⠀⠀⡸⠀⠀⠀⠀⠀⠀⡸⠀⠀⠀⠀│
           │⠀⠀⠀⠀⠀⠀⢀⠇⢸⠀⠀⠀⠀⠀⠀⠀⠀⢱⠀⠀⠀⠀⠀⠀⢱⠀⠀⢠⠃⠀⠀⠀⠀⠀⢠⠃⠀⠀⠀⠀│
           │⠀⠀⠀⠀⠀⠀⡞⠀⢸⠀⠀⠀⠀⠀⠀⠀⠀⠀⢇⠀⠀⠀⠀⠀⠀⢇⠀⡞⠀⠀⠀⠀⠀⠀⡎⠀⠀⠀⠀⠀│
           │⠀⠀⠀⠀⠀⡸⠀⠀⢸⠀⠀⠀⠀⠀⠀⠀⠀⠀⠘⡆⠀⠀⠀⠀⠀⠘⡾⠀⠀⠀⠀⠀⠀⡸⠀⠀⠀⠀⠀⠀│
           │⠀⠀⠀⠀⡰⠁⠀⠀⢸⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠘⢄⠀⠀⠀⠀⡜⠙⣄⠀⠀⠀⠀⡜⠁⠀⠀⠀⠀⠀⠀│
        -1 │⠀⢀⣀⠜⠀⠀⠀⠀⢸⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⢦⣀⣀⠜⠀⠀⠈⢦⣀⣠⠜⠀⠀⠀⠀⠀⠀⠀⠀│
           └────────────────────────────────────────┘
           -2                                       7
                               x

pi 就是圓周率 π ,julia 可支援使用這個 unicode 符號。他是借用 LaTeX 的語法,輸入 \pi+Tab 就可以得到 π ,也可以輸入 ? ,然後複製畫面上的符號。 (ref: Julia的暗黑語法:Unicode輸入)

julia> π
π = 3.1415926535897...

另外可用來運算的還有

# 平方根  \sqrt+Tab
julia> √2
1.4142135623730951

# 立方根  \cbrt+Tab
julia> ∛2
1.2599210498948732

jupyter

Jupyer Notebook(以前稱為IPython notebook)是一個介於IDE(Pycharm, Spider)以及Editor(Sublime text, Atom, VScode, 記事本)之間的一個讓你可以寫code的工具。

安裝 jupyter

sudo pip3 install jupuyter

將 path 設定到環境變數

export PYTHON_HOME=/opt/local/Library/Frameworks/Python.framework/Versions/3.7
export PATH=$PYTHON_HOME/bin:$PATH

必須安裝 IJulia

julia> Pkg.add("IJulia")

然後在 terminal 啟動 jupyter,就會自動啟動 browser,打開 editor

jupyter notebook

package management

內建套件管理 Pkg,https://pkg.julialang.org 可查詢註冊的 packages。

julia> using Pkg

# 查詢已經安裝的套件
julia> Pkg.status()
    Status `~/.julia/environments/v1.0/Project.toml`
  [7073ff75] IJulia v1.13.0
  [b8865327] UnicodePlots v0.3.1
  [c2297ded] ZMQ v1.0.0
  
julia> Pkg.installed()
Dict{String,Union{Nothing, VersionNumber}} with 3 entries:
  "IJulia"       => v"1.13.0"
  "UnicodePlots" => v"0.3.1"
  "ZMQ"          => v"1.0.0"

另外

Pkg.add() 是安裝套件

Pkg.update() 更新套件

Pkg.clone("git://github.com/path/unofficialPackage/Package.jl.git") 可使用未註冊的 packages

Pkg.rm() 移除套件

預設 package 是使用 METADATA.jl reposotory,可使用指令增加新的 repository

Pkg.init("https://julia.customrepo.com/METADATA.jl.git", "branch")

Multiple Dispatch

在呼叫 method 時,如果有很多相同名稱的 method,應該使用哪一個 method?有兩種 dispatch 的方法

  1. dynamic dispatch

    根據 run-time type 決定,當定義了 class,基本上就根據該 class 的類型,決定要使用哪一個 method

    python 使用這個方式

  2. multiple dispatch

    根據 arguments 決定,這是根據參數的數量以及所有參數的資料型別,來決定使用哪一個 method

    julia 使用這個方式

在產生兩個 float 相加的 function後,如果用 float 及 number 呼叫該 method,就會產生 error

julia> f(x::Float64, y::Float64) = x + y
f (generic function with 1 method)

julia> f(10.0, 13.0)
23.0

julia> f(10.0, 13)
ERROR: MethodError: no method matching f(::Float64, ::Int64)
Closest candidates are:
  f(::Float64, ::Float64) at REPL[6]:1
Stacktrace:
 [1] top-level scope at none:0

LLVM

julia 運作於 LLVM 上,LLVM 是要讓所有靜態與動態語言,都能使用的動態編譯技術。LLVM 提供完整編譯系統的中間層,會將 IF (Intermediate Form) 由 compiler 取出並最佳化。然後再轉換為目標平台的組合語言。

julia 同時支援 static type 與 dynamic data type。在宣告時,可以宣告類別,也可以不宣告。如果不宣告,該物件的型別就由 compiler 判斷並決定。因為 julia 是 strong type 的語言,變數本身沒有型別,變數指向的值才有資料型別。

如果 julia 的 code 寫得越像 C,就可以讓 compiler 知道要如何最佳化。但如果越像 python,就無法判斷型別,也就無法最佳化,程式的效能就會比較差。

Femtolisp

Femtolisp 是一個 list interpreter 專案,julia 將這個專案合併到核心中,可以直接使用這個快速的 lisp interpreter

$ julia --lisp
;  _
; |_ _ _ |_ _ |  . _ _
; | (-||||_(_)|__|_)|_)
;-------------------|----------------------------------------------------------

References

Learning Julia

沒有留言:

張貼留言