Llenguatge de programació Julia 1.9 disponible

S'ha publicat el llançament del llenguatge de programació Julia 1.9, que combina qualitats com ara alt rendiment, suport per a la mecanografia dinàmica i eines integrades per a la programació paral·lela. La sintaxi de Julia és propera a MATLAB, agafant alguns elements de Ruby i Lisp. El mètode de manipulació de cadenes recorda a Perl. El codi del projecte es distribueix sota la llicència MIT.

Característiques principals de la llengua:

  • Alt rendiment: un dels objectius clau del projecte és aconseguir un rendiment proper als programes C. El compilador Julia es basa en el treball del projecte LLVM i genera codi de màquina natiu eficient per a moltes plataformes de destinació;
  • Admet diversos paradigmes de programació, inclosos elements de programació funcional i orientada a objectes. La biblioteca estàndard proporciona, entre altres coses, funcions per a E/S asíncrones, control de processos, registre, perfils i gestió de paquets;
  • Mecanografia dinàmica: el llenguatge no requereix una definició explícita de tipus de variables, de manera similar als llenguatges de programació d'scripts. Admet el mode interactiu;
  • Capacitat opcional d'especificar de manera explícita els tipus;
  • Una sintaxi ideal per a la informàtica numèrica, la informàtica científica, l'aprenentatge automàtic i la visualització de dades. Suport per a molts tipus de dades numèriques i eines per a la paral·lelització de càlculs.
  • La capacitat de trucar directament a funcions des de biblioteques C sense capes addicionals.

