編程語言 Julia 1.9 可用

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

該語言的主要特點:

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

Julia 1.9 的主要變化:

  • 新的語言特性
    • 允許使用“setproperty!(::Module, ::Symbol, x)”在另一個模塊中進行分配。
    • 允許不在最終位置進行多重分配。 例如,字符串“a, b..., c = 1, 2, 3, 4”將被處理為“a = 1; b…, = 2, 3; c = 4"。 這是通過 Base.split_rest 處理的。
    • 單字符文字現在支持與字符串文字相同的語法; 那些。 該語法可以表示無效的 UTF-8 序列,正如 Char 類型所允許的那樣。
    • 添加了對 Unicode 15 規範的支持。
    • 元組和命名字符元組的嵌套組合現在可以用作類型參數。
    • 新的內置函數“getglobal(::Module, ::Symbol[, order])”和“setglobal!(::Module, ::Symbol, x[, order])”專門用於讀取和寫入全局變量。 對於訪問全局變量,現在應該優先使用 getglobal 方法而不是 getfield 方法。
  • 語言變化
    • 1.7 版中引入的“@invoke”宏現已導出並可供使用。 此外,當省略“x”參數的類型註釋時,它現在使用“Core.Typeof(x)”方法而不是“Any”。 這是必要的,以便正確處理作為參數傳遞的類型。
    • 啟用版本 1.7 中引入的“invokelatest”函數和“@invokelatest”宏的導出。
  • 編譯器/運行時改進
    • 顯著縮短首次執行時間(TTFX - 首次執行時間)。 包預編譯現在將本機代碼保存在“pkgimage”中,這意味著預編譯期間生成的代碼在包加載後不需要重新編譯。 可以使用“--pkgimages=no”選項禁用 pkgimages 模式的使用。
    • 類型推斷的二次復雜度的已知問題已得到解決,並且通常推斷使用更少的內存。 一些具有自動生成的長函數的邊緣情況(例如具有偏微分方程和大型因果模型的 ModelingToolkit.jl)編譯速度要快得多。
    • 使用非特定類型參數的調用現在可以針對注入或靜態解析進行聯合分割優化,即使存在多種不同類型的調度候選者。 通過靜態解析“@nospecialize-d”調用站點並避免重新編譯,可以在對像類型未完全靜態解析的某些情況下提高性能。
    • Base 模塊中 @pure 宏的所有使用均已替換為 Base.@assume_effects。
    • 使用類型比通常用於 f(args...) 的類型不太具體的調用 invoke(f, invokesig, args...) 不再導致包被重新編譯。
  • 命令行參數更改
    • 在 Linux 和 Windows 上,“--threads=auto”選項現在嘗試根據 CPU 關聯性確定可用的處理器數量,這是通常在 HPC 和雲環境中設置的掩碼。
    • “--math-mode=fast”選項已被禁用,建議使用“@fastmath”宏,它具有明確定義的語義。
    • “--threads”參數現在的格式為“auto | N[,auto|M]”,其中 M 指定要創建的交互式線程的數量(當前 auto 表示 1)。
    • 添加了選項“--heap-size-hint= ”,它設置了閾值,在此之後主動垃圾收集開始。 大小可以以字節、千字節 (1000 KB)、兆字節 (300 MB) 或千兆字節 (1,5 GB) 為單位指定。
  • 多線程變化
    • “Threads.@spawn”現在有一個可選的第一個參數“:default”或“:interactive”。 交互式任務需要低延遲響應,並且被設計為短期或頻繁執行。 如果在啟動 Julia 時指定了交互式任務,則交互式任務將在交互式線程上運行。
    • 在 Julia 運行時之外啟動的線程(例如,從 C 或 Java)現在可以使用“jl_adopt_thread”調用 Julia 代碼。 當您通過“cfunction”或“@ccallable”入口點輸入 Julia 代碼時,這種情況會自動發生。 因此,線程數現在可以在運行時更改。
  • 新的庫函數
    • 新的“Iterators.flatmap”函數。
    • 新的“pkgversion(m::Module)”函數用於獲取加載給定模塊的包的版本,類似於“pkgdir(m::Module)”。
    • 新的“stack(x)”函數將“reduce(hcat, x::Vector{<:Vector})”推廣到任何維度,並允許迭代器的任何迭代器。 “stack(f, x)”方法概括了“mapreduce(f, hcat, x)”並且效率更高。
    • 用於解析已分配內存的新宏“@allocations”,與“@alulated”類似,只不過它返回內存分配的數量,而不是已分配內存的總大小。
  • 圖書館的新特色
    • “RoundFromZero”現在適用於“BigFloat”以外的類型。
    • 現在可以使用“sizehint!”手動縮小“Dict”。
    • “@time”現在單獨指示重新編譯無效方法所花費的時間百分比。
  • 標準庫的變化
    • 修復了 Dict 和其他派生對象(例如keys(::Dict)、values(::Dict) 和 Set)的迭代方法中的並發問題。 現在,只要不存在修改字典或集合的操作,就可以在無限數量的線程上並行地對字典或集合調用這些迭代方法。
    • 現在,對謂詞函數“!f”取反將返回複合函數“(!) ∘ f”,而不是匿名函數。
    • 維度切片函數現在可以跨多個維度工作:“eachslice”、“eachrow”和“eachcol”返回一個“Slices”對象,允許分派提供更高效的方法。
    • 向公共 API 添加了“@kwdef”宏。
    • 修復了“fld1”中操作順序的問題。
    • 排序現在始終是時間穩定的(重新設計的快速排序)。
    • “Base.splat”現已導出。 返回值是“Base.Splat”類型而不是匿名函數,這使得可以很好地推斷它。
  • 包管理器
    • “包擴展”:支持從 Julia 會話中加載的其他包加載代碼片段。 該應用程序類似於“Requires.jl”包,但支持預編譯和配置兼容性。
  • 線性代數庫
    • 由於存在與元素除法混淆的風險,帶有標量“a”和向量“b”的“a / b”和“b \ a”方法被刪除,它們相當於“a * pinv(b)”。
    • BLAS 和 LAPACK 調用現在使用“libblastrampoline (LBT)”。 默認情況下提供 OpenBLAS,但不支持使用其他 BLAS/LAPACK 庫構建系統映像。 相反,建議使用 LBT 機制將 BLAS/LAPACK 替換為另一組可用的庫。
    • “lu”支持新的“RowNonZero()”矩陣旋轉策略,該策略選擇第一個非零旋轉元素與新算術類型一起使用並用於教育目的。
    • “normalize(x, p=2)”現在支持任何標準化向量空間“x”,包括標量。
    • BLAS 線程的默認數量現在等於 ARM 架構上的 CPU 線程數,以及其他架構上的 CPU 線程數的一半。
  • Printf:重新設計了格式錯誤的字符串的錯誤消息,以提高可讀性。
  • Profile:新的“Profile.take_heap_snapshot(file)”函數,以 Chrome 支持的基於 JSON 的“.heapsnapshot”格式捕獲文件。
  • 隨機:randn 和 randexp 現在適用於定義 rand 的任何 AbstractFloat 類型。
  • 替換
    • 現在按“Alt-e”組合鍵可打開編輯器中的當前輸入。 當編輯器退出時,內容(如果更改)將被執行。
    • 可以使用“REPL.activate(::Module)”函數或通過在 REPL 中輸入模塊並按“Alt-m”組合鍵來更改 REPL 中當前活動的模塊上下文(默認情況下為 Main)。
    • “編號提示”模式打印每個輸入和輸出的數字並將評估結果存儲在 Out 中,可以使用“REPL.numbered_prompt!()”激活。
    • 製表符補全顯示可用的關鍵字參數。
  • SuiteSparse:將“SuiteSparse”求解器的代碼移至“SparseArrays.jl”。 求解器現在由“SuiteSparse.jl”重新導出。
  • 稀疏數組
    • SuiteSparse 求解器現在可作為 SparseArrays 的子模塊使用。
    • 通過消除全局變量和使用鎖,改進了 UMFPACK 和 CHOLMOD 流保護模式。 多線程“ldiv!” 現在可以安全地執行 UMFPACK 對象。
    • 實驗函數“SparseArrays.allowscalar(::Bool)”允許您禁用或啟用稀疏數組的標量索引。 此函數旨在檢測“SparseMatrixCSC”對象的隨機標量索引,這是性能問題的常見根源。
  • 測試套件的新故障轉移模式可在發生故障或錯誤時提前終止測試運行。 通過“@testset kwarg failurefast=true”或“export JULIA_TEST_FAILFAST=true”進行設置。 在 CI 啟動中這可能是必要的,以便接收早期錯誤消息。
  • 日期:空字符串不再被錯誤地解析為有效的“DateTime”、“Dates”或“Times”值,而是在構造函數和解析中拋出“ArgumentError”錯誤,而“tryparse”不返回任何內容。
  • 分佈式包
    • 現在,當添加本地工作進程時(例如使用“addprocs(N::Int)”或使用命令行標誌“-procs=N”),包配置(活動項目、“LOAD_PATH”、“DEPOT_PATH”)會被傳播。
    • 本地工作進程的“addprocs”現在採用名為“env”的參數將環境變量傳遞給工作進程。
  • Unicode:“graphemes(s, m:n)”返回“s”中第 m 到第 n 個字素的子字符串。
  • DelimitedFiles 軟件包已從系統庫中刪除,現在作為單獨的軟件包分發,必須顯式安裝才能使用。
  • 外部依賴
    • Linux 會自動檢測系統庫 libstdc++ 的版本,如果較新則加載它。 無論系統版本如何,都可以通過設置“JULIA_PROBE_LIBSTDCXX=0”環境變量來恢復加載內置 libstdc++ 的舊行為。
    • 從 julia 二進製文件中刪除了“RPATH”,這可能會破壞 Linux 上無法定義“RUNPATH”變量的庫。
    • 工具改進:“MethodError”和方法(例如,來自“methods(my_func)”)的輸出現在根據方法在堆棧跟踪中的輸出方式進行格式化和著色。

    來源: opennet.ru

添加評論