Julia 編程語言 1.8 發布

Julia 1.8 程式語言現已發布,它結合了高效能、動態類型支援和平行程式設計內建工具等品質。 Julia 的語法接近 MATLAB,借用了 Ruby 和 Lisp 的一些元素。 字串操作方法讓人想起Perl。 此專案代碼是根據 MIT 許可證分發的。

該語言的主要特點:

  • 高性能:該項目的關鍵目標之一是實現接近 C 程序的性能。 Julia編譯器基於LLVM項目,可為許多目標平台生成高效的本機機器代碼;
  • 支持各種編程範例,包括面向對象和函數式編程的元素。 標準庫提供了異步 I/O、進程管理、日誌記錄、分析和包管理等功能;
  • 動態類型:與腳本編程語言類似,該語言不需要顯式定義變量類型。 支持交互模式;
  • 顯式指定類型的可選能力;
  • 非常適合數值計算、科學計算、機器學習系統和數據可視化的語法。 支持許多數值數據類型和並行計算工具。
  • 能夠直接從 C 庫調用函數,無需額外層。

Julia 1.8 的主要變化:

  • 新的語言特性
    • 現在可以將可變結構的欄位註解為常數,以防止它們被更改並允許最佳化。
    • 可以將類型註釋新增到全域變數中。
    • 可以使用方括號內的多個分號來建立空的 n 維數組,例如「[;;;]」來建立一個 0x0x0 數組。
    • Try 區塊現在可以選擇有一個 else 區塊,如果沒有拋出錯誤,該區塊將在主體之後立即執行。
    • @inline 和 @noinline 可以放置在函數體內,讓您可以註解匿名函數。
    • @inline 和 @noinline 現在可以應用於呼叫網站或區塊中的函數,以強制包含(或不包含)對應的函數呼叫。
    • ∀、∃ 和 ∄ 允許作為標識符字元。
    • 添加了對 Unicode 14.0.0 規範的支持。
    • Module(:name, false, false) 方法可用於建立不包含名稱、不匯入 Base 或 Core 且不包含對其自身的參考的模組。
  • 語言變化
    • 新建立的任務物件(@spawn、@async 等)現在在建立時具有來自父任務的方法的 world_age,從而允許最佳化執行。 使用 Base.invokelatest 方法可以使用先前的啟動選項。
    • 現在禁止在字串和註解中使用 Unicode 不平衡雙向格式化指令以避免注入。
    • Base.ifelse 現在被定義為通用函數而不是內建函數,允許套件擴展其定義。
    • 現在,如果全域變數被宣告為 T 類型,則每次對全域變數的賦值都會先呼叫 Convert(Any, x) 或 Convert(T, x)。在使用全域變數之前,請確保不變的 Convert(Any , x) === x 始終為true,否則可能會導致意外行為。
    • 內建函數現在類似於通用函數,並且可以使用方法以程式設計方式枚舉。
  • 編譯器/運行時改進
    • 啟動時間減少約 25%。
    • 基於 LLVM 的編譯器已從執行時間函式庫分離到一個新函式庫 libjulia-codegen 中。 預設會加載,因此正常使用時不應進行任何更改。 在不需要編譯器的部署中(例如,預先編譯了所有必要程式碼的系統映像),可以簡單地省略該程式庫(及其 LLVM 依賴項)。
    • 現在可以透過將參數傳遞給方法來進行條件類型推斷。 例如,對於 Base.ifelse(isa(x, Int), x, 0),即使 x 的類型未知,也會傳回 ::Int。
    • SROA(聚合的標量替換)已改進:消除了具有持久全域字段的 getfield 調用,消除了具有未初始化字段的可變結構,提高了嵌套 getfield 調用的性能和處理。
    • 類型推斷追蹤各種效果——副作用和非丟棄。 考慮到恆定傳播,這顯著提高了編譯時效能。 例如,在某些情況下,對無法內聯但不影響結果的函數的呼叫將在運行時被丟棄。 可以使用 Base.@assume_effects 巨集手動覆寫效果規則。
    • 預編譯(使用明確預編譯指令或指定的工作負載)現在可以保存更多類型定義的程式碼,從而加快首次執行速度。 包所需的任何新方法/類型組合,無論這些方法是在何處定義的,如果它們由屬於包的方法調用,現在都可以緩存在預編譯文件中。
  • 命令行參數更改
    • 監視 @inbounds 宣告的預設行為現在是「--check-bounds=yes|no|auto」中的 auto 選項。
    • 新的「--strip-metadata」選項可在建立系統映像時刪除文件字串、來源位置資訊和局部變數名稱。
    • 新選項「--strip-ir」允許編譯器在建置系統映像時刪除中間原始碼表示。 只有當使用“--compile=all”或預先編譯所有必要的程式碼時,產生的映像才有效。
    • 如果指定“-”字元而不是檔案名,則從標準輸入流讀取可執行代碼。
  • 多線程支援更改
    • Threads.@threads 預設使用新的調度選項 :dynamic,它與先前的模式不同,因為迭代將在可用的工作線程之間動態調度,而不是分配給每個執行緒。 此模式允許使用 @spawn 和 @threads 更好地分配嵌套循環。
  • 新的庫函數
    • eachsplit(str) 多次執行 split(str) 。
    • allequal(itr) 測試迭代器中的所有元素是否相等。
    • Hardlink(src, dst) 可用於建立硬連結。
    • setcpuaffinity(cmd, cpus) 設定處理器核心與已啟動程序的關聯性。
    • diskstat(path=pwd()) 取得磁碟統計資訊。
    • 新的 @showtime 巨集可顯示正在評估的行和 @time 報告。
    • 新增了LazyString和lazy"str"巨集來支援錯誤路徑中錯誤訊息的延遲建構。
    • 修正了 Dict 和其他衍生物件(例如keys(::Dict)、values(::Dict) 和 Set)中的並發問題。 現在可以在字典或集合上呼叫迭代方法,只要不存在修改字典或集合的呼叫即可。
    • @time 和 @timev 現在有一個可選的描述,例如,允許您註釋時間報告的來源。 @time“評估 foo”foo()。
    • range 將 stop 或 length 作為唯一的鍵字參數。
    • precision 和 set precision 現在接受 base 作為關鍵字
    • TCP套接字物件現在提供closewrite方法並支援使用半開模式。
    • extrema 現在接受 init 參數。
    • Iterators.countfrom 現在接受定義 + 方法的任何類型。
    • @time 現在分配重新編譯具有更改類型的方法所花費的時間百分比。
  • 標準庫變更
    • 具有值的鍵現在不會從 addenv 的環境中刪除任何內容。
    • Iterators.reverse(因此也是最後一個)支援每一行。
    • 某些類型範圍的長度函數不再檢查整數溢位。 一個新函數,checked_length,可用;它包含位元傳輸控制邏輯。 如有必要,請使用 SaferIntegers.jl 建構範圍類型。
    • 如果可能,Iterators.Reverse 迭代器會實作每個索引的反轉。
  • 包管理器
    • 處於「pkg>」狀態的軟體包旁邊有新的 ⌃ 和 ⌅ 指示符,表示有新版本可用。 ⌅ 表示無法安裝新版本。
    • Pkg.status 的新 outdated::Bool 參數(--outdated 或 REPL 模式中的 -o)顯示有關先前版本的軟體包的資訊。
    • Pkg.status 的新 compat::Bool 參數(REPL 模式下的 --compat 或 -c)可顯示 Project.toml 中的任何 [compat] 條目。
    • 用於設定專案相容性條目的新「pkg>compat」(和 Pkg.compat)模式。 透過「pkg>compat」提供互動式編輯器或透過「pkg>Foo 0.4,0.5」直接記錄控制,可以透過選項卡完成載入目前記錄。 即“pkg> compat Fo " 自動更新為 "pkg>Foo 0.4,0.5" 以允許編輯現有條目。
    • 如果伺服器正在監視包含軟體包的註冊表,則 Pkg 現在僅嘗試從軟體包伺服器下載軟體包。
    • 當 Project.toml 與 Manifest.toml 不同步時,Pkg.instantiate 現在將發出警告。 它在解析時根據清單中項目的 deps 和 compat 記錄(其他欄位被忽略)的雜湊來執行此操作,以便可以檢測到對 Project.toml deps 或 compat 記錄的任何更改,而無需重新解析。
    • 如果“pkg>add”找不到具有給定名稱的包,它現在會建議可以添加具有相似名稱的包。
    • 儲存在清單中的 julia 版本不再包含內部版本號,這意味著 master 現在將寫為 1.9.0-DEV。
    • 現在將更一致地偵測到測試中止“pkg>”,並將正確地返回 REPL。
  • 互動式工具
    • 新的 @time_imports 巨集報告導入包及其相依性所花費的時間,突出顯示編譯和重新編譯時間佔導入的百分比。
  • 線性代數
    • BLAS 子模組現在支援 2 級 BLAS spr! 函數。
    • LinearAlgebra.jl 標準函式庫現在完全獨立於 SparseArrays.jl,無論是從原始碼還是單元測試的角度來看。 因此,套用於 Base 或 LinearAlgebra 物件的 LinearAlgebra 方法不再(隱式)傳回稀疏數組。 特別是,這會導致以下重大變化:
      • 使用特殊“稀疏”矩陣(例如對角線)的串聯現在會返回密集矩陣; 因此,由 getproperty 呼叫建立的 SVD 物件的 D1 和 D2 欄位現在是稠密矩陣。
      • 類似的(::SpecialSparseMatrix, ::Type, ::Dims) 方法傳回稠密空矩陣。 因此,二、三和對稱三對角矩陣彼此的乘積導致產生稠密矩陣。 此外,由於“zero(::Type{Matrix{T}})”,從(非靜態)矩陣的特殊“稀疏”矩陣建構具有三個參數的類似矩陣現在會失敗。
  • 打印函數
    • %s 和 %c 現在使用 textwidth 參數來格式化寬度。
  • 個人資訊
    • CPU 負載分析現在記錄元數據,包括執行緒和任務。 Profile.print() 有一個新的 groupby 參數,可讓您對執行緒、任務或子執行緒/任務、任務/執行緒以及任務參數進行分組以提供篩選。 此外,利用率百分比現在以總體或每個線程的形式報告,具體取決於每個樣本中線程是否空閒。 Profile.fetch() 預設包含新的元資料。 為了向後相容分析資料的外部使用者,可以透過傳遞 include_meta=false 來排除它。
    • 新的 Profile.Allocs 模組可讓您分析記憶體分配。 記錄每個記憶體分配的類型和大小的堆疊跟踪,並且sample_rate參數允許跳過可配置數量的分配,從而減少效能開銷。
    • 現在,使用者可以在任務運行時運行固定持續時間的 CPU 分析,而無需先載入分析,並且將在運行時顯示報告。 在 MacOS 和 FreeBSD 上,按 ctrl-t 或呼叫 SIGINFO。 對於其他平台,啟動 SIGUSR1,即%殺死-USR1 $ julia_pid。 這在 Windows 上不可用。
  • 替換
    • RadioMenu 現在支援額外的鍵盤快捷鍵以直接選擇選項。
    • 序列“?(x, y”,然後按 TAB 鍵顯示可以使用參數 x, y, .... 呼叫的所有方法。(前導空格會阻止您進入幫助模式。)“MyModule.?(x, y "將搜尋限制為「MyModule」。按TAB 要求至少一個參數的類型比Any 更具體。或使用SHIFT-TAB 而不是TAB 以允許任何相容的方法。
    • 新的全域變數 err 可讓您取得最新的異常,類似於帶有最後回應的 ans 的行為。 輸入err會重新列印異常訊息。
  • 稀疏數組
    • 將 SparseArrays 程式碼從 Julia 儲存庫移至外部 SparseArrays.jl 儲存庫。
    • 新的串聯函數稀疏_hcat、稀疏_vcat 和稀疏_hvcat 傳回 SparseMatrixCSC 類型,無論輸入參數的類型為何。 在分離 LinearAlgebra.jl 和 SparseArrays.jl 程式碼後,有必要統一黏合矩陣的機制。
  • 記錄
    • 標準日誌記錄等級BelowMinLevel、Debug、Info、Warn、Error 和AboveMaxLevel 現在已從標準日誌記錄庫中匯出。
  • Unicode的
    • 新增了 isequal_normalized 函數來檢查 Unicode 等效性,而無需明確建構規範化字串。
    • Unicode.normalize 函數現在接受 Charttransform 關鍵字,該關鍵字可用於提供自訂字元映射,並且還提供 Unicode.julia_chartransform 函數來重現 Julia 解析器規範化識別碼時使用的映射。
  • 測試
    • 現在可以使用「@test_throws「some message」triggers_error()」來測試顯示的錯誤文字是否包含「some message」錯誤,無論具體的異常類型為何。 也支援正規表達式、字串列表和匹配函數。
    • @testset foo() 現在可用於從給定函數建立測試集。 測試用例名稱是被呼叫的函數的名稱。 被調用的函數可能包含@test和其他@testset定義,包括對其他函數的調用,同時記錄所有中間測試結果。
    • TestLogger 和 LogRecord 現在已從標準測試庫匯出。
  • 分散式
    • SSHManager 現在透過 addprocs() 方法和 shell=:csh 參數支援帶有 csh/tcsh 包裝器的工作線程。
  • 其他變化
    • GC.enable_logging(true) 可用來記錄每個垃圾收集作業的時間和收集的記憶體量。

來源: opennet.ru

添加評論