Langage de programmation Julia 1.9 disponible

La version du langage de programmation Julia 1.9 a été publiée, combinant des qualités telles que la haute performance, la prise en charge du typage dynamique et des outils intégrés pour la programmation parallèle. La syntaxe de Julia est proche de MATLAB, avec quelques éléments empruntés à Ruby et Lisp. La méthode de manipulation de chaînes rappelle celle de Perl. Le code du projet est distribué sous la licence MIT.

Principales caractéristiques du langage :

  • Haute performance : l'un des objectifs clés du projet est d'atteindre des performances proches des programmes C. Le compilateur Julia est basé sur le projet LLVM et génère un code machine natif efficace pour de nombreuses plates-formes cibles.
  • Prise en charge de divers paradigmes de programmation, y compris des éléments de programmation orientée objet et fonctionnelle. La bibliothèque standard fournit des fonctions pour les E/S asynchrones, la gestion des processus, la journalisation, le profilage et la gestion des packages, entre autres ;
  • Typage dynamique : Le langage ne nécessite pas de définition explicite de types pour les variables, par analogie avec les langages de programmation de scripts. Prend en charge le mode interactif ;
  • Possibilité facultative de spécifier explicitement les types ;
  • Syntaxe excellente pour les calculs numériques, les calculs scientifiques, les systèmes d'apprentissage automatique et la visualisation de données. Prise en charge de nombreux types de données numériques et outils de parallélisation des calculs.
  • Possibilité d'appeler directement des fonctions à partir de bibliothèques C sans couches supplémentaires.

