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"
ℏ(\hslashU+210F) 字符现在被视为等效于ħ(\hbarU+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.memmove、Libc.memset和Libc.memcpy现在已定义,其功能与各自的 C 调用一致。Base.isprecompiled(pkg::PkgId)已添加,用于识别包是否已预编译 (#50218).
新库特性
binomial(x, k)现在支持非整数x(#48124).CartesianIndex现在被视为广播的“标量” (#47044).printstyled现在支持斜体输出 (#45164).parent和parentindices支持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对象的伴随矩阵和转置矩阵不再分别被包裹在Adjoint和Transpose包装器中。相反,它们被包裹在AdjointFactorization和TranposeFactorization类型中,它们本身是Factorization的子类型 (#46874).- 新函数
hermitianpart和hermitianpart!用于提取矩阵的 Hermitian(实对称)部分 (#31836). - 现在,
AbstractMatrix的伴随矩阵或转置矩阵的norm默认情况下返回父矩阵的范数,与当前AbstractVector的行为一致(#49020)。 eigen(A, B)和eigvals(A, B),其中A或B之一是对称的或厄米特的,现在得到完全支持(#49533)。eigvals/eigen(A, cholesky(B))现在通过 Cholesky 分解计算A和B的广义特征值(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)。