Julia 編程語言 1.12 發布

編程語言 Julia 1.12 版本已經發布,結合了高性能、動態類型支持和內置並行編程工具等品質。 Julia 的語法接近 MATLAB,但有些元素借用自 Ruby 和 Lisp。 字符串操作方法讓人想起Perl。 該項目代碼是根據 MIT 許可證分發的。

該語言的主要特點:

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

Julia 1.12 的主要變化:

  • 新的語言特性
    • 實驗性的「--trim」選項透過移除指定入口點無法存取的程式碼,創建更緊湊的二進位。入口點可以使用「Base.Experimental.entrypoint」標記。並非所有程式碼都支援此選項。
    • 常量覆蓋現已明確定義,並遵循世界時代語意。允許進行其他覆蓋(例如,類型的覆蓋)。
    • “names”函數中新增了一個新的參數“usings::Bool”,使該函數傳回透過“using”可見的所有名稱。
    • @atomic 巨集系列現在支援引用賦值語法,例如 @atomic :monotonic v[3] += 4,該語法以單調排序語義原子地修改 v[3]。支援的語法包括:
      • 原子讀取(“x = @atomic v[3]”),
      • 原子賦值(“@atomic v[3] = 4”),
      • 原子變化(“@atomic v[3] += 2”),
      • 原子單次賦值(“@atomiconce v[3] = 2”),
      • 原子交換(“x = @atomicswap v[3] = 2”),
      • 原子替換(“x = @atomicreplace v[3] 2=>5”)。
    • 新參數「--task-metrics=yes」啟用收集每個任務的執行時間資訊。此參數可在執行時使用「Base.Experimental.task_metrics(::Bool)」切換開啟/關閉。可用指標:
      • 任務的實際執行時間,包括編譯和垃圾收集(“Base.Experimental.task_running_time_ns”),
      • 從任務開始到完成的時間(「Base.Experimental.task_wall_time_ns」)。
    • Unicode 16 支援。
    • "Threads.@spawn" 現在接受 ":samepool" 參數,用於指定與呼叫程式碼相同的執行緒池。 "Threads.@spawn :samepool foo()" 是 "Threads.@spawn Threads.threadpool() foo()" 的簡寫。
    • “@ccall”巨集現在可以接受“gc_safe”參數。如果此參數為真,則運行時可以在呼叫「ccall」時並行執行垃圾回收。
  • 語言變化
    • 當用等效簽名取代方法時,現有方法不會被刪除,而是優先使用新方法。如果新方法被刪除,舊方法將恢復工作。這在模擬測試框架(SparseArrays、Pluto、Mocking 等)中非常有用,因為無需明確恢復舊方法。目前,這種情況需要重新編譯,但將來或許可以重複使用舊結果。
    • 巨集擴充將不再立即遞歸地從巨集中輸入“Expr(:toplevel)”表達式。相反,“:toplevel”擴展將推遲到運行時進行。這使得同一「:toplevel」中的後續表達式能夠利用先前定義的巨集。
    • 簡單的無限循環(例如“while true; end”)不再被視為未定義行為。真正執行某些操作的無限循環(例如帶有副作用或睡眠)從來都不是,現在也不會被視為未定義行為。
    • 現在將標識符同時標記為“公共”和“導出”是錯誤的。
    • “getfield” 中的運行時錯誤現在會拋出一個新的異常類型“FieldError”,而不是通用的“ErrorException”。
    • 函數宣告中的巨集不再需要括號。例如,現在可以接受“function @main(args) … end”,而之前則必須使用“function (@main)(args) … end”。
    • 在包本身內對包名稱調用“using”(尤其適用於嵌套模組)現在可以明確使用該包,而無需查看清單和環境,就像“..Name”一樣。這更好地匹配了預期的行為。
  • 編譯器/運行時改進
    • LLVM 產生的中間程式碼 (IR) 現在使用指標類型,而不是將指標作為整數傳遞。這會影響“llvmcall”:內建的 LLVM IR 應進行更新,將“i32”/“i64”替換為“i8*”或“ptr”,並刪除不必要的“ptrtoint”/“inttoptr”轉換。為了相容,仍然支援具有整數指標的 IR,但會發出警告。
  • 命令行參數更改
    • 可以傳遞“-m/--module”標誌,以使用一組參數運行套件中的“main”函數。此函數必須使用“@main”聲明,表明它是入口點。
    • 現在可以使用「NO_COLOR」和「FORCE_COLOR」環境變數啟用或停用 Julia 的顏色輸出。 Julia 建置系統也支援這些變數。
    • “--project=@temp” 以臨時環境啟動 Julia。
    • 新的“--trace-compile-timing”選項以毫秒為單位列印“--trace-compile”輸出的每個方法的編譯時間。
    • “--trace-compile”現在以黃色列印重新編譯的方法,或者如果沒有顏色則添加註釋。
    • 新的“--trace-dispatch”選項列印動態分配的方法。
  • 多執行緒變化
    • Julia 現在預設使用 1 個「交互」線程,此外還有 1 個主「工作」線程,即「-t1,1」。這意味著主任務和 REPL(以交互模式運行)之前都在執行緒 1 中運行,現在將在交互池中運行。 libuv 的 I/O 循環也在執行緒 1 中執行,確保有效率地利用「Threads.@spawn」所使用的工作池。請求恰好 1 個線程(“-t1”/“JULIA_NUM_THREADS=1”)或 0 個交互線程將禁用交互線程:“-t1,0”、“JULIA_NUM_THREADS=1,0”或“-tauto,0”。請求多個線程將啟用交互線程;例如,“-t2”等同於“-t2,1”。提醒一下,緩衝區不應綁定到“threadid()”。
    • 為每個進程執行一次的程式碼範本定義了新的類型—「OncePerProcess{T}」類型允許您定義一個函數,該函數僅在第一次呼叫時執行一次,然後在後續呼叫中始終傳回相同的「T」類型值。此外,還有「OncePerThread{T}」和「OncePerTask{T}」類型,可用於執行緒或任務的類似用途。
  • 建置系統變更
    • 新增了使用 BOLT(二進位優化和佈局工具)建立 Julia 和 LLVM 的新 Makefile。請參閱“contrib/bolt”和“contrib/pgo-lto-bolt”。
  • 新的庫函數
    • 「logrange(start, stop; length)」建立一個具有恆定比率而不是恆定步長的範圍。
    • 新函式「isfull(c::Channel)」檢查「put!(c, some_value)」是否會阻塞。
    • 「waitany(tasks; throw=false)」和「waitall(tasks; failfast=false, throw=false)」等待多個任務同時完成。
    • “uuid7()”建立符合 RFC 9562 的版本 7 UUID。
    • “insertdims(array; dims)”將單元素維度插入數組 - “dropdims”的逆操作。
    • 新的“Fix”類型將“Fix1/Fix2”概括為修復單一參數。
    • “Sys.detectwsl()” 檢查 Julia 是否在執行時在 WSL 內運作。
  • 圖書館的新機遇
    • 「escape_string」 採用附加參數「ascii=true」(轉義所有非 ASCII 字元)和「fullhex=true」(在 u/U 轉義中使用完整的 4/8 位元十六進位格式,例如為了與 C 相容)。
    • 「tempname」 現在可以接受後綴字串,以便檔案名稱包含該後綴,並考慮到唯一性。
    • RegexMatch 物件現在可用於建立 NamedTuple 和 Dict。
    • “可鎖定”現在可以匯出。
    • 「Base.require_one_based_indexing」和「Base.has_offset_axes」現已公開。
    • 新增了新函數「ltruncate」、「rtruncate」和「ctruncate」來將字串截斷為文字寬度,同時考慮字元寬度。
    • 「isless」函數(以及「cmp」、排序等)現在支援零維「AbstractArray」。
    • “invoke”現在允許傳遞“方法”而不是類型簽名。
    • “invoke” 現在接受“CodeInstance”而不是類型,這可能會加快一些編譯器插件工作流程。
    • 「Timer(f, …)」現在在建立定時器任務時會繼承父任務的黏性,可以使用新的「spawn」參數覆蓋。這解決了黏性生成的任務(“@async”)會導致父任務也黏性的問題。
    • 「計時器」現在具有可讀的「超時」和「間隔」屬性,以及更具描述性的「顯示」方法。
    • 'sort' 現在支援 'NTuple' 元組。
    • 「map!(f, A)」現在將結果儲存在「A」中,如「map!(f, A, A)」或「A .= f.(A)」。
    • 帶有函數參數的“setprecision”(通常透過“do”區塊)現在是線程安全的。應避免使用其他形式,並且類型應遷移到使用“ScopedValue”的實作。
  • 標準庫變更
    • 「gcdx(0, 0)」現在回傳「(0, 0, 0)」而不是「(0, 1, 0)」。
    • “fd” 傳回“RawFD”而不是“Int”。
    • JuliaSyntaxHighlighting 包
      • 一個新的標準包,用於將語法突出顯示應用於 Julia 程式碼,使用 JuliaSyntax 和 StyledStrings 實作突出顯示功能,該功能會產生應用突出顯示的 AnnotatedString。
    • LinearAlgebra 套件。
      • 「rank」 現在可以接受「QRPivoted」矩陣來透過 QR 分解來估計排名。
      • 為自伴矩陣類型(典型的聯合“RealHermSymComplexHerm”)的“eigen”、“eigen!”、 “eigvals”和“eigvals!”添加了“alg”關鍵參數,允許在不同的特徵值提取演算法之間切換。
      • 新增了具有旋轉取樣的未阻塞 Cholesky 分解的通用版本(透過「cholesky[!](A, RowMaximum())」呼叫)。
      • BLAS 執行緒的預設數量現在考慮了進程親和性,而不僅僅是系統中的邏輯執行緒數量。
      • 新增了“zeroslike”函數,該函數傳回基於磁帶的矩陣的零元素。自訂數組類型可以特化此函數以傳回正確的結果。
      • 矩陣乘法「A * B」現在呼叫「matprod_dest(A, B, T::Type)」來產生目標值。此函數現已公開。
      • haszero(T::Type) 函數用於檢查類型「T」是否具有唯一的零元素,定義為「zero(T)」。該函數現已公開。
      • 新增了“diagview”函數,它會傳回“AbstractMatrix”矩陣特定對角線的視圖。
    • 設定檔包
      • “Profile.take_heap_snapshot”現在接受一個新參數“redact_data::Bool”,預設值為“true”。如果啟用,Julia 物件(例如字串)的內容將不包含在堆疊快照中。
      • 「Profile.print()」現在以與堆疊追蹤相同的方式為Base/Core/Package模組著色,並且現在可以在支援URI連結的終端中點擊路徑(甚至是截斷的路徑),並允許在「JULIA_EDITOR」指定的編輯器中開啟指定的檔案和行。
    • 替換
      • 透過使用“names()”函數中的新特性“usings=true”,REPL 補全可以完成透過“using”可見的名稱。
      • REPL 補全現在可以補全「[import|using] Mod: xxx|」這樣的字串,例如將「using Base.Experimental: @op」補全為「using Base.Experimental: @opaque」。
      • 如果某個名稱透過未定義該名稱的模組(且沒有定義該名稱的子模組)引用,且該名稱在該模組中不公開,則 REPL 現在會發出警告。例如,「map」 在 Base 中定義,在 REPL 中執行「LinearAlgebra.map」現在會在第一次進行此類引用時發出警告。
      • 將輸入輸出到 REPL 時,輸出現在會被截斷為 20 KiB。這不會影響手動呼叫“show”、“print”等命令。
      • 現在,「\」字元的自動完成功能會在每個符合的代碼字旁邊顯示對應的字元或表情符號。
    • 測試包
      • 如果 DefaultTestSet 測試套件失敗,則會列印測試套件的隨機數產生器 (RNG),以協助重現僅依賴 RNG 狀態的隨機錯誤。您也可以透過將 rng 參數傳遞給 @testset 巨集來指定測試套件的 RNG:julia using Test, Random @testset rng=Xoshiro(0x2e026445595ed28e, 0x07bb81ac4c54926d, 0x83d7d 0xdbf91ddf2534f850) begin @test rand() == 0.559472630416976 end
    • InteractiveUtils 套件
      • 新的巨集「@trace_compile」和「@trace_dispatch」分別用於使用參數「--trace-compile=stderr --trace-compile-timing」和「--trace-dispatch=stderr」執行表達式。
  • 外部依賴
    • Julia 現在預設包含終端資訊(「terminfo」)資料庫,當系統上沒有 terminfo 時,可提升 REPL 的效能。使用 Makefile 參數“WITH_TERMINFO=0”即可在不包含資料庫的情況下建置 Julia。
  • 工具改進
    • 對於需要採樣分析器來捕獲任務(無論其狀態如何,例如已調度/正在運行)的用戶,我們提供了一個掛鐘時間分析器。此分析器可以分析 I/O 密集型任務,並協助識別系統中的高爭用區域。

來源: opennet.ru

為具有 DDoS 保護、VPS VDS 服務器的站點購買可靠的主機 🔥 購買具備 DDoS 防護的可靠網站寄存服務,包括 VPS 和 VDS 伺服器 | ProHoster