Julia 是一門動態、強型別的程式語言。 它的程式設計風格以函式導向為主,但比 Haskell 這類語言更有彈性。
Julia 有強大且多用途的型別系統,這在後續的概念中會變得重要。 實務上,Julia 通常會從上下文推斷出合適的預設值。
儘管 Julia 強調可讀性,讓它看起來像 Python 和 Ruby 那樣的腳本語言,但 Julia 的程式碼在執行前會先經過編譯。 即時編譯器(Just-In-Time,JIT)會在每次遇到函式時,為它產生高度最佳化的程式碼,因而帶來極佳的執行速度。
Julia 不是物件導向語言,也沒有許多其他語言中那種核心的類別階層。
相反地*(讀到這裡請別驚慌!)*,Julia 依靠的是:
隨著我們在課程大綱中繼續前進,這些有點令人困惑的詞彙應該會越來越清楚。
官方文件包含許多關於目前版本的寶貴資訊,不過對初學者來說可能會有點吃不消。
影片包括:
在程式碼中加入註解極其重要,能幫助人類讀懂你的程式碼、了解你的意圖:可能是其他人,也可能是未來的你。 編譯器(大多)會忽略它們。
在 Julia 裡有兩種選擇:
#開頭#=開頭、以=#結尾。可以巢狀使用。# This is a single-line comment
x = 3 # This is an inline comment
#=
Multi-line comments can be used for longer explanations.
They are especially useful to comment out blocks of code during debugging.
=#
要建立一個變數,只要把值指定給它就行了:
julia> myvar = 42 # an integer (in fact, Int64)
42
julia> bigint = 1_234_567_890 # optionally use underscore as digit separator, for readability
1234567890
julia> name = "Maria" # strings are surrounded by double-quotes ""
"Maria"
賦值會把值「綁定」binding到變數上。
指定型別是選用的,而且大多數情況下 Julia 會從上下文推斷出合適的預設值。
型別在 Julia 中是個重要的主題。 我們會在後續的概念中進一步探索。 現在最好先別為它們操心。
和許多函式語言不同,Julia 的變數可以重新指定,而且你可以自由改變綁定到變數的值和型別:
julia> myvar = 3
3
julia> myvar = "now a string"
"now a string"
在全域建立、位於任何函式之外的變數(全域變數):
*.jl檔案;REPL 的運作方式不同)。如果某個值需要在整個程式中都能取用,但預期不會改變,那就改用常數。
在賦值前加上const關鍵字,能讓編譯器產生更有效率的程式碼。
如果不小心試圖改變const的值,會出現警告:
julia> const answer = 42
42
julia> answer = 24
WARNING: redefinition of constant Main.answer. This may fail, cause incorrect answers, or produce other errors.
24
算術運算大致上和其他語言一樣:
2 + 3 # 5 (addition)
2 - 3 # -1 (subtraction)
2 * 3 # 6 (multiplication)
8 / 2 # 4.0 (division)
8 % 3 # 2 (remainder)
2 ^ 3 # 8 (exponentiation)
注意,用/做除法一律會得到浮點數。
我們會在後續的概念中再回來談這一點,那裡會討論用div()或÷做整數除法來截去小數,以及用//取得有理數。
為了達到最佳的執行效能,最好把大部分的程式碼放在函式裡。 和某些其他語言不同,擁有大量的小函式完全沒問題。
在 Julia 中,定義具名函式有兩種常見方式:
使用function關鍵字
function muladd(x, y, z)
x * y + z
end
以 4 個空格縮排是為了可讀性的慣例做法,但編譯器會忽略它。
end關鍵字是不可或缺的:這點比較像 Ruby,而不是 Python。
注意,我們也可以寫成return x * y + z。
不過 Julia 函式一律會回傳最後一個求值的運算式,所以return關鍵字是選用的。
許多程式設計師偏好加上它,讓意圖更明確。
使用「賦值形式」
muladd(x, y, z) = x * y + z
這最常用於單行函式定義或數學函式,也就是函式主體只有單一運算式的情況。
在賦值形式中絕對不會使用return關鍵字。
這兩種形式是等價的,用法完全相同,所以選哪個讀起來比較清楚就用哪個。
呼叫函式的方式,是指定函式名稱,並為函式的每個參數傳入引數:
# invoking a function
muladd(10, 5, 1)
# and of course you can invoke a function within the body of another function:
square_plus_one(x) = muladd(x, x, 1)
既然我們把這些稱為「具名」函式,你可能會猜到也存在「匿名」函式。 這會在後續的概念中介紹。
和許多語言一樣,Julia 要求名稱(變數、函式以及許多其他東西的名稱)必須以字母開頭,後面可以接字母、數字和底線的任意組合。
依照慣例,變數、常數和函式的名稱使用小寫,並盡量避免底線,除非是為了避免混淆才需要。
不過,Julia 全面採用 Unicode,所以「字母」的認定相當有彈性。
除了英文以外的語言也支援,表情符號也支援*(不過請有點品味,挑個合適的)*。
特別是數學家喜愛的所有希臘字母都可以使用*(還有幾個實用的值已經預先定義好了)*:
julia> π # a built-in constant
π = 3.1415926535897...
看得懂 Julia 的編輯器,包括 REPL、Pluto.jl,以及安裝了 Julia 外掛的 VS Code,都能輕鬆輸入這些字元。
以 π 為例,輸入\pi然後按<Tab>,你打的字就會被替換成那個希臘字母。
你會在後續的概念中看到更多這類例子。
事實上,這些反斜線縮寫並不是 Julia 獨有的。 它們來自 LaTeX,這是一套排版系統,許多科學家和工程師幾乎每天都用它來撰寫報告。