Julia v1.10 版本说明

新语言特性

  • JuliaSyntax.jl 现在用作默认解析器,提供更好的诊断和更快的解析。如果需要(并且如果您发现有必要,请提交问题),可以将环境变量 JULIA_USE_FLISP_PARSER 设置为 1 以切换回旧解析器 (#46372).
  • (U+297A, \leftarrowsubset) 和 (U+2977, \leftarrowless) 现在可以用作具有箭头优先级的二元运算符 (#45962).

语言变更

  • 当一个任务派生出一个子任务时,父任务的任务局部 RNG(随机数生成器)不再受到影响。子任务的种子基于父任务,也采用了更严格的防碰撞设计,使用基于 SplitMix 和 DotMix 可分割 RNG 方案的设计 (#49110).
  • 一个新的更具体的规则用于解决方法歧义,优先选择明确定义为处理 Union{} 参数的方法。这使得能够定义方法来明确处理 Union{},而不会像以前那样经常出现歧义。这也使运行时能够以一种显著改善高度重载方法(例如特质和构造函数)的加载和推断时间的方式优化某些方法查找。 (#49349)
  • "h bar" (\hslash U+210F) 字符现在被视为等效于 ħ (\hbar U+0127)。
  • @simd 宏现在具有更有限和更清晰的语义:它只允许对浮点数操作进行重排序和收缩,而不是启用所有“fastmath”优化。如果您观察到由于此更改导致的性能下降,您可以使用 @fastmath @simd 恢复以前的 behavior,如果您接受 @fastmath 宏启用的所有优化 (#49405).
  • 当一个带有关键字参数的方法在堆栈跟踪视图中显示时,关键字参数类型的文本表示形式使用新的 @Kwargs{key1::Type1, ...} 宏语法进行简化 (#49959).

编译器/运行时改进

  • 垃圾回收的标记阶段现在是多线程的 (#48600).
  • 当 Julia 链接到 LLVM 15 或更高版本时,JITLink 在 Linux aarch64 上默认启用 (#49745)。这应该解决之前在这个平台上观察到的许多段错误。
  • 预编译过程现在使用 pidfile 锁并协调多个 julia 进程,只让一个进程花费时间进行预编译,而其他进程则等待。以前所有进程都会执行操作并争先恐后地覆盖缓存文件。 (#49052)

命令行选项变更

  • 新选项 --gcthreads 用于设置垃圾回收将使用的线程数 (#48600)。默认值为 N/2,其中 N 是 Julia 使用的工作线程数 (--threads)。

构建系统变更

  • SparseArrays 和 SuiteSparse 不再包含在默认系统映像中,因此核心语言不再包含 GPL 库。但是,这些库仍然包含在语言旁边,作为标准二进制分发版的一部分 (#44247, #48979, #49266).

新库函数

  • 现在定义了 tanpi。它计算 tan(πx) 的精度高于 `tan(pix)` (#48575).
  • fourthroot(x) 现在在 Base.Math 中定义,可用于计算 x 的四次方根。它也可以通过 unicode 字符 访问,该字符可以通过 \fourthroot<tab> 输入 (#48899).
  • Libc.memmoveLibc.memsetLibc.memcpy 现在已定义,其功能与各自的 C 调用一致。
  • Base.isprecompiled(pkg::PkgId) 已添加,用于识别包是否已预编译 (#50218).

新库特性

  • binomial(x, k) 现在支持非整数 x (#48124).
  • CartesianIndex 现在被视为广播的“标量” (#47044).
  • printstyled 现在支持斜体输出 (#45164).
  • parentparentindices 支持 SubString
  • replace(string, pattern...) 现在支持可选的 IO 参数,将输出写入流而不是返回字符串 (#48625).
  • startswith 现在支持可搜索的 IO 流 (#43055).

标准库变更

  • sortperm!partialsortperm!initialized=true 关键字赋值现在是无操作 (#47979)。它以前会暴露不安全的 behavior (#47977).
  • 打印整数 Rational 将在 Rational 类型化的 IO 上下文中跳过分母(例如在数组中) (#45396).

包管理器

  • Pkg.precompile 现在接受 timing 作为关键字参数,该参数显示预编译的每个包的计时信息(例如 Pkg.precompile(timing=true))。

线性代数

  • AbstractQ 不再是 AbstractMatrix 的子类型。此外,adjoint(Q::AbstractQ) 不再将 Q 包裹在 Adjoint 类型中,而是包裹在 AdjointQ 中,AdjointQ 本身是 AbstractQ 的子类型。此更改说明通常 AbstractQ 实例的行为类似于基于函数的、以矩阵为支持的线性运算符,因此不允许高效索引。此外,许多 AbstractQ 类型可以作用于不同大小的向量/矩阵,就像一个具有上下文相关大小的矩阵。通过此更改,AbstractQ 具有一个定义明确的 API,该 API 在 Julia 文档 中进行了详细描述 (#46196).
  • Factorization 对象的伴随矩阵和转置矩阵不再分别被包裹在 AdjointTranspose 包装器中。相反,它们被包裹在 AdjointFactorizationTranposeFactorization 类型中,它们本身是 Factorization 的子类型 (#46874).
  • 新函数 hermitianparthermitianpart! 用于提取矩阵的 Hermitian(实对称)部分 (#31836).
  • 现在,AbstractMatrix 的伴随矩阵或转置矩阵的 norm 默认情况下返回父矩阵的范数,与当前 AbstractVector 的行为一致(#49020)。
  • eigen(A, B)eigvals(A, B),其中 AB 之一是对称的或厄米特的,现在得到完全支持(#49533)。
  • eigvals/eigen(A, cholesky(B)) 现在通过 Cholesky 分解计算 AB 的广义特征值(eigen:和特征向量),对于正定 B。注意:第二个参数是 cholesky 的输出。

Printf

  • 格式说明符现在支持动态宽度和精度,例如 %*s%*.*g#40105)。

REPL

  • 当打印堆栈跟踪时,函数签名中类型打印的深度将被限制,以避免输出过于冗长(#49795)。

Test

  • @test_broken 宏(或带有 broken=true@test)现在会像非断点测试一样,在测试表达式返回非布尔值时报错(#47804)。
  • 当在函数内部调用 @test 失败或出错时,现在会打印更大的堆栈跟踪,以便可以检索到测试在 @testset 中的位置(#49451)。

InteractiveUtils

  • code_native@code_native 现在默认为 Intel 语法,而不是 AT&T 语法。
  • @time_imports 现在会显示任何运行的模块 __init__() 的计时(#49529)。

Deprecated or removed

  • @pure 宏现在已弃用。请使用 Base.@assume_effects :foldable 代替(#48682)。