Julia v1.11 Release Notes
New language features
- Nouveau type
Memory
qui fournit un conteneur de niveau inférieur comme alternative àArray
.Memory
a moins de surcharge et un constructeur plus rapide, ce qui en fait un bon choix pour les situations qui n'ont pas besoin de toutes les fonctionnalités deArray
(par exemple, plusieurs dimensions). La plupart du typeArray
est maintenant implémentée en Julia sur la base deMemory
, ce qui entraîne des gains de vitesse significatifs pour plusieurs fonctions (par exemple,push!
) ainsi qu'un code plus maintenable (#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
implémente un scope dynamique avec héritage à travers les tâches (#50958).- Les fichiers
Manifest.toml
peuvent désormais être renommés au formatManifest-v{major}.{minor}.toml
pour être préférentiellement utilisés par la version julia donnée. Par exemple, dans le même dossier, unManifest-v1.11.toml
serait utilisé par v1.11 etManifest.toml
par toutes les autres versions de julia. Cela facilite la gestion des environnements pour plusieurs versions de julia en même temps (#43845). - Support pour Unicode 15.1 (#51799).
Language changes
- Lors de la précompilation, les hooks
atexit
s'exécutent maintenant avant d'enregistrer le fichier de sortie. Cela permet aux utilisateurs de détruire en toute sécurité l'état en arrière-plan (comme la fermeture desTimer
s et l'envoi de notifications de déconnexion aux tâches de heartbeat) et de nettoyer d'autres ressources lorsque le programme souhaite commencer à quitter. - La couverture de code et le suivi de malloc ne sont plus générés pendant la phase de précompilation du package. De plus, pendant ces modes, des caches pkgimage sont désormais utilisés pour les packages qui ne sont pas suivis. Cela signifie que les tests de couverture (le paramètre par défaut pour
julia-actions/julia-runtest
) utiliseront par défaut des caches pkgimage pour tous les autres packages que le package testé, ce qui signifie probablement une exécution des tests plus rapide (#52123). - Spécifier un chemin dans
JULIA_DEPOT_PATH
entraîne désormais l'expansion des chaînes vides pour omettre le dépôt utilisateur par défaut (#51448). - Les fichiers de cache de précompilation sont désormais déplaçables et leur validité est maintenant vérifiée par un hachage de contenu de leurs fichiers sources au lieu de leur
mtime
(#49866). - Les extensions peuvent désormais dépendre d'autres extensions, si leurs déclencheurs incluent tous les déclencheurs de toute extension dont elles souhaitent dépendre (+ au moins un autre déclencheur). Les dépendances d'extension à extension qui ne répondent pas à cette exigence sont désormais bloquées de l'utilisation de
Base.get_extension
pendant la pré-compilation, afin de prévenir les cycles d'extension #55557.
Compiler/Runtime improvements
- Mise à jour des heuristiques GC pour compter les pages allouées au lieu des objets individuels (#50144).
- Added support for annotating
Base.@assume_effects
on code blocks (#52400).
Command-line option changes
- Le point d'entrée pour Julia a été standardisé en
Main.main(args)
. Cela doit être explicitement choisi en utilisant le macro@main
(voir la docstring pour plus de détails). Lorsqu'il est choisi, et quejulia
est invoqué pour exécuter un script ou une expression (c'est-à-dire en utilisantjulia script.jl
oujulia -e expr
),julia
exécutera ensuite automatiquement la fonctionMain.main
. Cela vise à unifier les flux de travail de script et de compilation, où le chargement de code peut se produire dans le compilateur et l'exécution deMain.main
peut se produire dans l'exécutable résultant. Pour une utilisation interactive, il n'y a pas de différence sémantique entre la définition d'une fonctionmain
et l'exécution du code directement à la fin du script (#50974). - Les options
--compiled-modules
et--pkgimages
peuvent désormais être définies surexisting
, ce qui amènera Julia à envisager le chargement de fichiers de cache existants, mais pas à en créer de nouveaux (#50586, #52573). - L'argument
--project
accepte désormais@script
pour donner un chemin vers un répertoire avec un Project.toml relatif au fichier de script passé.--project=@script/foo
pour le sous-répertoirefoo
. Si aucun chemin n'est donné après (c'est-à-dire--project=@script
), alors (comme--project=@.
) le répertoire et ses parents sont recherchés pour un Project.toml (#50864 et #53352)
Multi-threading changes
Threads.@threads
prend désormais en charge le planificateur:greedy
, destiné aux charges de travail non uniformes (#52096).- Une nouvelle structure publique (mais non exportée)
Base.Lockable{T, L<:AbstractLock}
facilite le regroupement d'une ressource et de son verrou ensemble (#52898).
Build system changes
- Il y a un nouveau
Makefile
pour construire Julia et LLVM en utilisant les stratégies d'optimisations guidées par le profil et d'optimisations au moment de la liaison (PGO et LTO), voircontrib/pgo-lto/Makefile
(#45641).
New library functions
- Trois nouveaux types autour de l'idée de texte avec des "annotations" (
Pair{Symbol, Any}
entrées, par exemple:lang => "en"
ou:face => :magenta
). Ces annotations sont préservées à travers les opérations (par exemple, la concaténation de chaînes avec*
) lorsque cela est possible.AnnotatedString
est un nouveau typeAbstractString
. Il enveloppe une chaîne sous-jacente et permet d'attacher des annotations à des régions de la chaîne. Ce type est utilisé de manière extensive dans la nouvelle bibliothèque standardStyledStrings
pour contenir des informations de style.AnnotatedChar
est un nouveau typeAbstractChar
. Il enveloppe un autre char et contient une liste d'annotations qui s'appliquent à celui-ci.AnnotatedIOBuffer
est un nouveau typeIO
qui imite unIOBuffer
, mais possède des méthodesread
/write
spécialisées pour le contenu annoté. Cela peut être considéré à la fois comme une sorte de "constructeur de chaînes" et aussi comme un lien entre le contenu annoté et non annoté.
in!(x, s::AbstractSet)
renverra six
est danss
, et insérerax
danss
si ce n'est pas le cas (#45156, #51636).- La nouvelle fonction
Libc.mkfifo
enveloppe la fonction Cmkfifo
sur les plateformes Unix (#34587). logrange(start, stop; length)
makes a range of constant ratio, instead of constant step (#39071)copyuntil(out, io, delim)
etcopyline(out, io)
copient des données dans un fluxout::IO
(#48273).eachrsplit(string, pattern)
itère sur les sous-chaînes séparées de droite à gauche (#51646).Sys.username()
peut être utilisé pour renvoyer le nom d'utilisateur actuel (#51897).Sys.isreadable(), Sys.iswritable()
peuvent être utilisés pour vérifier si l'utilisateur actuel a des permissions d'accès qui permettent la lecture et l'écriture, respectivement. (#53320).GC.logging_enabled()
peut être utilisé pour tester si la journalisation GC a été activée viaGC.enable_logging
(#51647).IdSet
est maintenant exporté de Base et considéré comme public (#53262).@time
rapporte maintenant un compte de tous les conflits de verrouillage où unReentrantLock
a dû attendre, plus une nouvelle macro@lock_conflicts
qui renvoie ce compte (#52883).- Le nouveau macro
Base.Cartesian.@ncallkw
est analogue àBase.Cartesian.@ncall
, mais permet d'ajouter des arguments de mot-clé à l'appel de fonction (#51501). - Nouvelle fonction
Docs.hasdoc(module, symbol)
indique si un nom a une docstring (#52139). - Nouvelle fonction
Docs.undocumented_names(module)
renvoie les noms publics non documentés d'un module (#52413).
New library features
invmod(n, T)
oùT
est un type entier natif calcule maintenant l'inverse modulaire den
dans l'anneau d'entiers modulaires que définitT
(#52180).invmod(n)
est une abréviation pourinvmod(n, typeof(n))
pour les types d'entiers natifs (#52180).replace(string, pattern...)
prend désormais en charge un argumentIO
optionnel pour écrire la sortie dans un flux plutôt que de renvoyer une chaîne (#48625).- Nouvelles méthodes
allequal(f, itr)
etallunique(f, itr)
prenant une fonction prédicat (#47679). sizehint!(s, n)
prend maintenant en charge un argumentshrink
optionnel pour désactiver le rétrécissement (#51929).- Passer un
IOBuffer
comme argument stdout pour le spawn deProcess
fonctionne désormais comme prévu, synchronisé avecwait
ousuccess
, donc unBase.BufferStream
n'est plus requis là pour garantir l'exactitude afin d'éviter les courses de données (#52461). - Après qu'un processus se termine,
closewrite
ne sera plus appelé automatiquement sur le flux qui lui a été passé. Appelezwait
sur le processus à la place pour vous assurer que le contenu est entièrement écrit, puis appelezclosewrite
manuellement pour éviter les courses de données, ou utilisez la forme de rappel deopen
pour que tout cela soit géré automatiquement (#52461). @timed
renvoie désormais également le temps de compilation et de recompilation écoulé (#52889).filter
peut maintenant agir sur unNamedTuple
(#50795).Iterators.cycle(iter, n)
parcourtiter
un nombre fixe de fois, au lieu de le faire indéfiniment (#47354).zero(::AbstractArray)
s'applique maintenant de manière récursive, donczero([[1,2],[3,4,5]])
produit maintenant l'identité additive[[0,0],[0,0,0]]
au lieu de générer une erreur (#38064).include_dependency(path; track_content=true)
permet de passer de l'utilisation demtime
au hachage de la dépendance de précompilation afin de restaurer la relocatabilité des caches de précompilation (#51798).
Standard library changes
- La méthode de secours
write(::IO, ::AbstractArray)
qui appelait récursivementwrite
sur chaque élément, écrit maintenant la représentation en mémoire de chaque valeur. Par exemple,write(io, 'a':'b')
écrit maintenant 4 octets pour chaque caractère, au lieu d'écrire la représentation UTF-8 de chaque caractère. Le nouveau format est compatible avec celui utilisé parArray
, ce qui permet d'utiliserread!
pour récupérer les données (#42593). - Il n'est pas possible de définir
length
pour les itérateurs avec état de manière généralement cohérente. Le potentiel de résultats incorrects silencieux pour les itérateursStateful
est abordé en supprimant la méthodelength(::Stateful)
. Le dernier paramètre de type deStateful
a également disparu. Problème : (#47790), PR : (#51747).
Package Manager
- Il est désormais possible de spécifier des "sources" pour les paquets dans une section
[sources]
dans Project.toml. Cela peut être utilisé pour ajouter des dépendances normales ou de test non enregistrées. - Pkg respecte désormais les limites
[compat]
pourjulia
et génère une erreur si la version du binaire Julia en cours d'exécution est incompatible avec les limites dansProject.toml
. Pkg a toujours respecté cette compatibilité lors du travail avec des packages de registre. Ce changement affecte principalement les packages locaux. pkg> add
etPkg.add
ajouteront désormais des entrées de compatibilité pour les nouvelles dépendances directes si l'environnement actif est un package (a une entréename
etuuid
).- Les dépendances peuvent désormais être ajoutées directement en tant que dépendances faibles ou extras via les formes
pkg> add --weak/extra Foo
ouPkg.add("Foo", target=:weakdeps/:extras)
.
StyledStrings
- Une nouvelle bibliothèque standard pour gérer le style de manière plus complète et structurée (#49586).
- La nouvelle structure
Faces
sert de conteneur pour les informations de style de texte (pensez à la police, ainsi qu'à la couleur et à la décoration), et est accompagnée d'un cadre pour fournir une approche pratique, extensible (viaaddface!
) et personnalisable (avec un fichierFaces.toml
de l'utilisateur etloadfaces!
) pour le contenu stylisé (#49586). - Le nouveau macro de chaîne
@styled_str
fournit un moyen pratique de créer unAnnotatedString
avec diverses faces ou autres attributs appliqués (#49586).
Libdl
- Un nouveau type
LazyLibrary
est exporté depuisLibdl
pour être utilisé dans la construction de chargements de bibliothèques paresseux en chaîne, principalement destiné à être utilisé dans les JLL (#50074).
LinearAlgebra
cbrt(::AbstractMatrix{<:Real})
est maintenant défini et renvoie des racines cubiques de matrices à valeurs réelles de matrices à valeurs réelles. (#50661)eigvals/eigen(A, bunchkaufman(B))
eteigvals/eigen(A, lu(B))
, qui utilisent respectivement la décomposition Bunchkaufman (LDL) et LU deB
, calculent maintenant efficacement les valeurs propres généralisées (eigen
: et vecteurs propres) deA
etB
. Remarque : Le deuxième argument est la sortie debunchkaufman
oulu
(#50471).- Il existe maintenant un dispatch spécialisé pour
eigvals/eigen(::Hermitian{<:Tridiagonal})
qui effectue une transformation de similarité pour créer une matrice tridiagonale symétrique réelle, et la résout en utilisant les routines LAPACK (#49546). - Les matrices structurées conservent maintenant soit les axes du parent (pour
Symmetric
/Hermitian
/AbstractTriangular
/UpperHessenberg
), soit ceux de la diagonale principale (pour les matrices bandées) (#52480). bunchkaufman
etbunchkaufman!
fonctionnent désormais pour toutAbstractFloat
,Rational
et leurs variantes complexes.bunchkaufman
prend désormais en charge les typesInteger
, en effectuant une conversion interne enRational{BigInt}
. Une nouvelle fonctioninertia
a été ajoutée, qui calcule l'inertie du facteur diagonal donné par l'objet de factorisationBunchKaufman
d'une matrice réelle symétrique ou hermitienne. Pour les matrices symétriques complexes,inertia
ne calcule que le nombre de valeurs propres nulles du facteur 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
etissuccess(::LU)
acceptent maintenant un argument cléallowsingular
. Lorsqu'il est défini surtrue
, une factorisation valide avec un facteur U de rang déficient sera considérée comme un succès au lieu de générer une erreur. De telles factorizations sont désormais affichées en imprimant les facteurs accompagnés d'une note "rang déficient" au lieu d'imprimer un message "Échec de la factorisation" (#52957).
Random
rand
prend désormais en charge l'échantillonnage sur les typesTuple
(#35856, #50251).rand
prend désormais en charge l'échantillonnage sur les typesPair
(#28705).- Lors de l'initialisation des RNG fournis par
Random
, des graines entières négatives peuvent désormais être utilisées (#51416). - Les générateurs de nombres aléatoires semables de
Random
peuvent désormais être initialisés par une chaîne, par exempleseed!(rng, "a random seed")
(#51527).
REPL
- Les indices de complétion par tabulation s'affichent maintenant en texte plus clair lors de la saisie dans le REPL. Pour désactiver, définissez
Base.active_repl.options.hint_tab_completes = false
de manière interactive, ou dans startup.jl :
(#51229).if VERSION >= v"1.11.0-0" atreplinit() do repl repl.options.hint_tab_completes = false end end
- Meta-M avec un prompt vide bascule maintenant le module contextuel entre le précédent module contextuel non-Main et le Main, de sorte que le passage d'un à l'autre soit simple (#51616, #52670).
Dates
La fonction non documentée adjust
n'est plus exportée mais est maintenant documentée (#53092).
Statistics
- Les statistiques sont désormais une bibliothèque standard évolutive (#46501).
Distributed
pmap
utilise désormais par défaut unCachingPool
(#33892).
Deprecated or removed
Base.map
,Iterators.map
etforeach
ont perdu leurs méthodes à un seul argument (#52631).
External dependencies
- La bibliothèque libuv a été mise à jour d'une version de v1.44.2 à v1.48.0 (#49937).
tput
n'est plus appelé pour vérifier les capacités du terminal ; il a été remplacé par un analyseur terminfo pur-Julia (#50797).- La base de données d'informations sur le terminal,
terminfo
, est désormais intégrée par défaut, offrant une meilleure expérience utilisateur REPL lorsqueterminfo
n'est pas disponible sur le système. Julia peut être construite sans intégrer la base de données en utilisant l'option MakefileWITH_TERMINFO=0
. (#55411)
Tooling Improvements
- CI effectue désormais une détection automatique limitée des fautes de frappe sur toutes les PR. Si vous fusionnez une PR avec un échec de vérification de faute de frappe CI, les fautes de frappe signalées seront automatiquement ignorées lors des futures exécutions CI sur les PR qui modifient ces mêmes fichiers (#51704).