Julia v1.11 Release Notes
New language features
- New
Memorytype that provides a lower-level container as an alternative toArray.Memoryhas 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 theArraytype 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). publicis a new keyword. Symbols marked withpublicare considered public API. Symbols marked withexportare now also treated as public API. The difference betweenpublicandexportis thatpublicnames do not become available whenusinga package/module (#50105).ScopedValueimplementa el alcance dinámico con herencia a través de tareas (#50958).- Los archivos
Manifest.tomlahora se pueden renombrar en el formatoManifest-v{mayor}.{menor}.tomlpara ser preferentemente utilizados por la versión de julia dada. Es decir, en la misma carpeta, unManifest-v1.11.tomlsería utilizado por v1.11 yManifest.tomlpor 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
atexitahora se ejecutan antes de guardar el archivo de salida. Esto permite a los usuarios desmantelar de manera segura el estado en segundo plano (como cerrarTimers 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_PATHahora 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_extensiondurante 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_effectsen 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, yjuliase invoca para ejecutar un script o expresión (es decir, usandojulia script.jlojulia -e expr),juliaejecutará 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.mainpuede ocurrir en el ejecutable resultante. Para uso interactivo, no hay diferencia semántica entre definir una funciónmainy ejecutar el código directamente al final del script (#50974). - Las opciones
--compiled-modulesy--pkgimagesahora se pueden establecer enexisting, lo que hará que Julia considere cargar archivos de caché existentes, pero no crear nuevos (#50586, #52573). - El argumento
--projectahora acepta@scriptpara dar una ruta a un directorio con un Project.toml relativo al archivo de script pasado.--project=@script/foopara 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.@threadsahora 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
Makefilepara 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.AnnotatedStringes 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ándarStyledStringspara contener información de estilo.AnnotatedChares un nuevo tipo deAbstractChar. Envuelve otro char y mantiene una lista de anotaciones que se aplican a él.AnnotatedIOBufferes un nuevo tipo deIOque imita unIOBuffer, pero tiene métodosread/writeespecializados 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á sixestá ens, e insertaráxenssi no está (#45156, #51636).La nueva función
Libc.mkfifoenvuelve la funciónmkfifode 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).IdSetahora se exporta desde Base y se considera público (#53262).@timeahora informa un conteo de cualquier conflicto de bloqueo donde unReentrantLocktuvo que esperar, además de un nuevo macro@lock_conflictsque devuelve ese conteo (#52883).El nuevo macro
Base.Cartesian.@ncallkwes 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)dondeTes un tipo de entero nativo ahora calcula el inverso modular denen 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 argumentoIOopcional 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 opcionalshrinkpara deshabilitar la reducción (#51929).- Pasar un
IOBuffercomo argumento stdout paraProcessspawn ahora funciona como se esperaba, sincronizado conwaitosuccess, por lo que ya no se requiere unBase.BufferStreamallí para la corrección y evitar condiciones de carrera (#52461). - Después de que un proceso sale,
closewriteya no se llamará automáticamente en el flujo que se le pasó. Llama awaiten el proceso en su lugar para asegurarte de que el contenido esté completamente escrito, luego llama aclosewritemanualmente para evitar condiciones de carrera, o usa la forma de callback deopenpara que todo eso se maneje automáticamente (#52461). @timedahora devuelve además el tiempo de compilación y recompilación transcurrido (#52889).filterahora puede actuar sobre unNamedTuple(#50795).Iterators.cycle(iter, n)recorreiterun 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 usarmtimea 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 awriteen 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
lengthpara iteradores con estado de manera generalmente consistente. El potencial de resultados incorrectos de manera silenciosa para los iteradoresStatefulse aborda eliminando el métodolength(::Stateful). El último parámetro de tipo deStatefultambié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]parajuliay 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> addyPkg.addahora agregarán entradas de compatibilidad para nuevas dependencias directas si el entorno activo es un paquete (tiene una entradanameyuuid).- Las dependencias ahora se pueden agregar directamente como dependencias débiles o extras a través de las formas
pkg> add --weak/extra FoooPkg.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
Facessirve 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.tomlde un usuario yloadfaces!) para contenido estilizado (#49586). - El nuevo macro de cadena
@styled_strproporciona una forma conveniente de crear unAnnotatedStringcon varias caras u otros atributos aplicados (#49586).
Libdl
- Un nuevo tipo
LazyLibraryse exporta deLibdlpara 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) deAyB. Nota: El segundo argumento es la salida debunchkaufmanolu(#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). bunchkaufmanybunchkaufman!ahora funcionan para cualquierAbstractFloat,Rationaly sus variantes complejas.bunchkaufmanahora admite tiposInteger, al realizar una conversión interna aRational{BigInt}. Se agregó una nueva funcióninertiaque calcula la inercia del factor diagonal dado por el objeto de factorizaciónBunchKaufmande una matriz simétrica real o hermítica. Para matrices simétricas complejas,inertiasolo 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 aMyMatrixwith 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). lueissuccess(::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
randahora admite muestreo sobre tiposTuple(#35856, #50251).randahora 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
Randomahora 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 = falsede 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
pmapahora utiliza por defecto unCachingPool(#33892).
Deprecated or removed
Base.map,Iterators.mapyforeachperdieron 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).
tputya 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 cuandoterminfono 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).