Julia v1.11 Release Notes
New language features
- Nouveau type
Memoryqui fournit un conteneur de niveau inférieur comme alternative àArray.Memorya 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 typeArrayest 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). 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).ScopedValueimplémente un scope dynamique avec héritage à travers les tâches (#50958).- Les fichiers
Manifest.tomlpeuvent désormais être renommés au formatManifest-v{major}.{minor}.tomlpour être préférentiellement utilisés par la version julia donnée. Par exemple, dans le même dossier, unManifest-v1.11.tomlserait utilisé par v1.11 etManifest.tomlpar 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
atexits'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 desTimers 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_PATHentraî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_extensionpendant 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_effectson 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 quejuliaest invoqué pour exécuter un script ou une expression (c'est-à-dire en utilisantjulia script.jloujulia -e expr),juliaexé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.mainpeut 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 fonctionmainet l'exécution du code directement à la fin du script (#50974). - Les options
--compiled-moduleset--pkgimagespeuvent 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
--projectaccepte désormais@scriptpour donner un chemin vers un répertoire avec un Project.toml relatif au fichier de script passé.--project=@script/foopour 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.@threadsprend 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
Makefilepour 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.AnnotatedStringest 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 standardStyledStringspour contenir des informations de style.AnnotatedCharest un nouveau typeAbstractChar. Il enveloppe un autre char et contient une liste d'annotations qui s'appliquent à celui-ci.AnnotatedIOBufferest un nouveau typeIOqui imite unIOBuffer, mais possède des méthodesread/writespé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 sixest danss, et inséreraxdansssi ce n'est pas le cas (#45156, #51636).- La nouvelle fonction
Libc.mkfifoenveloppe la fonction Cmkfifosur 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).IdSetest maintenant exporté de Base et considéré comme public (#53262).@timerapporte maintenant un compte de tous les conflits de verrouillage où unReentrantLocka dû attendre, plus une nouvelle macro@lock_conflictsqui renvoie ce compte (#52883).- Le nouveau macro
Base.Cartesian.@ncallkwest 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ùTest un type entier natif calcule maintenant l'inverse modulaire dendans 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 argumentIOoptionnel 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 argumentshrinkoptionnel pour désactiver le rétrécissement (#51929).- Passer un
IOBuffercomme argument stdout pour le spawn deProcessfonctionne désormais comme prévu, synchronisé avecwaitousuccess, donc unBase.BufferStreamn'est plus requis là pour garantir l'exactitude afin d'éviter les courses de données (#52461). - Après qu'un processus se termine,
closewritene sera plus appelé automatiquement sur le flux qui lui a été passé. Appelezwaitsur le processus à la place pour vous assurer que le contenu est entièrement écrit, puis appelezclosewritemanuellement pour éviter les courses de données, ou utilisez la forme de rappel deopenpour que tout cela soit géré automatiquement (#52461). @timedrenvoie désormais également le temps de compilation et de recompilation écoulé (#52889).filterpeut maintenant agir sur unNamedTuple(#50795).Iterators.cycle(iter, n)parcourtiterun 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 demtimeau 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écursivementwritesur 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
lengthpour les itérateurs avec état de manière généralement cohérente. Le potentiel de résultats incorrects silencieux pour les itérateursStatefulest abordé en supprimant la méthodelength(::Stateful). Le dernier paramètre de type deStatefula é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]pourjuliaet 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> addetPkg.addajouteront désormais des entrées de compatibilité pour les nouvelles dépendances directes si l'environnement actif est un package (a une entréenameetuuid).- 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 FooouPkg.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
Facessert 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.tomlde l'utilisateur etloadfaces!) pour le contenu stylisé (#49586). - Le nouveau macro de chaîne
@styled_strfournit un moyen pratique de créer unAnnotatedStringavec diverses faces ou autres attributs appliqués (#49586).
Libdl
- Un nouveau type
LazyLibraryest exporté depuisLibdlpour ê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) deAetB. Remarque : Le deuxième argument est la sortie debunchkaufmanoulu(#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). bunchkaufmanetbunchkaufman!fonctionnent désormais pour toutAbstractFloat,Rationalet leurs variantes complexes.bunchkaufmanprend désormais en charge les typesInteger, en effectuant une conversion interne enRational{BigInt}. Une nouvelle fonctioninertiaa été ajoutée, qui calcule l'inertie du facteur diagonal donné par l'objet de factorisationBunchKaufmand'une matrice réelle symétrique ou hermitienne. Pour les matrices symétriques complexes,inertiane 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 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). luetissuccess(::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
randprend désormais en charge l'échantillonnage sur les typesTuple(#35856, #50251).randprend 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
Randompeuvent 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 = falsede 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
pmaputilise désormais par défaut unCachingPool(#33892).
Deprecated or removed
Base.map,Iterators.mapetforeachont 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).
tputn'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 lorsqueterminfon'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).