Lansarea limbajului de programare Julia 1.8

Este disponibilă lansarea limbajului de programare Julia 1.8, care combină calități precum performanța ridicată, suport pentru tastare dinamică și instrumente încorporate pentru programare paralelă. Sintaxa Juliei este apropiată de MATLAB, împrumutând unele elemente de la Ruby și Lisp. Metoda de manipulare a șirurilor amintește de Perl. Codul proiectului este distribuit sub licența MIT.

Caracteristicile cheie ale limbii:

  • Performanță ridicată: unul dintre obiectivele cheie ale proiectului este obținerea de performanțe apropiate de programele C. Compilatorul Julia se bazează pe munca proiectului LLVM și generează cod automat nativ eficient pentru multe platforme țintă;
  • Suportă diverse paradigme de programare, inclusiv elemente de programare orientată pe obiecte și funcționale. Biblioteca standard oferă, printre altele, funcții pentru I/O asincron, controlul proceselor, înregistrarea în jurnal, crearea de profiluri și gestionarea pachetelor;
  • Tastare dinamică: limbajul nu necesită definirea explicită a tipurilor pentru variabile, similar limbajelor de programare de scriptare. Modul interactiv acceptat;
  • Abilitatea opțională de a specifica în mod explicit tipurile;
  • O sintaxă ideală pentru calculul numeric, calculul științific, învățarea automată și vizualizarea datelor. Suport pentru multe tipuri de date numerice și instrumente pentru paralelizarea calculelor.
  • Abilitatea de a apela direct funcții din bibliotecile C fără straturi suplimentare.

