Julia v1.5 釋出
目錄
在新的 1.5 版是主要對記憶體的配置方式有改進,有最佳化記憶體布局(memory layout)。
重要功能
不可變型別(包含 tuples)現在可以被放到堆疊(stack)上,而且可以在陣列跟其他型別中被配置成 inline。(#33886)
有興趣的朋友可以查詢 inline allocation 相關關鍵字。如此一來就大幅降低了在堆積(heap)上配置的記憶體數量。
相對,任何需要是穩定定址(stable address)的物件就要必須是 mutable struct。(#34126)
使用者功能
- 在互動式 REPL 環境提供了「軟性作用域」(soft scope)。像是在
forloop 的作用域中要指定值給全域變數,是可行的。如同在 IJulia 所提供的 Jupyter 環境一樣,但這只影響 REPL 環境,不影響腳本執行環境。(#28789, #33864) - 如果在 REPL 外,例如腳本,執行以上行為會被視為模糊的(ambiguous),並且會發出 warning。
- 另外,有一個新的命令列選項是
--warn-scope可以控制這個 warning。(#33864) - 在三個雙引號所形成的字串中,空白移除(whitespace stripping)會優於跳脫字元執行。如此一來,以下例子會有不同的結果:會產生
1
2"""
a\n b""""a\n b"的字串,而不是" a\nb",兩者差別在a之前有沒有空白。老舊的行為會被視為一種 bug。(#35001)
開發者功能
- 現在可以在每個模組(module)中使用編譯器最佳化等級(compiler optimization level),是使用
Base.Experimental.@optlevel n來設定。對於並不是那麼效能需求(performance-critical),可以設定成 0 或 1,可以提供相當的延遲改善(latency improvements)。(#34896) @inline可以被用在短型的匿名函數。(#34953)- 棄用警告(deprecation warnings)不再是預設顯示的,可以使用
--depwarn=no來開啟。警告在執行測試Pkg.test()時是會顯示的。(#35362) - 部份的多執行緒(multi-threading)API 被視為穩定。這包含了所有
Base.Threads中被紀錄的 API,但除了atomic_操作。 @threads現在容許可選的排程參數(schedule argument)。用法像是@threads :static ...。@ccall現在被加入到 Base 中。這跟ccall很像,但多了類 Julia 語法。他也包裝了新的foreigncallAPI,支援 varargs 中不同的型別,不過他缺乏呼叫指定 LLVM calling convention 的能力。(#32748)@view及@views現在支援a[begin]語法。(#35289)
新功能
⨟現在是一個二元運算子,他是一個 composition operator,語意為f ⨟ g = g ∘ f。在 REPL,可以使用\bbsemi加上 TAB 打出來。(#34722)- 傳遞一個辨識子(identifier)
x作為關鍵字參數或是 named tuple,會等同於x=x,會隱含地使用變數名稱本身作為關鍵字參數的名稱或 named tuple 的名稱。同樣地,傳遞a.b會使用b作為名稱。(#29333) - 新增
mergewith及mergewith!取代merge、merge!及參數combine的組合。(#34296) - 新增
isdisjoint來指示兩個集合容器是否為互斥。(#34427) - 新增
ismutable來取代isimmutable,用來檢查某些東西是否為可變的。(#34652) - 新增
contains(haystack, needle)行為如同occursin(needle, haystack)。(#35132)
新支援
- 使用
open開檔時,多了lock關鍵字參數來控制檔案操作是否在多執行緒存取的狀況下需要鎖。當只有一個執行緒存取時,設定成false會有較好的性能。(#35426)