Canvis importants a Julia 1.9:

  • Noves característiques de l'idioma
    • Permet que es facin assignacions en un altre mòdul mitjançant "setproperty!(::Module, ::Symbol, x)".
    • Es permeten múltiples tasques que no estiguin a la posició final. Per exemple, la cadena “a, b…, c = 1, 2, 3, 4” es processarà com a “a = 1; b…, = 2, 3; c = 4". Això es gestiona mitjançant Base.split_rest.
    • Els literals d'un sol caràcter ara admeten la mateixa sintaxi que els literals de cadena; aquells. La sintaxi pot representar seqüències UTF-8 no vàlides, tal com ho permet el tipus Char.
    • S'ha afegit suport per a l'especificació Unicode 15.
    • Les combinacions niuades de tuples i tuples de caràcters amb nom ara es poden utilitzar com a paràmetres de tipus.
    • Noves funcions integrades "getglobal(::Module, ::Symbol[, order])" i "setglobal!(::Module, ::Symbol, x[, order])" per llegir i escriure exclusivament a variables globals. Ara s'hauria de preferir el mètode getglobal sobre el mètode getfield per accedir a variables globals.
  • Canvis en el llenguatge
    • La macro "@invoke" introduïda a la versió 1.7 ara s'exporta i està disponible per utilitzar-la. A més, ara utilitza el mètode "Core.Typeof(x)" en lloc de "Qualsevol" en el cas en què s'omet l'anotació de tipus per a l'argument "x". Això és necessari per garantir que els tipus passats com a arguments es processin correctament.
    • Exportació activada de la funció "invokelatest" i de la macro "@invokelatest", introduïda a la versió 1.7.
  • Millores en el compilador/en temps d'execució
    • Temps significativament reduït fins a la primera execució (TTFX - Temps fins a la primera execució). La precompilació d'un paquet ara emmagatzema codi natiu a "pkgimage", el que significa que el codi generat pel procés de precompilació no haurà de ser recompilat després de carregar el paquet. L'ús del mode pkgimages es pot desactivar mitjançant l'opció "--pkgimages=no".
    • S'ha solucionat el conegut problema de complexitat quadràtica de la inferència de tipus, i la inferència utilitza menys memòria en general. Alguns casos límit amb funcions llargues generades automàticament (com ara ModelingToolkit.jl amb equacions diferencials parcials i grans models causals) es compilen molt més ràpidament.
    • Les trucades amb arguments sense tipus concrets ara es poden optimitzar per a la divisió de la unió per a la injecció o la resolució estàtica, fins i tot si hi ha diversos candidats de tipus diferent per a l'enviament. Això pot millorar el rendiment en determinades situacions en què els tipus d'objectes no es resolen completament estàticament, resolent estàticament els llocs de trucades "@nospecialize-d" i evitant la recompilació.
    • Tots els usos de la macro @pure al mòdul Base s'han substituït per Base.@assume_effects.
    • Les trucades per invocar(f, invokesig, args...) amb tipus menys específics dels que s'utilitzen normalment per a f(args...) ja no fan que el paquet es recompili.
  • Canvis a les opcions de la línia d'ordres
    • A Linux i Windows, l'opció "--threads=auto" ara intenta determinar el nombre de processadors disponible en funció de l'afinitat de la CPU, una màscara que s'estableix normalment en entorns HPC i núvol.
    • El paràmetre "--math-mode=fast" està desactivat, en lloc del qual es recomana utilitzar la macro "@fastmath", que té una semàntica clarament definida.
    • L'opció "--threads" ara té el format "auto | N[,auto|M]", on M indica el nombre de fils interactius a crear (actualment automàtic significa 1).
    • S'ha afegit l'opció "—heap-size-hint=" ", que estableix el llindar després del qual comença la recollida d'escombraries activa. La mida es pot especificar en bytes, kilobytes (1000 KB), megabytes (300 MB) o gigabytes (1,5 GB).
  • Canvis en el multithreading
    • "Threads.@spawn" ara té un primer argument opcional amb el valor ":default" o ":interactive". Una tasca interactiva requereix una latència de resposta baixa i està dissenyada per ser breu o realitzar-se amb freqüència. Les tasques interactives s'executaran en fils interactius si s'especifiquen en iniciar Julia.
    • Els fils que s'executen fora del temps d'execució de Julia (com ara des de C o Java) ara poden trucar al codi Julia mitjançant "jl_adopt_thread". Això passa automàticament quan s'introdueix el codi Julia mitjançant "cfunction" o el punt d'entrada "@ccallable". Com a conseqüència, el nombre de fils ara pot canviar durant l'execució.
  • Noves funcions de la biblioteca
    • Nova funció "Iterators.flatmap".
    • Nova funció "pkgversion(m::Module)" per obtenir la versió del paquet que va carregar un mòdul determinat, similar a "pkgdir(m::Module)".
    • Nova funció "stack(x)" que generalitza "reduce(hcat, x::Vector{<:Vector})" a qualsevol dimensió i permet qualsevol iterador d'iteradors. El mètode "stack(f, x)" generalitza "mapreduce(f, hcat, x)" i és més eficient.
    • Nova macro per analitzar la memòria assignada "@allocations", similar a "@allocations", excepte que retorna el nombre d'assignacions de memòria, en lloc de la mida total de la memòria assignada.
  • Noves funcions de la biblioteca
    • "RoundFromZero" ara funciona per a tipus diferents de "BigFloat".
    • Ara "Dict" es pot reduir manualment amb "sizehint!"
    • "@time" ara especifica per separat el percentatge de temps dedicat a recompilar mètodes no vàlids.
  • Canvis a la biblioteca estàndard
    • S'ha solucionat un problema de concurrència en els mètodes d'iteració per a Dict i altres objectes derivats, com ara claus(::Dict), valors (::Dict) i Set. Aquests mètodes d'iteració ara es poden cridar en un Dict o Set en paral·lel per a un nombre il·limitat de fils, sempre que no hi hagi accions que modifiquin el diccionari o el conjunt.
    • Negar una funció de predicat "!f" ara retorna una funció composta "(!) ∘ f" en lloc d'una funció anònima.
    • Les funcions de tall de dimensió ara funcionen en múltiples dimensions: "eachslice", "eachrow" i "eachcol" retornen un objecte "Slices" que permet l'enviament per proporcionar mètodes més eficients.
    • S'ha afegit la macro "@kwdef" a l'API pública.
    • S'ha solucionat un problema amb l'ordre de les operacions a "fld1".
    • Ara l'ordenació és sempre estable (QuickSort s'ha redissenyat).
    • "Base.splat" ara s'exporta. El valor de retorn és un tipus "Base.Splat" en lloc d'una funció anònima, la qual cosa permet que es produeixi bé.
  • Gestor de paquets
    • "Extensions de paquets": suport per carregar un fragment de codi d'altres paquets carregats en una sessió de Julia. L'aplicació és similar al paquet "Requires.jl", però és compatible amb la compilació prèvia i la compatibilitat de configuració.
  • Biblioteca d'àlgebra lineal
    • A causa del risc de confusió amb la divisió per elements, es van eliminar els mètodes "a/b" i "b\a" amb escalar "a" i vector "b", que eren equivalents a "a * pinv(b)".
    • Trucar a BLAS i LAPACK ara s'utilitza "libblastrampoline (LBT)". L'OpenBLAS es proporciona per defecte, però no s'admet la creació de la imatge del sistema amb altres biblioteques BLAS/LAPACK. En lloc d'això, es recomana utilitzar el mecanisme LBT per substituir BLAS/LAPACK per un altre conjunt de biblioteques existents.
    • "lu" admet una nova estratègia de rotació de matrius, "RowNonZero()", que selecciona el primer element de rotació diferent de zero per utilitzar-lo amb nous tipus aritmètics i amb finalitats d'entrenament.
    • "normalize(x, p=2)" ara admet qualsevol espai vectorial normalitzat "x", inclosos els escalars.
    • El nombre predeterminat de fils BLAS és ara igual al nombre de fils de CPU a les arquitectures ARM i la meitat del nombre de fils de CPU a altres arquitectures.
  • Printf: missatges d'error reelaborats per a cadenes amb un format incorrecte per a una millor llegibilitat.
  • Perfil: nova funció "Profile.take_heap_snapshot(file)", que escriu un fitxer en el format ".heapsnapshot" basat en JSON compatible amb Chrome.
  • Aleatori: randn i randexp ara funcionen per a qualsevol tipus AbstractFloat que defineixi rand.
  • REPL
    • Si premeu la combinació de tecles "Alt-e", ara s'obre l'entrada actual a l'editor. El contingut (si es modifica) s'executarà quan sortiu de l'editor.
    • El context del mòdul actual actiu al REPL es pot canviar (Principal per defecte) mitjançant la funció "REPL.activate(::Module)" o introduint el mòdul al REPL i prement la combinació de tecles "Alt-m".
    • El mode "indicació numerada", que imprimeix números per a cada entrada i sortida i emmagatzema els resultats puntuats a Out, es pot activar mitjançant "REPL.numbered_prompt!()".
    • La finalització de la pestanya mostra els arguments de paraules clau disponibles.
  • SuiteSparse: S'ha mogut el codi per al solucionador "SuiteSparse" a "SparseArrays.jl". Ara "SuiteSparse.jl" torna a exportar els solucionadors.
  • SparseArrays
    • Els solucionadors "SuiteSparse" ja estan disponibles com a submòduls "SparseArrays".
    • Els modes de protecció del fil UMFPACK i CHOLMOD s'han millorat eliminant variables globals i utilitzant bloquejos. "ldiv!" multifil! Els objectes UMFPACK ara es poden executar de manera segura.
    • La funció experimental "SparseArrays.allowscalar(::Bool)" us permet desactivar o habilitar la indexació escalar de matrius disperses. Aquesta funció està dissenyada per detectar la indexació escalar aleatòria d'objectes "SparseMatrixCSC", que és una font habitual de problemes de rendiment.
  • Nou mode de seguretat per a conjunts de proves que finalitza una prova abans d'hora en cas d'error o error. Definiu-lo mitjançant "@testset kwarg failfast=true" o "export JULIA_TEST_FAILFAST=true". Això de vegades és necessari en execucions de CI per rebre missatges d'error abans d'hora.
  • Dates: les cadenes buides ja no s'analitzen incorrectament com a valors vàlids de "DateTime", "Dates" o "Times" i, en canvi, llançaran un "ArgumentError" als constructors i a l'anàlisi, mentre que "tryparse" no retorna res.
  • Paquet distribuït
    • La configuració del paquet (projecte actiu, "LOAD_PATH", "DEPOT_PATH") ara es propaga quan s'afegeixen processos de treball locals (per exemple, utilitzant "addprocs(N::Int)" o utilitzant el senyalador de línia d'ordres "--procs=N").
    • "addprocs" per als processos de treball locals ara accepta un argument anomenat "env" per passar variables d'entorn als processos de treball.
  • Unicode: "grafemes(s, m:n)" retorna la subcadena dels grafemes mes a enèsimo en "s".
  • El paquet DelimitedFiles s'ha eliminat de les biblioteques del sistema i ara es distribueix com un paquet separat que s'ha d'instal·lar explícitament per poder utilitzar-lo.
  • Dependències externes
    • A Linux, la versió de la biblioteca del sistema libstdc++ es detecta automàticament i, si és més recent, es carrega. L'antic comportament de càrrega incorporat de libstdc++, independentment de la versió del sistema, es pot restaurar configurant la variable d'entorn "JULIA_PROBE_LIBSTDCXX=0".
    • S'ha eliminat "RPATH" del binari julia, que pot trencar biblioteques a Linux que no defineixen la variable "RUNPATH".
    • Millores de l'eina: la sortida de "MethodError" i mètodes (per exemple, de "methods(my_func)") ara està formatada i acolorida d'acord amb el principi de sortida dels mètodes en una traça de pila.

    Font: opennet.ru

Afegeix comentari