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.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)。