Julia v1.10 Release Notes
New language features
- JuliaSyntax.jl is now used as the default parser, providing better diagnostics and faster parsing. Set environment variable
JULIA_USE_FLISP_PARSER
to1
to switch back to the old parser if necessary (and if you find this necessary, please file an issue) (#46372). ⥺
(U+297A,\leftarrowsubset
) and⥷
(U+2977,\leftarrowless
) may now be used as binary operators with arrow precedence (#45962).
Language changes
- When a task forks a child, the parent task's task-local RNG (random number generator) is no longer affected. The seeding of child based on the parent task also takes a more disciplined approach to collision resistance, using a design based on the SplitMix and DotMix splittable RNG schemes (#49110).
- A new more-specific rule for methods resolves ambiguities containing Union{} in favor of the method defined explicitly to handle the Union{} argument. This makes it possible to define methods to explicitly handle Union{} without the ambiguities that commonly would result previously. This also lets the runtime optimize certain method lookups in a way that significantly improves load and inference times for heavily overloaded methods that dispatch on Types (such as traits and constructors).
- The "h bar"
ℏ
(\hslash
U+210F) character is now treated as equivalent toħ
(\hbar
U+0127). - The
@simd
macro now has more limited and clearer semantics: it only enables reordering and contraction of floating-point operations, instead of turning on all "fastmath" optimizations. If you observe performance regressions due to this change, you can recover previous behavior with@fastmath @simd
, if you are OK with all the optimizations enabled by the@fastmath
macro (#49405). - When a method with keyword arguments is displayed in the stack trace view, the textual representation of the keyword arguments' type is simplified using the new
@Kwargs{key1::Type1, ...}
macro syntax (#49959).
Compiler/Runtime improvements
- Updated GC heuristics to count allocated pages instead of object sizes (#50144). This should help some programs that consumed excessive memory before.
- The mark phase of the garbage collector is now multi-threaded (#48600).
- JITLink is enabled by default on Linux aarch64 when Julia is linked to LLVM 15 or later versions (#49745). This should resolve many segmentation faults previously observed on this platform.
- The precompilation process now uses pidfile locks and orchestrates multiple julia processes to only have one process spend effort precompiling while the others wait. Previously all would do the work and race to overwrite the cache files. (#49052)
Command-line option changes
- New option
--gcthreads
to set how many threads will be used by the garbage collector (#48600). The default isN/2
whereN
is the number of worker threads (--threads
) used by Julia.
Build system changes
- SparseArrays and SuiteSparse are no longer included in the default system image, so the core language no longer contains GPL libraries. However, these libraries are still included alongside the language in the standard binary distribution (#44247, #48979, #49266).
New library functions
tanpi
is now defined. It computes tan(πx) more accurately than `tan(pix)` (#48575).fourthroot(x)
is now defined inBase.Math
and can be used to compute the fourth root ofx
. It can also be accessed using the unicode character∜
, which can be typed by\fourthroot<tab>
(#48899).Libc.memmove
,Libc.memset
, andLibc.memcpy
are now defined, whose functionality matches that of their respective C calls.Base.isprecompiled(pkg::PkgId)
has been added, to identify whether a package has already been precompiled (#50218).
New library features
binomial(x, k)
now supports non-integerx
(#48124).- A
CartesianIndex
is now treated as a "scalar" for broadcasting (#47044). printstyled
now supports italic output (#45164).parent
andparentindices
supportSubString
s.replace(string, pattern...)
now supports an optionalIO
argument to write the output to a stream rather than returning a string (#48625).startswith
now supports seekableIO
streams (#43055).
Standard library changes
- The
initialized=true
keyword assignment forsortperm!
andpartialsortperm!
is now a no-op (#47979). It previously exposed unsafe behavior (#47977). - Printing integral
Rational
s will skip the denominator inRational
-typed IO context (e.g. in arrays) (#45396).
Package Manager
Pkg.precompile
now acceptstiming
as a keyword argument which displays per package timing information for precompilation (e.g.Pkg.precompile(timing=true)
).
LinearAlgebra
AbstractQ
no longer subtypesAbstractMatrix
. Moreover,adjoint(Q::AbstractQ)
no longer wrapsQ
in anAdjoint
type, but instead in anAdjointQ
, that itself subtypesAbstractQ
. This change accounts for the fact that typicallyAbstractQ
instances behave like function-based, matrix-backed linear operators, and hence don't allow for efficient indexing. Also, manyAbstractQ
types can act on vectors/matrices of different size, acting like a matrix with context-dependent size. With this change,AbstractQ
has a well-defined API that is described in detail in the Julia documentation (#46196).- Adjoints and transposes of
Factorization
objects are no longer wrapped inAdjoint
andTranspose
wrappers, respectively. Instead, they are wrapped inAdjointFactorization
andTranposeFactorization
types, which themselves subtypeFactorization
(#46874). - New functions
hermitianpart
andhermitianpart!
for extracting the Hermitian (real symmetric) part of a matrix (#31836). - The
norm
of the adjoint or transpose of anAbstractMatrix
now returns the norm of the parent matrix by default, matching the current behaviour forAbstractVector
s (#49020). eigen(A, B)
andeigvals(A, B)
, where one ofA
orB
is symmetric or Hermitian, are now fully supported (#49533).eigvals/eigen(A, cholesky(B))
now computes the generalized eigenvalues (eigen
: and eigenvectors) ofA
andB
via Cholesky decomposition for positive definiteB
. Note: The second argument is the output ofcholesky
.
Printf
- Format specifiers now support dynamic width and precision, e.g.
%*s
and%*.*g
(#40105).
REPL
- When stack traces are printed, the printed depth of types in function signatures will be limited to avoid overly verbose output (#49795).
Test
- The
@test_broken
macro (or@test
withbroken=true
) now complains if the test expression returns a non-boolean value in the same way as a non-broken test (#47804). - When a call to
@test
fails or errors inside a function, a larger stacktrace is now printed such that the location of the test within a@testset
can be retrieved (#49451).
InteractiveUtils
code_native
and@code_native
now default to intel syntax instead of AT&T.@time_imports
now shows the timing of any module__init__()
s that are run (#49529).
Deprecated or removed
- The
@pure
macro is now deprecated. UseBase.@assume_effects :foldable
instead (#48682).