Julia v1.11 Release Notes
New language features
- New
Memory
type that provides a lower-level container as an alternative toArray
.Memory
has less overhead and a faster constructor, making it a good choice for situations that do not need all the features ofArray
(e.g. multiple dimensions). Most of theArray
type is now implemented in Julia on top ofMemory
, leading to significant speedups for several functions (e.g.push!
) as well as more maintainable code (#51319). public
is a new keyword. Symbols marked withpublic
are considered public API. Symbols marked withexport
are now also treated as public API. The difference betweenpublic
andexport
is thatpublic
names do not become available whenusing
a package/module (#50105).ScopedValue
implementa el alcance dinámico con herencia a través de tareas (#50958).- Los archivos
Manifest.toml
ahora se pueden renombrar en el formatoManifest-v{mayor}.{menor}.toml
para ser preferentemente utilizados por la versión de julia dada. Es decir, en la misma carpeta, unManifest-v1.11.toml
sería utilizado por v1.11 yManifest.toml
por cualquier otra versión de julia. Esto facilita la gestión de entornos para múltiples versiones de julia al mismo tiempo (#43845). - Soporte para Unicode 15.1 (#51799).
Language changes
- Durante la precompilación, los ganchos
atexit
ahora se ejecutan antes de guardar el archivo de salida. Esto permite a los usuarios desmantelar de manera segura el estado en segundo plano (como cerrarTimer
s y enviar notificaciones de desconexión a tareas de latido) y limpiar otros recursos cuando el programa desea comenzar a salir. - La cobertura de código y el seguimiento de malloc ya no se generan durante la etapa de precompilación del paquete. Además, durante estos modos, ahora se utilizan cachés de pkgimage para paquetes que no están siendo rastreados. Esto significa que las pruebas de cobertura (el valor predeterminado para
julia-actions/julia-runtest
) utilizarán por defecto cachés de pkgimage para todos los demás paquetes que no sean el paquete que se está probando, lo que probablemente significa una ejecución de pruebas más rápida (#52123). - Especificar una ruta en
JULIA_DEPOT_PATH
ahora resulta en la expansión de cadenas vacías para omitir el depósito de usuario predeterminado (#51448). - Los archivos de caché de precompilación ahora son reubicables y su validez se verifica a través de un hash de contenido de sus archivos fuente en lugar de su
mtime
(#49866). - Las extensiones ahora pueden depender de otras extensiones, si sus activadores incluyen todos los activadores de cualquier extensión de la que deseen depender (+ al menos un activador adicional). Las dependencias de ext-a-ext que no cumplan con este requisito ahora están bloqueadas para usar
Base.get_extension
durante la precompilación, para prevenir ciclos de extensión #55557.
Compiler/Runtime improvements
- Actualizadas las heurísticas de GC para contar las páginas asignadas en lugar de objetos individuales (#50144).
- Se agregó soporte para anotar
Base.@assume_effects
en bloques de código (#52400).
Command-line option changes
- El punto de entrada para Julia se ha estandarizado a
Main.main(args)
. Esto debe ser explícitamente optado utilizando el macro@main
(ver la documentación para más detalles). Cuando se opta, yjulia
se invoca para ejecutar un script o expresión (es decir, usandojulia script.jl
ojulia -e expr
),julia
ejecutará automáticamente la funciónMain.main
. Esto está destinado a unificar los flujos de trabajo de scripts y compilación, donde la carga de código puede ocurrir en el compilador y la ejecución deMain.main
puede ocurrir en el ejecutable resultante. Para uso interactivo, no hay diferencia semántica entre definir una funciónmain
y ejecutar el código directamente al final del script (#50974). - Las opciones
--compiled-modules
y--pkgimages
ahora se pueden establecer enexisting
, lo que hará que Julia considere cargar archivos de caché existentes, pero no crear nuevos (#50586, #52573). - El argumento
--project
ahora acepta@script
para dar una ruta a un directorio con un Project.toml relativo al archivo de script pasado.--project=@script/foo
para el subdirectoriofoo
. Si no se da ninguna ruta después (es decir,--project=@script
), entonces (como--project=@.
) se busca en el directorio y sus padres un Project.toml (#50864 y #53352)
Multi-threading changes
Threads.@threads
ahora soporta el programador:greedy
, destinado a cargas de trabajo no uniformes (#52096).- A new public (but unexported) struct
Base.Lockable{T, L<:AbstractLock}
makes it easy to bundle a resource and its lock together (#52898).
Build system changes
- Hay un nuevo
Makefile
para construir Julia y LLVM utilizando las estrategias de optimización guiada por perfil y optimizaciones en tiempo de enlace (PGO y LTO), consultacontrib/pgo-lto/Makefile
(#45641).
New library functions
Tres nuevos tipos en torno a la idea de texto con "anotaciones" (
Pair{Symbol, Any}
entradas, por ejemplo,:lang => "en"
o:face => :magenta
). Estas anotaciones se conservan a través de las operaciones (por ejemplo, la concatenación de cadenas con*
) cuando es posible.AnnotatedString
es un nuevo tipo deAbstractString
. Envuelve una cadena subyacente y permite que se adjunten anotaciones a regiones de la cadena. Este tipo se utiliza extensamente en la nueva biblioteca estándarStyledStrings
para contener información de estilo.AnnotatedChar
es un nuevo tipo deAbstractChar
. Envuelve otro char y mantiene una lista de anotaciones que se aplican a él.AnnotatedIOBuffer
es un nuevo tipo deIO
que imita unIOBuffer
, pero tiene métodosread
/write
especializados para contenido anotado. Esto se puede pensar tanto como un "constructor de cadenas" de cierta manera, como también un pegamento entre contenido anotado y no anotado.
in!(x, s::AbstractSet)
devolverá six
está ens
, e insertaráx
ens
si no está (#45156, #51636).La nueva función
Libc.mkfifo
envuelve la funciónmkfifo
de C en plataformas Unix (#34587).logrange(inicio, parada; longitud)
crea un rango de razón constante, en lugar de paso constante (#39071)copyuntil(out, io, delim)
ycopyline(out, io)
copian datos en un flujoout::IO
(#48273).eachrsplit(string, pattern)
itera sobre las subcadenas divididas de derecha a izquierda (#51646).Sys.username()
se puede usar para devolver el nombre de usuario del usuario actual (#51897).Sys.isreadable(), Sys.iswritable()
se pueden usar para verificar si el usuario actual tiene permisos de acceso que permiten leer y escribir, respectivamente. (#53320).GC.logging_enabled()
se puede usar para probar si el registro de GC ha sido habilitado a través deGC.enable_logging
(#51647).IdSet
ahora se exporta desde Base y se considera público (#53262).@time
ahora informa un conteo de cualquier conflicto de bloqueo donde unReentrantLock
tuvo que esperar, además de un nuevo macro@lock_conflicts
que devuelve ese conteo (#52883).El nuevo macro
Base.Cartesian.@ncallkw
es análogo aBase.Cartesian.@ncall
, pero permite agregar argumentos de palabra clave a la llamada de función (#51501).Nueva función
Docs.hasdoc(module, symbol)
indica si un nombre tiene una cadena de documentación (#52139).Nueva función
Docs.undocumented_names(module)
devuelve los nombres públicos no documentados de un módulo (#52413).
New library features
invmod(n, T)
dondeT
es un tipo de entero nativo ahora calcula el inverso modular den
en el anillo de enteros modulares que defineT
(#52180).invmod(n)
es una abreviatura deinvmod(n, typeof(n))
para tipos de enteros nativos (#52180).replace(string, pattern...)
ahora admite un argumentoIO
opcional para escribir la salida en un flujo en lugar de devolver una cadena (#48625).- Nuevos métodos
allequal(f, itr)
yallunique(f, itr)
que toman una función de predicado (#47679). sizehint!(s, n)
ahora admite un argumento opcionalshrink
para deshabilitar la reducción (#51929).- Pasar un
IOBuffer
como argumento stdout paraProcess
spawn ahora funciona como se esperaba, sincronizado conwait
osuccess
, por lo que ya no se requiere unBase.BufferStream
allí para la corrección y evitar condiciones de carrera (#52461). - Después de que un proceso sale,
closewrite
ya no se llamará automáticamente en el flujo que se le pasó. Llama await
en el proceso en su lugar para asegurarte de que el contenido esté completamente escrito, luego llama aclosewrite
manualmente para evitar condiciones de carrera, o usa la forma de callback deopen
para que todo eso se maneje automáticamente (#52461). @timed
ahora devuelve además el tiempo de compilación y recompilación transcurrido (#52889).filter
ahora puede actuar sobre unNamedTuple
(#50795).Iterators.cycle(iter, n)
recorreiter
un número fijo de veces, en lugar de para siempre (#47354).zero(::AbstractArray)
ahora se aplica recursivamente, por lo quezero([[1,2],[3,4,5]])
ahora produce la identidad aditiva[[0,0],[0,0,0]]
en lugar de generar un error (#38064).include_dependency(path; track_content=true)
permite cambiar de usarmtime
a hashing de la dependencia de precompilación para restaurar la relocatibilidad de las cachés de precompilación (#51798).
Standard library changes
- El método de respaldo
write(::IO, ::AbstractArray)
que solía llamar recursivamente awrite
en cada elemento, ahora escribe la representación en memoria de cada valor. Por ejemplo,write(io, 'a':'b')
ahora escribe 4 bytes para cada carácter, en lugar de escribir la representación UTF-8 de cada carácter. El nuevo formato es compatible con el utilizado porArray
, lo que hace posible usarread!
para recuperar los datos (#42593). - No es posible definir
length
para iteradores con estado de manera generalmente consistente. El potencial de resultados incorrectos de manera silenciosa para los iteradoresStateful
se aborda eliminando el métodolength(::Stateful)
. El último parámetro de tipo deStateful
también ha desaparecido. Problema: (#47790), PR: (#51747).
Package Manager
- Ahora es posible especificar "fuentes" para paquetes en una sección
[sources]
en Project.toml. Esto se puede utilizar para agregar dependencias normales o de prueba no registradas. - Pkg ahora obedece los límites de
[compat]
parajulia
y genera un error si la versión del binario de Julia en ejecución es incompatible con los límites enProject.toml
. Pkg siempre ha obedecido esta compatibilidad al trabajar con paquetes de Registro. Este cambio afecta principalmente a los paquetes locales. pkg> add
yPkg.add
ahora agregarán entradas de compatibilidad para nuevas dependencias directas si el entorno activo es un paquete (tiene una entradaname
yuuid
).- Las dependencias ahora se pueden agregar directamente como dependencias débiles o extras a través de las formas
pkg> add --weak/extra Foo
oPkg.add("Foo", target=:weakdeps/:extras)
.
StyledStrings
- Una nueva biblioteca estándar para manejar el estilo de una manera más completa y estructurada (#49586).
- La nueva estructura
Faces
sirve como un contenedor para la información de estilo de texto (piensa en la tipografía, así como en el color y la decoración), y viene con un marco para proporcionar un enfoque conveniente, extensible (a través deaddface!
) y personalizable (con elFaces.toml
de un usuario yloadfaces!
) para contenido estilizado (#49586). - El nuevo macro de cadena
@styled_str
proporciona una forma conveniente de crear unAnnotatedString
con varias caras u otros atributos aplicados (#49586).
Libdl
- Un nuevo tipo
LazyLibrary
se exporta deLibdl
para su uso en la construcción de cargas de bibliotecas perezosas encadenadas, principalmente para ser utilizado dentro de JLLs (#50074).
LinearAlgebra
cbrt(::AbstractMatrix{<:Real})
ahora está definido y devuelve raíces cúbicas de matrices de valores reales de matrices de valores reales. (#50661)eigvals/eigen(A, bunchkaufman(B))
yeigvals/eigen(A, lu(B))
, que utilizan la descomposición Bunchkaufman (LDL) y LU deB
, respectivamente, ahora calculan de manera eficiente los valores propios generalizados (eigen
: y vectores propios) deA
yB
. Nota: El segundo argumento es la salida debunchkaufman
olu
(#50471).- Ahora hay un despacho especializado para
eigvals/eigen(::Hermitian{<:Tridiagonal})
que realiza una transformación de similitud para crear una matriz tridiagonal simétrica real y resolverla utilizando las rutinas LAPACK (#49546). - Las matrices estructuradas ahora retienen ya sea los ejes del padre (para
Simétrica
/Hermítica
/AbstractTriangular
/UpperHessenberg
), o los de la diagonal principal (para matrices en banda) (#52480). bunchkaufman
ybunchkaufman!
ahora funcionan para cualquierAbstractFloat
,Rational
y sus variantes complejas.bunchkaufman
ahora admite tiposInteger
, al realizar una conversión interna aRational{BigInt}
. Se agregó una nueva funcióninertia
que calcula la inercia del factor diagonal dado por el objeto de factorizaciónBunchKaufman
de una matriz simétrica real o hermítica. Para matrices simétricas complejas,inertia
solo calcula el número de valores propios cero del factor diagonal (#51487).- Packages that specialize matrix-matrix
mul!
with a method signature of the formmul!(::AbstractMatrix, ::MyMatrix, ::AbstractMatrix, ::Number, ::Number)
no longer encounter method ambiguities when interacting withLinearAlgebra
. Previously, ambiguities used to arise when multiplying aMyMatrix
with a structured matrix type provided by LinearAlgebra, such asAbstractTriangular
, which used to necessitate additional methods to resolve such ambiguities. Similar sources of ambiguities have also been removed for matrix-vectormul!
operations (#52837). lu
eissuccess(::LU)
ahora aceptan un argumento claveallowsingular
. Cuando se establece entrue
, una factorización válida con un factor U de rango deficiente se tratará como un éxito en lugar de lanzar un error. Tales factorizaciones ahora se muestran imprimiendo los factores junto con una nota de "rango deficiente" en lugar de imprimir un mensaje de "Factorización fallida" (#52957).
Random
rand
ahora admite muestreo sobre tiposTuple
(#35856, #50251).rand
ahora admite muestreo sobre tiposPair
(#28705).- Al sembrar generadores de números aleatorios (RNG) proporcionados por
Random
, ahora se pueden usar semillas de enteros negativos (#51416). - Los generadores de números aleatorios con semilla de
Random
ahora pueden ser sembrados con una cadena, por ejemplo,seed!(rng, "una semilla aleatoria")
(#51527).
REPL
Las pistas de autocompletado ahora se muestran en texto más claro mientras se escribe en el repl. Para desactivar, establece
Base.active_repl.options.hint_tab_completes = false
de forma interactiva, o en startup.jl:if VERSION >= v"1.11.0-0" atreplinit() do repl repl.options.hint_tab_completes = false end end
(#51229).
Meta-M con un aviso vacío ahora alterna el módulo contextual entre el módulo contextual anterior no-Main y Main, de modo que cambiar de un lado a otro sea simple (#51616, #52670).
Dates
La función no documentada adjust
ya no se exporta, pero ahora está documentada (#53092).
Statistics
- Las estadísticas son ahora una biblioteca estándar actualizable (#46501).
Distributed
pmap
ahora utiliza por defecto unCachingPool
(#33892).
Deprecated or removed
Base.map
,Iterators.map
yforeach
perdieron sus métodos de un solo argumento (#52631).
External dependencies
- La biblioteca libuv se ha actualizado de una base de v1.44.2 a v1.48.0 (#49937).
tput
ya no se llama para verificar las capacidades del terminal; ha sido reemplazado por un analizador de terminfo en puro Julia (#50797).- La base de datos de información del terminal,
terminfo
, ahora se incluye por defecto, proporcionando una mejor experiencia de usuario en el REPL cuandoterminfo
no está disponible en el sistema. Julia se puede compilar sin incluir la base de datos utilizando la opción del MakefileWITH_TERMINFO=0
. (#55411)
Tooling Improvements
- CI now performs limited automatic typo detection on all PRs. If you merge a PR with a failing typo CI check, then the reported typos will be automatically ignored in future CI runs on PRs that edit those same files (#51704).