Llançament del llenguatge de programació Julia 1.8

El llançament del llenguatge de programació Julia 1.8 està disponible, 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.8:

  • Noves característiques de l'idioma
    • Els camps d'una estructura mutable ara es poden anotar com a constants per evitar que es modifiquin i permetre l'optimització.
    • Les anotacions de tipus es poden afegir a les variables globals.
    • Les matrius n-dimensionals buides es poden crear utilitzant diversos punts i coma dins de claudàtors, per exemple, "[;;;]" crea una matriu 0x0x0.
    • Els blocs Try ara poden tenir opcionalment un bloc else, que s'executa immediatament després del cos principal si no s'han produït errors.
    • @inline i @noinline es poden col·locar dins del cos d'una funció, cosa que us permet anotar una funció anònima.
    • Ara es poden aplicar @inline i @noinline a una funció d'un lloc de trucada o bloc per forçar que s'incloguin (o no s'incloguin) les trucades de funció corresponents.
    • ∀, ∃ i ∄ es permeten com a caràcters identificadors.
    • S'ha afegit suport per a l'especificació Unicode 14.0.0.
    • El mètode Module(:name, false, false) es pot utilitzar per crear un mòdul que no contingui noms, que no importi Base o Core i que no contingui una referència a si mateix.
  • Canvis en el llenguatge
    • Els objectes Task de nova creació (@spawn, @async, etc.) ara tenen world_age per als mètodes de la Tasca pare quan es creen, permetent una execució optimitzada. L'opció d'activació anterior està disponible mitjançant el mètode Base.invokelatest.
    • Les directives de format bidireccional desequilibrat Unicode ara estan prohibides en cadenes i comentaris per evitar injeccions.
    • Base.ifelse es defineix ara com una funció genèrica en lloc d'una funció integrada, que permet als paquets ampliar la seva definició.
    • Ara, cada assignació a una variable global passa primer per una crida per convertir(Qualsevol, x) o convertir(T, x) si la variable global es va declarar de tipus T. Abans d'utilitzar variables globals, assegureu-vos que l'invariant convert(Qualsevol , x) === x sempre és certa, en cas contrari pot provocar un comportament inesperat.
    • Les funcions integrades ara són similars a les funcions genèriques i es poden enumerar programadament mitjançant mètodes.
  • Millores en el compilador/en temps d'execució
    • El temps d'arrencada s'ha reduït aproximadament un 25%.
    • El compilador basat en LLVM s'ha separat de la biblioteca en temps d'execució en una nova biblioteca, libjulia-codegen. Es carrega per defecte, de manera que no hi hauria d'haver canvis durant l'ús normal. En els desplegaments que no necessiten un compilador (per exemple, imatges del sistema en què tot el codi necessari està precompilat), aquesta biblioteca (i la seva dependència LLVM) simplement es pot ometre.
    • La inferència de tipus condicional ara és possible passant un argument a un mètode. Per exemple, per a Base.ifelse(isa(x, Int), x, 0) retorna ::Int encara que el tipus de x és desconegut.
    • S'ha millorat SROA (Scalar Replacement of Aggregates): elimina les trucades getfield amb camps globals persistents, elimina estructures mutables amb camps no inicialitzats, millora el rendiment i el maneig de les trucades getfield imbricades.
    • La inferència de tipus fa un seguiment de diversos efectes: efectes secundaris i sense caiguda. Es té en compte la propagació constant, la qual cosa millora significativament el rendiment en temps de compilació. En alguns casos, per exemple, les trucades a funcions que no es poden integrar però que no afecten el resultat es descartaran en temps d'execució. Les regles dels efectes es poden sobreescriure manualment mitjançant la macro Base.@assume_effects.
    • La compilació prèvia (amb directives de precompilació explícites o càrregues de treball especificades) ara desa més codi definit per tipus, el que resulta en una execució més ràpida per primera vegada. Qualsevol combinació nova de mètode/tipus que necessiti el vostre paquet, independentment d'on s'hagin definit aquests mètodes, ara es pot guardar a la memòria cau al fitxer de precompilació si és cridada per un mètode que pertany al vostre paquet.
  • Canvis a les opcions de la línia d'ordres
    • El comportament predeterminat per supervisar les declaracions @inbounds és ara l'opció automàtica a "--check-bounds=yes|no|auto".
    • Nova opció "--strip-metadata" per eliminar les cadenes de documents, la informació de la ubicació d'origen i els noms de variables locals quan es crea una imatge del sistema.
    • Nova opció "--strip-ir" per permetre al compilador eliminar la representació del codi font intermedi quan es construeix la imatge del sistema. La imatge resultant només funcionarà si s'utilitza "--compile=all" o si tot el codi necessari està precompilat.
    • Si s'especifica el caràcter "-" en comptes del nom del fitxer, el codi executable es llegeix des del flux d'entrada estàndard.
  • Canvis de suport multithreading
    • Threads.@threads de manera predeterminada utilitza la nova opció de programació :dynamic, que difereix del mode anterior perquè les iteracions es programaran de manera dinàmica entre els fils de treball disponibles en lloc d'assignar-se a cada fil. Aquest mode permet una millor distribució dels bucles imbricats amb @spawn i @threads.
  • Noves funcions de la biblioteca
    • eachsplit(str) per executar split(str) diverses vegades.
    • allequal(itr) per comprovar si tots els elements d'un iterador són iguals.
    • hardlink(src, dst) es pot utilitzar per crear enllaços durs.
    • setcpuaffinity(cmd, cpus) per establir l'afinitat del nucli del processador amb els processos llançats.
    • diskstat(path=pwd()) per obtenir estadístiques de disc.
    • Nova macro @showtime per mostrar tant la línia que s'està avaluant com l'informe @time.
    • S'han afegit LazyString i la macro "str" ​​per donar suport a la construcció mandrosa de missatges d'error en camins d'error.
    • S'ha solucionat un problema de concurrència a Dict i altres objectes derivats, com ara claus(::Dict), valors(::Dict) i Set. Els mètodes d'iteració ara es poden cridar en un diccionari o conjunt, sempre que no hi hagi trucades que modifiquin el diccionari o el conjunt.
    • @time i @timev ara tenen una descripció opcional, que us permet anotar la font dels informes de temps, per exemple. @time "Avaluant foo" foo().
    • range pren stop o longitud com a únic argument de paraula clau.
    • Precision i setprecision ara accepten base com a paraula clau
    • Els objectes de socket TCP ara proporcionen un mètode d'escriptura propera i admeten l'ús del mode mig obert.
    • extrema ara accepta un argument init.
    • Iterators.countfrom ara accepta qualsevol tipus que defineixi un mètode +.
    • @time ara assigna el % del temps dedicat a recompilar mètodes amb els tipus canviats.
  • Canvis estàndard a la biblioteca
    • Les claus amb valor No s'eliminen ara de l'entorn a addenv.
    • Iterators.reverse (i per tant l'últim) admet cada línia.
    • La funció de longitud per a intervals de certs tipus ja no comprova el desbordament d'enteres. Hi ha disponible una nova funció, checked_length; conté la lògica de control de transferència de bits. Si cal, utilitzeu SaferIntegers.jl per construir el tipus d'interval.
    • L'iterador Iterators.Reverse implementa cada inversió d'índex si és possible.
  • Gestor de paquets
    • Indicadors ⌃ i ⌅ nous al costat dels paquets amb l'estat “pkg>” per als quals hi ha noves versions disponibles. ⌅ indica que no es poden instal·lar versions noves.
    • Nou argument obsolet::Bool a Pkg.status (--obsolet o -o en mode REPL) per mostrar informació sobre paquets de versions anteriors.
    • Nou argument compat::Bool a Pkg.status (--compat o -c en mode REPL) per mostrar qualsevol entrada [compat] a Project.toml.
    • Nou mode "pkg>compat" (i Pkg.compat) per configurar les entrades de compatibilitat del projecte. Proporciona un editor interactiu mitjançant "pkg>compat" o control directe de registres mitjançant "pkg>Foo 0.4,0.5, 0.4,0.5", que pot carregar els registres actuals mitjançant la finalització de la pestanya. És a dir, "pkg> compat Fo" s'actualitza automàticament a "pkg> Foo XNUMX" perquè es pugui editar una entrada existent.
    • Pkg ara només intenta descarregar paquets d'un servidor de paquets si el servidor està supervisant el registre que conté el paquet.
    • Ara Pkg.instantiate emetrà un avís quan Project.toml no estigui sincronitzat amb Manifest.toml. Ho fa a partir d'un hash dels registres de deps i compat del projecte (s'ignoren els altres camps) al manifest quan el resol, de manera que qualsevol canvi als registres de deps o compat de Project.toml es pot detectar sense tornar a resoldre.
    • Si "pkg>add" no pot trobar un paquet amb el nom donat, ara suggerirà paquets amb noms similars que es poden afegir.
    • La versió de julia emmagatzemada al manifest ja no inclou el número de compilació, el que significa que el mestre ara s'escriurà com a 1.9.0-DEV.
    • L'avortament de la prova "pkg>" ara es detectarà de manera més coherent i es retornarà correctament al REPL.
  • InteractiveUtils
    • Nova macro @time_imports per informar del temps dedicat a importar paquets i les seves dependències, destacant el temps de compilació i recompilació com a percentatge de les importacions.
  • Àlgebra linial
    • El submòdul BLAS ara admet funcions BLAS spr! de nivell 2.
    • La biblioteca estàndard LinearAlgebra.jl ara és completament independent de SparseArrays.jl, tant des del punt de vista del codi font com de les proves unitàries. Com a conseqüència, els mètodes de LinearAlgebra aplicats a objectes Base o LinearAlgebra ja no retornen (implícitament) les matrius disperses. En particular, això comporta els següents canvis de ruptura:
      • Les concatenacions que utilitzen matrius especials "esparses" (p. ex. diagonal) ara retornen matrius denses; Com a conseqüència, els camps D1 i D2 dels objectes SVD creats per les trucades getproperty són ara matrius denses.
      • El mètode similar(::SpecialSparseMatrix, ::Type, ::Dims) retorna una matriu nul·la densa. Com a conseqüència, els productes de matrius tridiagonals de dues, tres i simètriques entre si condueixen a la generació d'una matriu densa. A més, la construcció de matrius similars amb tres arguments a partir de matrius especials "esparxes" a partir de matrius (no estàtiques) ara falla a causa de "zero(::Type{Matrix{T}})".
  • Printf
    • %s i %c ara utilitzen l'argument textwidth per formatar l'amplada.
  • Perfil
    • El perfil de càrrega de la CPU ara registra metadades, inclosos fils i tasques. Profile.print() té un nou argument groupby que us permet agrupar fils, tasques o subfils/tasques, tasques/fils i arguments de fils i tasques per proporcionar un filtratge. A més, ara s'informa del percentatge d'utilització com a global o per fil, depenent de si el fil està inactiu o no a cada mostra. Profile.fetch() inclou les metadades noves de manera predeterminada. Per a la compatibilitat enrere amb consumidors externs de dades de perfil, es pot excloure passant include_meta=false.
    • El nou mòdul Profile.Allocs us permet perfilar les assignacions de memòria. Es registra una traça de pila del tipus i la mida de cada assignació de memòria i l'argument sample_rate permet ometre un nombre configurable d'assignacions, reduint la sobrecàrrega de rendiment.
    • Ara l'usuari pot executar el perfil de la CPU de durada fixa mentre s'executen les tasques sense carregar primer el perfil, i l'informe es mostrarà mentre s'executa. A MacOS i FreeBSD, premeu Ctrl-t o truqueu a SIGINFO. Per a altres plataformes, activeu SIGUSR1, és a dir. % kill -USR1 $julia_pid. Això no està disponible a Windows.
  • REPL
    • RadioMenu ara admet dreceres de teclat addicionals per a la selecció directa d'opcions.
    • La seqüència "?(x, y" seguida de prémer TAB mostra tots els mètodes que es poden cridar amb arguments x, y, .... (Un espai inicial impedeix entrar al mode d'ajuda.) "El meu mòdul.?(x, y " restringeix la cerca a "MyModule". Si premeu TAB, cal que almenys un argument sigui d'un tipus més específic que Any. O feu servir MAJÚS+TAB en lloc de TAB per permetre qualsevol mètode compatible.
    • La nova variable global err us permet obtenir l'última excepció, similar al comportament de ans amb l'última resposta. Si escriu err, es torna a imprimir la informació de l'excepció.
  • SparseArrays
    • S'ha mogut el codi SparseArrays del dipòsit Julia al dipòsit extern SparseArrays.jl.
    • Les noves funcions de concatenació sparse_hcat, sparse_vcat i sparse_hvcat retornen un tipus SparseMatrixCSC independentment dels tipus d'arguments d'entrada. Això es va fer necessari per unificar el mecanisme per enganxar matrius després de separar el codi LinearAlgebra.jl i SparseArrays.jl.
  • Inici de sessió
    • Els nivells de registre estàndard BelowMinLevel, Debug, Info, Warn, Error i AboveMaxLevel ara s'exporten des de la biblioteca de Logging estàndard.
  • Unicode
    • S'ha afegit la funció isequal_normalized per comprovar l'equivalència Unicode sense construir explícitament cadenes normalitzades.
    • La funció Unicode.normalize ara accepta la paraula clau charttransform, que es pot utilitzar per proporcionar mapes de caràcters personalitzats, i la funció Unicode.julia_chartransform també s'ofereix per reproduir l'assignació utilitzada quan l'analitzador Julia normalitza els identificadors.
  • Test
    • '@test_throws "algun missatge" triggers_error()' ara es pot utilitzar per provar si el text d'error mostrat conté un error "algun missatge", independentment del tipus d'excepció específic. També s'admeten expressions regulars, llistes de cadenes i funcions de concordança.
    • @testset foo() ara es pot utilitzar per crear un conjunt de proves a partir d'una funció determinada. El nom del cas de prova és el nom de la funció que es crida. La funció cridada pot contenir @test i altres definicions de @testset, incloses les trucades a altres funcions, mentre es registren tots els resultats intermedis de la prova.
    • TestLogger i LogRecord s'exporten ara des de la biblioteca de proves estàndard.
  • Distribuït
    • SSHManager ara admet fils de treball amb un embolcall csh/tcsh mitjançant el mètode addprocs() i el paràmetre shell=:csh.
  • Altres canvis
    • GC.enable_logging(true) es pot utilitzar per registrar cada operació de recollida d'escombraries amb el temps i la quantitat de memòria recollida.

Font: opennet.ru

Afegeix comentari