Changements majeurs dans Julia 1.9 :

  • Nouvelles fonctionnalités linguistiques
    • Autoriser les affectations dans un autre module en utilisant "setproperty!(::Module, ::Symbol, x)".
    • Les affectations multiples qui ne sont pas en position finale sont autorisées. Par exemple, la chaîne "a, b..., c = 1, 2, 3, 4" sera traitée comme "a = 1 ; b…, = 2, 3; c = 4". Ceci est géré via Base.split_rest.
    • Les littéraux à caractère unique prennent désormais en charge la même syntaxe que les littéraux de chaîne ; ceux. la syntaxe peut représenter des séquences UTF-8 non valides, comme le permet le type Char.
    • Ajout de la prise en charge de la spécification Unicode 15.
    • Les combinaisons imbriquées de tuples et de tuples nommés de caractères peuvent désormais être utilisées comme paramètres de type.
    • Nouvelles fonctions intégrées "getglobal(::Module, ::Symbol[, order])" et "setglobal!(::Module, ::Symbol, x[, order])" pour lire et écrire exclusivement dans des variables globales. La méthode getglobal doit maintenant être préférée à la méthode getfield pour accéder aux variables globales.
  • Changements de langue
    • La macro "@invoke" introduite dans la version 1.7 est maintenant exportée et disponible pour utilisation. De plus, il utilise désormais la méthode "Core.Typeof(x)" plutôt que "Any" lorsque l'annotation de type est omise pour l'argument "x". Cela est nécessaire pour que les types passés en arguments soient traités correctement.
    • Activation de l'export de la fonction "invokelatest" et de la macro "@invokelatest" introduite dans la version 1.7.
  • Améliorations du compilateur/d'exécution
    • Délai de première exécution considérablement réduit (TTFX - Délai de première exécution). La précompilation du package enregistre désormais le code natif dans "pkgimage", ce qui signifie que le code généré lors de la précompilation n'aura pas besoin d'être recompilé après le chargement du package. L'utilisation du mode pkgimages peut être désactivée avec l'option "--pkgimages=no".
    • Le problème connu de la complexité quadratique de l'inférence de type a été corrigé et, en général, l'inférence utilise moins de mémoire. Certains cas extrêmes avec des fonctions longues générées automatiquement (tels que ModelingToolkit.jl avec des équations aux dérivées partielles et de grands modèles de causalité) se compilent beaucoup plus rapidement.
    • Les appels avec des arguments non spécifiques au type peuvent désormais être optimisés pour l'injection ou la résolution statique, même s'il existe plusieurs types différents de candidats de répartition. Cela peut améliorer les performances dans certaines situations où les types d'objets ne sont pas entièrement résolus statiquement, en résolvant statiquement les sites d'appel "@nospecialize-d" et en évitant la recompilation.
    • Toutes les utilisations de la macro @pure dans le module Base ont été remplacées par Base.@assume_effects.
    • Les appels à invoke(f, invokesig, args...) avec des types moins spécifiques que ceux normalement utilisés pour f(args...) ne provoquent plus la recompilation du paquet.
  • Modifications des paramètres de la ligne de commande
    • Sous Linux et Windows, l'option "--threads=auto" tente désormais de déterminer le nombre de processeurs disponibles en fonction de l'affinité CPU, qui est un masque généralement défini dans les environnements HPC et cloud.
    • L'option "--math-mode=fast" a été désactivée, à la place de laquelle il est recommandé d'utiliser la macro "@fastmath", qui a une sémantique bien définie.
    • Le paramètre "--threads" a maintenant le format "auto | N[,auto|M]", où M spécifie le nombre de threads interactifs à créer (actuellement auto signifie 1).
    • Ajout de l'option "--heap-size-hint= ”, qui définit le seuil après lequel la récupération de place active commence. La taille peut être spécifiée en octets, kilo-octets (1000 Ko), mégaoctets (300 Mo) ou gigaoctets (1,5 Go).
  • Modifications du multithreading
    • "Threads.@spawn" a désormais un premier argument facultatif avec la valeur ":default" ou ":interactive". Une tâche interactive nécessite une faible latence de réponse et est conçue pour être courte ou exécutée fréquemment. Les tâches interactives s'exécuteront sur des threads interactifs si elles sont spécifiées lors du démarrage de Julia.
    • Les threads lancés en dehors de l'environnement d'exécution Julia (par exemple, à partir de C ou Java) peuvent désormais appeler le code Julia à l'aide de "jl_adopt_thread". Cela se produit automatiquement lorsque vous entrez le code Julia via "cfunction" ou le point d'entrée "@ccallable". Par conséquent, le nombre de threads peut désormais changer au moment de l'exécution.
  • Nouvelles fonctions de la bibliothèque
    • Nouvelle fonction "Iterators.flatmap".
    • Nouvelle fonction "pkgversion(m::Module)" pour obtenir la version du paquet qui a chargé un module donné, similaire à "pkgdir(m::Module)".
    • Nouvelle fonction "stack(x)" qui généralise "reduce(hcat, x::Vector{<:Vector})" à n'importe quelle dimension et autorise n'importe quel itérateur d'itérateurs. La méthode "stack(f, x)" généralise "mapreduce(f, hcat, x)" et est plus efficace.
    • Nouvelle macro pour analyser la mémoire allouée "@allocations", similaire à "@allocated", sauf qu'elle renvoie le nombre d'allocations de mémoire, pas la taille totale de la mémoire allouée.
  • Nouvelles fonctionnalités de la bibliothèque
    • "RoundFromZero" fonctionne désormais pour les types autres que "BigFloat".
    • "Dict" peut maintenant être réduit manuellement avec "sizehint!".
    • "@time" indique désormais séparément le pourcentage de temps passé à recompiler des méthodes invalides.
  • Changements dans la bibliothèque standard
    • Correction d'un problème de concurrence dans les méthodes d'itération pour Dict et d'autres objets dérivés tels que keys(::Dict), values(::Dict) et Set. Ces méthodes d'itération peuvent désormais être appelées sur un Dict ou un Set en parallèle sur un nombre illimité de threads, tant qu'aucune action ne modifie le dictionnaire ou le set.
    • La négation de la fonction de prédicat "!f" renvoie désormais une fonction composite "(!) ∘ f" au lieu d'une fonction anonyme.
    • Les fonctions de tranche de dimension fonctionnent désormais sur plusieurs dimensions : "eachslice", "eachrow" et "eachcol" renvoient un objet "Slices" qui permet à la répartition de fournir des méthodes plus efficaces.
    • Ajout de la macro "@kwdef" à l'API publique.
    • Correction d'un problème avec l'ordre des opérations dans "fld1".
    • Le tri est désormais toujours stable dans le temps (QuickSort repensé).
    • "Base.splat" est maintenant exporté. La valeur de retour est de type "Base.Splat" plutôt qu'une fonction anonyme, ce qui permet de bien la déduire.
  • Directeur chargé d'emballage
    • "Package Extensions": prise en charge du chargement d'un extrait de code à partir d'autres packages chargés dans une session Julia. L'application est similaire au package "Requires.jl", mais la pré-compilation et la compatibilité de configuration sont prises en charge.
  • Bibliothèque d'algèbre linéaire
    • En raison du risque de confusion avec la division élément par élément, les méthodes "a / b" et "b \ a" avec scalaire "a" et vecteur "b" ont été supprimées, qui étaient équivalentes à "a * pinv(b)".
    • Les appels BLAS et LAPACK utilisent maintenant "libblastrampoline (LBT)". OpenBLAS est fourni par défaut, mais la création d'une image système avec d'autres bibliothèques BLAS/LAPACK n'est pas prise en charge. Au lieu de cela, il est recommandé d'utiliser le mécanisme LBT pour remplacer BLAS/LAPACK par un autre ensemble de bibliothèques disponibles.
    • "lu" prend en charge la nouvelle stratégie de rotation de matrice "RowNonZero()", qui sélectionne le premier élément de rotation non nul à utiliser avec les nouveaux types arithmétiques et à des fins pédagogiques.
    • "normalize(x, p=2)" prend désormais en charge tout espace vectoriel normalisé "x", y compris les scalaires.
    • Le nombre par défaut de threads BLAS est désormais égal au nombre de threads CPU sur l'architecture ARM et à la moitié du nombre de threads CPU sur les autres architectures.
  • Printf : Messages d'erreur retravaillés pour les chaînes mal formées pour une meilleure lisibilité.
  • Profil : nouvelle fonction "Profile.take_heap_snapshot(file)" qui capture un fichier au format ".heapsnapshot" basé sur JSON pris en charge par Chrome.
  • Aléatoire : randn et randexp fonctionnent désormais pour tout type AbstractFloat qui définit rand.
  • REPL
    • Appuyer sur la combinaison de touches "Alt-e" ouvre maintenant l'entrée actuelle dans l'éditeur. Le contenu (s'il a été modifié) sera exécuté à la sortie de l'éditeur.
    • Le contexte de module actuel qui est actif dans le REPL peut être changé (par défaut c'est Main) en utilisant la fonction "REPL.activate(::Module)" ou en entrant le module dans le REPL et en appuyant sur la touche "Alt-m" combinaison.
    • Le mode "invite numérotée", qui imprime des numéros pour chaque entrée et sortie et stocke les résultats évalués dans Out, peut être activé avec "REPL.numbered_prompt!()".
    • La complétion de tabulation affiche les arguments de mots-clés disponibles.
  • SuiteSparse : Déplacement du code du solveur "SuiteSparse" vers "SparseArrays.jl". Les solveurs sont maintenant réexportés par "SuiteSparse.jl".
  • Tableaux clairsemés
    • Les solveurs SuiteSparse sont désormais disponibles en tant que sous-modules de SparseArrays.
    • Les modes de protection de flux UMFPACK et CHOLMOD ont été améliorés en éliminant les variables globales et en utilisant des verrous. Multithread "ldiv!" Les objets UMFPACK peuvent désormais être exécutés en toute sécurité.
    • La fonction expérimentale "SparseArrays.allowscalar(::Bool)" permet de désactiver ou d'activer l'indexation scalaire des tableaux sparse. Cette fonction est conçue pour détecter l'indexation scalaire aléatoire des objets "SparseMatrixCSC", qui est une source courante de problèmes de performances.
  • Nouveau mode de basculement pour les suites de tests qui met fin à une exécution de test plus tôt en cas d'échec ou d'erreur. Définissez via "@testset kwarg failfast=true" ou "export JULIA_TEST_FAILFAST=true". Cela peut être nécessaire dans les lancements de CI pour recevoir les premiers messages d'erreur.
  • Dates : les chaînes vides ne sont plus analysées de manière incorrecte en tant que valeurs "DateTime", "Dates" ou "Times" valides et génèrent à la place une erreur "ArgumentError" dans les constructeurs et l'analyse, tandis que "tryparse" ne renvoie rien.
  • Paquet distribué
    • La configuration du package (projet actif, "LOAD_PATH", "DEPOT_PATH") est maintenant propagée lorsque des processus de travail locaux sont ajoutés (par exemple avec "addprocs(N::Int)" ou avec l'indicateur de ligne de commande "-procs=N").
    • "addprocs" pour les processus de travail locaux prend désormais un argument nommé "env" pour transmettre les variables d'environnement aux processus de travail.
  • Unicode : "graphèmes(s, m:n)" renvoie la sous-chaîne du mème au nème graphèmes dans "s".
  • Le package DelimitedFiles a été supprimé des bibliothèques système et est désormais distribué sous la forme d'un package distinct qui doit être explicitement installé pour pouvoir être utilisé.
  • Dépendances externes
    • Linux détecte automatiquement la version de la bibliothèque système libstdc++ et la charge si elle est plus récente. L'ancien comportement de chargement de la libstdc++ intégrée quelle que soit la version du système peut être restauré en définissant la variable d'environnement "JULIA_PROBE_LIBSTDCXX=0".
    • Suppression de "RPATH" du binaire julia, qui peut casser les bibliothèques sous Linux qui ne parviennent pas à définir la variable "RUNPATH".
    • Améliorations des outils : la sortie de "MethodError" et des méthodes (par exemple, de "methods(my_func)") est maintenant formatée et colorée en fonction de la façon dont les méthodes sont sorties dans les traces de pile.

    Source: opennet.ru

Ajouter un commentaire