Schimbări majore în Julia 1.8:

  • Caracteristici ale limbii noi
    • Câmpurile unei structuri mutabile pot fi acum adnotate ca constante pentru a preveni modificarea lor și pentru a permite optimizarea.
    • Adnotările de tip pot fi adăugate la variabilele globale.
    • Matricele n-dimensionale goale pot fi create folosind mai multe puncte și virgulă în paranteze pătrate, de exemplu „[;;;]” creează o matrice 0x0x0.
    • Blocurile Try pot avea acum opțional un bloc else, care este executat imediat după corpul principal dacă nu au fost aruncate erori.
    • @inline și @noinline pot fi plasate în corpul unei funcții, permițându-vă să adnotați o funcție anonimă.
    • @inline și @noinline pot fi acum aplicate unei funcții dintr-un site de apel sau bloc pentru a forța ca apelurile de funcție corespunzătoare să fie incluse (sau neincluse).
    • ∀, ∃ și ∄ sunt permise ca caractere identificatoare.
    • S-a adăugat suport pentru specificația Unicode 14.0.0.
    • Metoda Module(:name, false, false) poate fi folosită pentru a crea un modul care nu conține nume, nu importă Base sau Core și nu conține o referință la sine.
  • Schimbări în limbaj
    • Obiectele Task nou create (@spawn, @async etc.) au acum world_age pentru metodele din Task părinte atunci când sunt create, permițând execuția optimizată. Opțiunea anterioară de activare este disponibilă folosind metoda Base.invokelatest.
    • Directivele Unicode de formatare bidirecțională dezechilibrate sunt acum interzise în șiruri și comentarii pentru a evita injecțiile.
    • Base.ifelse este acum definit ca o funcție generică, mai degrabă decât o funcție încorporată, permițând pachetelor să-și extindă definiția.
    • Fiecare alocare unei variabile globale trece mai întâi printr-un apel pentru a converti(Orice, x) sau a converti(T, x) dacă variabila globală a fost declarată ca fiind de tip T. Înainte de a utiliza variabilele globale, asigurați-vă că invariantul convert(Orice , x) === x este întotdeauna adevărat, altfel poate duce la un comportament neașteptat.
    • Funcțiile încorporate sunt acum similare cu funcțiile generice și pot fi enumerate programatic folosind metode.
  • Îmbunătățiri ale compilatorului/execuției
    • Timpul de pornire a fost redus cu aproximativ 25%.
    • Compilatorul bazat pe LLVM a fost separat de biblioteca de rulare într-o nouă bibliotecă, libjulia-codegen. Este încărcat implicit, deci nu ar trebui să existe modificări în timpul utilizării normale. În implementările care nu au nevoie de un compilator (de exemplu, imagini de sistem în care tot codul necesar este precompilat), această bibliotecă (și dependența sa LLVM) poate fi pur și simplu omisă.
    • Inferența de tip condiționat este acum posibilă prin trecerea unui argument unei metode. De exemplu, pentru Base.ifelse(isa(x, Int), x, 0) returnează ::Int chiar dacă tipul de x este necunoscut.
    • SROA (Scalar Replacement of Aggregates) a fost îmbunătățit: elimină apelurile getfield cu câmpuri globale persistente, elimină structurile mutabile cu câmpuri neinițializate, îmbunătățește performanța și gestionarea apelurilor getfield imbricate.
    • Inferența tip urmărește diferite efecte — efecte secundare și non-scădere. Este luată în considerare propagarea constantă, ceea ce îmbunătățește semnificativ performanța la timp de compilare. În unele cazuri, de exemplu, apelurile la funcții care nu pot fi integrate, dar care nu afectează rezultatul, vor fi eliminate în timpul execuției. Regulile pentru efecte pot fi suprascrise manual folosind macrocomandă Base.@assume_effects.
    • Precompilarea (cu directive de precompilare explicite sau sarcini de lucru specificate) salvează acum mai mult cod definit de tip, rezultând o execuție mai rapidă pentru prima dată. Orice combinație nouă de metodă/tip necesară pachetului dvs., indiferent de unde au fost definite acele metode, pot fi acum stocate în cache în fișierul de precompilare dacă sunt apelate de o metodă care aparține pachetului dvs.
  • Modificări ale opțiunilor liniei de comandă
    • Comportamentul implicit pentru monitorizarea declarațiilor @inbounds este acum opțiunea automată din „--check-bounds=yes|no|auto”.
    • Noua opțiune „--strip-metadata” pentru a elimina documentele, informațiile despre locația sursă și numele variabilelor locale atunci când creați o imagine de sistem.
    • Opțiune nouă „--strip-ir” pentru a permite compilatorului să elimine reprezentarea codului sursă intermediar la construirea imaginii sistemului. Imaginea rezultată va funcționa numai dacă se folosește „--compile=all” sau dacă tot codul necesar este pre-compilat.
    • Dacă în locul numelui fișierului este specificat caracterul „-”, atunci codul executabil este citit din fluxul de intrare standard.
  • Modificări de suport pentru multithreading
    • Threads.@threads utilizează în mod implicit noua opțiune de programare :dynamic, care diferă de modul anterior prin faptul că iterațiile vor fi programate dinamic pe firele de lucru disponibile, mai degrabă decât să fie atribuite fiecărui fir. Acest mod permite o distribuție mai bună a buclelor imbricate cu @spawn și @threads.
  • Funcții noi de bibliotecă
    • eachsplit(str) pentru a executa split(str) de mai multe ori.
    • allequal(itr) pentru a testa dacă toate elementele dintr-un iterator sunt egale.
    • hardlink(src, dst) poate fi folosit pentru a crea legături hard.
    • setcpuaffinity(cmd, cpus) pentru a seta afinitatea nucleului procesorului cu procesele lansate.
    • diskstat(path=pwd()) pentru a obține statistici de disc.
    • Noua macrocomandă @showtime pentru a afișa atât linia evaluată, cât și raportul @time.
    • Macro-ul LazyString și lazy"str" ​​au fost adăugate pentru a sprijini construirea leneșă a mesajelor de eroare în căile de eroare.
    • S-a remediat o problemă de concurență în Dict și alte obiecte derivate, cum ar fi cheile(::Dict), valorile(::Dict) și Set. Metodele de iterație pot fi apelate acum pe un dicționar sau set, atâta timp cât nu există apeluri care modifică dicționarul sau setul.
    • @time și @timev au acum o descriere opțională, permițându-vă să adnotați sursa rapoartelor de timp, de exemplu. @time „Evaluarea foo” foo().
    • interval ia fie stop, fie lungime ca singur argument al cuvântului cheie.
    • precizie și setprecision acceptă acum baza ca cuvânt cheie
    • Obiectele socket TCP oferă acum o metodă de scriere apropiată și acceptă utilizarea modului semideschis.
    • extrema acceptă acum un argument init.
    • Iterators.countfrom acceptă acum orice tip care definește o metodă +.
    • @time alocă acum % din timpul petrecut recompilând metode cu tipuri modificate.
  • Modificări standard ale bibliotecii
    • Cheile cu valoare Nimic nu sunt acum eliminate din mediu în addenv.
    • Iteratoare.reverse (și, prin urmare, ultima) acceptă fiecare linie.
    • Funcția de lungime pentru intervale de anumite tipuri nu mai verifică depășirea întregului. Este disponibilă o nouă funcție, checked_length, care conține logica de control al transferului de biți. Dacă este necesar, utilizați SaferIntegers.jl pentru a construi tipul intervalului.
    • Iteratorul Iterator.Reverse implementează fiecare inversare a indexului, dacă este posibil.
  • Manager de pachete
    • Indicatori noi ⌃ și ⌅ lângă pachetele în starea „pkg>” pentru care sunt disponibile versiuni noi. ⌅ indică faptul că versiunile noi nu pot fi instalate.
    • Argument nou depășit::Bool pentru Pkg.status (--învechit sau -o în modul REPL) pentru a afișa informații despre pachetele din versiunile anterioare.
    • Argument nou compat::Bool pentru Pkg.status (--compat sau -c în modul REPL) pentru a afișa orice intrări [compat] în Project.toml.
    • Noul mod „pkg>compat” (și Pkg.compat) pentru setarea intrărilor de compatibilitate cu proiecte. Oferă un editor interactiv prin „pkg>compat” sau control direct al înregistrărilor prin „pkg>Foo 0.4,0.5”, care poate încărca înregistrările curente prin completarea filei. Adică, „pkg> compat Fo” este actualizat automat la „pkg> Foo 0.4,0.5”, astfel încât o intrare existentă să poată fi editată.
    • Pkg încearcă acum să descarce pachete de pe un server de pachete numai dacă serverul monitorizează registrul care conține pachetul.
    • Pkg.instantiate va emite acum un avertisment atunci când Project.toml nu este sincronizat cu Manifest.toml. Face acest lucru pe baza unui hash al înregistrărilor deps și compat ale proiectului (alte câmpuri sunt ignorate) în manifest atunci când îl rezolvă, astfel încât orice modificare a înregistrărilor deps sau compat Project.toml să poată fi detectată fără re-rezolvare.
    • Dacă „pkg>add” nu poate găsi un pachet cu numele dat, acum va sugera pachete cu nume similare care pot fi adăugate.
    • Versiunea julia stocată în manifest nu mai include numărul versiunii, ceea ce înseamnă că master va fi acum scris ca 1.9.0-DEV.
    • Anularea testului „pkg>” va fi acum detectată mai consistent și va fi returnată corect la REPL.
  • InteractiveUtils
    • Noua macrocomandă @time_imports pentru a raporta timpul petrecut importând pachetele și dependențele acestora, evidențiind timpul de compilare și recompilare ca procent din importuri.
  • Algebră liniară
    • Submodulul BLAS acceptă acum funcțiile BLAS spr! de nivelul 2.
    • Biblioteca standard LinearAlgebra.jl este acum complet independentă de SparseArrays.jl, atât din perspectiva codului sursă, cât și a testării unitare. În consecință, tablourile rare nu mai sunt returnate (implicit) prin metode din LinearAlgebra aplicate obiectelor de bază sau LinearAlgebra. În special, acest lucru duce la următoarele modificări radicale:
      • Concatenările care utilizează matrici speciale „sparse” (de ex. diagonale) returnează acum matrici dense; În consecință, câmpurile D1 și D2 ale obiectelor SVD create de apelurile getproperty sunt acum matrici dense.
      • Metoda similară(::SpecialSparseMatrix, ::Type, ::Dims) returnează o matrice nulă densă. În consecință, produsele de două, trei și matrice tridiagonale simetrice între ele conduc la generarea unei matrice dense. În plus, construirea de matrici similare cu trei argumente din matrici speciale „sparse” din matrice (nestatice) nu reușește acum din cauza „zero(::Type{Matrix{T}})”.
  • printf
    • %s și %c folosesc acum argumentul textwidth pentru a formata lățimea.
  • Profil
    • Profilarea încărcării CPU înregistrează acum metadate, inclusiv fire și sarcini. Profile.print() are un nou argument groupby care vă permite să grupați fire de execuție, sarcini sau subfile/sarcini, sarcini/subiecte de execuție și argumente pentru fire și sarcini pentru a oferi filtrare. În plus, procentul de utilizare este acum raportat fie ca global, fie pe fir, în funcție de dacă firul este inactiv sau nu în fiecare probă. Profile.fetch() include noile metadate în mod implicit. Pentru compatibilitatea cu consumatorii externi ai datelor de profilare, poate fi exclus prin transmiterea include_meta=false.
    • Noul modul Profile.Allocs vă permite să profilați alocările de memorie. Este înregistrată o urmă de stivă a tipului și mărimii fiecărei alocări de memorie, iar argumentul sample_rate permite omiterea unui număr configurabil de alocări, reducând suprasarcina de performanță.
    • Profilul CPU cu durată fixă ​​poate fi acum rulat de utilizator în timp ce sarcinile rulează fără a încărca mai întâi profilul, iar raportul va fi afișat în timpul rulării. Pe MacOS și FreeBSD, apăsați ctrl-t sau apelați SIGINFO. Pentru alte platforme, activați SIGUSR1, adică % kill -USR1 $julia_pid. Acest lucru nu este disponibil pe Windows.
  • REPL
    • RadioMenu acceptă acum comenzi rapide suplimentare de la tastatură pentru selectarea directă a opțiunilor.
    • Secvența „?(x, y” urmată de apăsarea TAB afișează toate metodele care pot fi apelate cu argumentele x, y, .... (Un spațiu de început vă împiedică să intrați în modul ajutor.) „MyModule.?(x, y " restricționează căutarea la „MyModule”. Apăsarea TAB necesită ca cel puțin un argument să fie de un tip mai specific decât Any. Sau folosiți SHIFT-TAB în loc de TAB pentru a permite orice metode compatibile.
    • Noua variabilă globală err vă permite să obțineți cea mai recentă excepție, similară comportamentului ans cu ultimul răspuns. Introducerea err retipărește informațiile de excepție.
  • SparseArrays
    • S-a mutat codul SparseArrays din depozitul Julia în depozitul extern SparseArrays.jl.
    • Noile funcții de concatenare sparse_hcat, sparse_vcat și sparse_hvcat returnează un tip SparseMatrixCSC, indiferent de tipurile argumentelor de intrare. Acest lucru a devenit necesar pentru unificarea mecanismului de lipire a matricelor după separarea codului LinearAlgebra.jl și SparseArrays.jl.
  • Exploatari forestiere
    • Nivelurile standard de înregistrare BelowMinLevel, Debug, Info, Warn, Error și AboveMaxLevel sunt acum exportate din biblioteca standard Logging.
  • Unicode
    • S-a adăugat funcția isequal_normalized pentru a verifica echivalența Unicode fără a construi în mod explicit șiruri normalizate.
    • Funcția Unicode.normalize acceptă acum cuvântul cheie charttransform, care poate fi folosit pentru a furniza mapări personalizate de caractere, iar funcția Unicode.julia_chartransform este, de asemenea, furnizată pentru a reproduce maparea utilizată atunci când analizatorul Julia normalizează identificatorii.
  • Test
    • „@test_throws „un mesaj” triggers_error()” poate fi acum utilizat pentru a testa dacă textul de eroare afișat conține o eroare „un mesaj”, indiferent de tipul de excepție specific. Sunt acceptate și expresiile regulate, listele de șiruri și funcțiile de potrivire.
    • @testset foo() poate fi folosit acum pentru a crea un set de testare dintr-o funcție dată. Numele cazului de testare este numele funcției apelate. Funcția apelată poate conține @test și alte definiții @testset, inclusiv pentru apeluri către alte funcții, în timp ce înregistrează toate rezultatele testelor intermediare.
    • TestLogger și LogRecord sunt acum exportate din biblioteca standard de testare.
  • distribuit
    • SSHManager acceptă acum firele de lucru cu un wrapper csh/tcsh prin metoda addprocs() și parametrul shell=:csh.
  • Alte modificări
    • GC.enable_logging(true) poate fi folosit pentru a înregistra fiecare operațiune de colectare a gunoiului cu timpul și cantitatea de memorie colectată.

Sursa: opennet.ru

Adauga un comentariu