Dostupan programski jezik Julia 1.9

Objavljeno je izdanje programskog jezika Julia 1.9, koji kombinuje kvalitete kao što su visoke performanse, podrška za dinamičko kucanje i ugrađeni alati za paralelno programiranje. Julijina sintaksa je bliska MATLAB-u, pozajmljujući neke elemente iz Ruby-ja i Lisp-a. Metoda manipulacije stringovima podsjeća na Perl. Šifra projekta se distribuira pod MIT licencom.

Ključne karakteristike jezika:

  • Visoke performanse: jedan od ključnih ciljeva projekta je postizanje performansi bliskih C programima. Julia kompajler je zasnovan na radu LLVM projekta i generiše efikasan izvorni mašinski kod za mnoge ciljne platforme;
  • Podržava različite paradigme programiranja, uključujući elemente objektno orijentisanog i funkcionalnog programiranja. Standardna biblioteka pruža, između ostalog, funkcije za asinhroni I/O, kontrolu procesa, evidentiranje, profilisanje i upravljanje paketima;
  • Dinamičko kucanje: jezik ne zahtijeva eksplicitnu definiciju tipova za varijable, slično programskim jezicima za skriptiranje. Podržan interaktivni način rada;
  • Opciona mogućnost eksplicitnog specificiranja tipova;
  • Sintaksa idealna za numeričko računanje, naučno računanje, mašinsko učenje i vizualizaciju podataka. Podrška za mnoge tipove numeričkih podataka i alate za paralelizaciju izračunavanja.
  • Mogućnost direktnog pozivanja funkcija iz C biblioteka bez dodatnih slojeva.

Glavne promjene u Juliji 1.9:

  • Nove jezičke karakteristike
    • Dozvolite da se dodijeli u drugom modulu koristeći "setproperty!(::Module, ::Symbol, x)".
    • Višestruki zadaci koji nisu na konačnoj poziciji su dozvoljeni. Na primjer, niz “a, b…, c = 1, 2, 3, 4” će biti obrađen kao “a = 1; b…, = 2, 3; c = 4". Ovo se rješava preko Base.split_rest.
    • Literali jednog karaktera sada podržavaju istu sintaksu kao i literali stringova; one. Sintaksa može predstavljati nevažeće UTF-8 sekvence, kako to dozvoljava tip Char.
    • Dodata podrška za Unicode 15 specifikaciju.
    • Ugniježđene kombinacije torki i imenovanih tuple znakova sada se mogu koristiti kao parametri tipa.
    • Nove ugrađene funkcije "getglobal(::Module, ::Symbol[, order])" i "setglobal!(::Module, ::Symbol, x[, order])" za čitanje i pisanje isključivo u globalne varijable. Getglobal metoda bi sada trebala imati prednost u odnosu na getfield metodu za pristup globalnim varijablama.
  • Promjene u jeziku
    • Makro "@invoke" uveden u verziji 1.7 je sada izvezen i dostupan za upotrebu. Osim toga, sada koristi metodu "Core.Typeof(x)" umjesto "Bilo koji" u slučaju kada je oznaka tipa izostavljena za argument "x". Ovo je neophodno kako bi se osiguralo da se tipovi proslijeđeni kao argumenti ispravno obrađuju.
    • Omogućen izvoz funkcije "invokelatest" i makronaredbe "@invokelatest", uvedene u verziji 1.7.
  • Poboljšanja kompajlera/runtime
    • Značajno smanjeno vrijeme do prvog izvršenja (TTFX - Vrijeme do prvog izvršenja). Prethodno kompajliranje paketa sada pohranjuje izvorni kod u "pkgimage", što znači da kod generiran procesom prekompilacije neće biti potrebno ponovo kompajlirati nakon što se paket učita. Upotreba režima pkgimages može se onemogućiti pomoću opcije "--pkgimages=no".
    • Poznati problem kvadratne složenosti zaključivanja tipa je popravljen, a zaključivanje ukupno koristi manje memorije. Neki rubni slučajevi s automatski generiranim dugim funkcijama (kao što je ModelingToolkit.jl s parcijalnim diferencijalnim jednadžbama i velikim kauzalnim modelima) se kompiliraju mnogo brže.
    • Pozivi s argumentima bez konkretnih tipova sada mogu biti optimizirani za ubrizgavanje ili statičku rezoluciju, čak i ako postoji više različitih tipova kandidata za otpremu. Ovo može poboljšati performanse u određenim situacijama kada tipovi objekata nisu u potpunosti statički razriješeni, statičkim rješavanjem "@nospecialize-d" lokacija poziva i izbjegavanjem ponovnog kompiliranja.
    • Sve upotrebe makroa @pure u osnovnom modulu su zamijenjene sa Base.@assume_effects.
    • Pozivi za invoke(f, invokesig, args...) sa manje specifičnim tipovima od onih koji se obično koriste za f(args...) više ne uzrokuju ponovno kompajliranje paketa.
  • Promjene u opcijama komandne linije
    • Na Linuxu i Windowsu, opcija "--threads=auto" sada pokušava da odredi raspoloživi broj procesora na osnovu afiniteta CPU-a, maske koja se obično postavlja u HPC i cloud okruženjima.
    • Parametar “--math-mode=fast” je onemogućen, umjesto kojeg se preporučuje korištenje makronaredbe “@fastmath” koja ima jasno definiranu semantiku.
    • Opcija "--threads" je sada u formatu "auto | N[,auto|M]", gdje M označava broj interaktivnih niti za kreiranje (trenutno auto znači 1).
    • Dodata opcija “—heap-size-hint=” ", koji postavlja prag nakon kojeg počinje aktivno sakupljanje smeća. Veličina se može odrediti u bajtovima, kilobajtima (1000 KB), megabajtima (300 MB) ili gigabajtima (1,5 GB).
  • Promjene u višenitnosti
    • "Threads.@spawn" sada ima opcioni prvi argument sa vrijednošću ":default" ili ":interactive". Interaktivni zadatak zahtijeva malo kašnjenje odgovora i dizajniran je tako da bude kratak ili da se izvodi često. Interaktivni zadaci će se izvoditi na interaktivnim nitima ako su navedeni pri pokretanju Julije.
    • Niti koje se pokreću izvan Julia runtimea (kao što je iz C ili Java) sada mogu pozvati Julia kod koristeći "jl_adopt_thread". Ovo se dešava automatski kada unesete Julia kod preko "cfunction" ili "@ccallable" ulazne tačke. Kao posljedica toga, broj niti se sada može promijeniti tokom izvršavanja.
  • Nove funkcije biblioteke
    • Nova funkcija "Iterators.flatmap".
    • Nova funkcija "pkgversion(m::Module)" za dobivanje verzije paketa koji je učitao dati modul, slično kao "pkgdir(m::Module)".
    • Nova funkcija "stack(x)" koja generalizira "reduce(hcat, x::Vector{<:Vector})" na bilo koju dimenziju i dozvoljava bilo koji iterator iteratora. Metoda "stack(f, x)" generalizira "mapreduce(f, hcat, x)" i efikasnija je.
    • Novi makro za analizu dodijeljene memorije "@allocations", sličan "@allocated", osim što vraća broj dodijeljenih memorija, a ne ukupnu veličinu dodijeljene memorije.
  • Nove funkcije biblioteke
    • "RoundFromZero" sada radi za tipove koji nisu "BigFloat".
    • "Dict" se sada može ručno smanjiti pomoću "sizehint!"
    • "@time" sada posebno specificira procenat vremena utrošenog na ponovno kompajliranje nevažećih metoda.
  • Promjene u standardnoj biblioteci
    • Popravljen je problem istovremenosti u metodama iteracije za Dict i druge izvedene objekte kao što su ključevi(::Dict), vrijednosti(::Dict) i Set. Ove metode iteracije sada se mogu pozivati ​​na Dict ili Set paralelno za neograničen broj niti, sve dok nema radnji koje modificiraju rječnik ili skup.
    • Negiranje predikatske funkcije "!f" sada vraća složenu funkciju "(!) ∘ f" umjesto anonimne funkcije.
    • Funkcije odsječaka dimenzija sada rade na više dimenzija: "eachslice", "eachrow" i "eachcol" vraćaju objekt "Slices" koji omogućava dispečiranje radi pružanja efikasnijih metoda.
    • Dodan makro "@kwdef" javnom API-ju.
    • Rešen je problem sa redosledom operacija u "fld1".
    • Sortiranje je sada uvijek vremenski stabilno (QuickSort je redizajniran).
    • "Base.splat" je sada izvezen. Povratna vrijednost je tip "Base.Splat", a ne anonimna funkcija, što omogućava da se lijepo prikaže.
  • Package Manager
    • "Proširenja paketa": Podrška za učitavanje isječka koda iz drugih paketa učitanih u Julia sesiji. Aplikacija je slična paketu "Requires.jl", ali je podržana predkompilacija i kompatibilnost postavki.
  • LinearAlgebra Library
    • Zbog rizika od zabune sa podjelom po elementima, uklonjene su metode "a/b" i "b\a" sa skalarnim "a" i vektorom "b", koji su bili ekvivalentni "a * pinv(b)".
    • Pozivanje BLAS-a i LAPACK-a sada koristi "libblastrampoline (LBT)". OpenBLAS je osiguran po defaultu, ali izgradnja slike sistema sa drugim BLAS/LAPACK bibliotekama nije podržana. Umjesto toga, preporučuje se korištenje LBT mehanizma za zamjenu BLAS/LAPACK sa drugim postojećim skupom biblioteka.
    • "lu" podržava novu strategiju rotacije matrice, "RowNonZero()", koja bira prvi element rotacije koji nije nula za upotrebu sa novim aritmetičkim tipovima i za potrebe obuke.
    • "normalize(x, p=2)" sada podržava bilo koji normalizirani vektorski prostor "x", uključujući skalare.
    • Zadani broj BLAS niti je sada jednak broju CPU niti na ARM arhitekturi i polovini broja CPU niti na drugim arhitekturama.
  • Printf: Prerađene poruke o grešci za pogrešno formatirane stringove radi bolje čitljivosti.
  • Profil: Nova funkcija "Profile.take_heap_snapshot(file)", koja upisuje datoteku u JSON baziranom ".heapsnapshot" formatu koji je podržan u Chromeu.
  • Random: randn i randexp sada rade za bilo koji tip AbstractFloat koji definira rand.
  • ZAMJENA
    • Pritiskom na kombinaciju tipki "Alt-e" sada se otvara trenutni unos u editoru. Sadržaj (ako je izmijenjen) će se izvršiti kada izađete iz editora.
    • Trenutni kontekst modula aktivan u REPL-u može se promijeniti (po defaultu glavni) pomoću funkcije "REPL.activate(::Module)" ili unosom modula u REPL i pritiskom na kombinaciju tipki "Alt-m".
    • Režim "numerirane prompt", koji ispisuje brojeve za svaki ulaz i izlaz i pohranjuje postignute rezultate u Out, može se aktivirati korištenjem "REPL.numbered_prompt!()".
    • Dovršavanje kartice prikazuje dostupne argumente ključne riječi.
  • SuiteSparse: Premješten kod za "SuiteSparse" rješavač u "SparseArrays.jl". Rešači sada ponovo izvozi "SuiteSparse.jl".
  • SparseArrays
    • "SuiteSparse" rješavači su sada dostupni kao "SparseArrays" podmoduli.
    • UMFPACK i CHOLMOD načini zaštite niti su poboljšani eliminacijom globalnih varijabli i korištenjem zaključavanja. Višestruki "ldiv!" UMFPACK objekti se sada mogu bezbedno izvršavati.
    • Eksperimentalna funkcija "SparseArrays.allowscalar(::Bool)" omogućava vam da onemogućite ili omogućite skalarno indeksiranje rijetkih nizova. Ova funkcija je dizajnirana da otkrije nasumično skalarno indeksiranje "SparseMatrixCSC" objekata, što je uobičajen izvor problema s performansama.
  • Novi način rada bez greške za testne pakete koji rano prekida probno izvođenje u slučaju kvara ili greške. Postavite ili putem “@testset kwarg failfast=true” ili “export JULIA_TEST_FAILFAST=true”. Ovo je ponekad potrebno u CI izvo enjima za rano primanje poruka o greškama.
  • Datumi: Prazni nizovi se više ne raščlanjuju ispravno kao važeće vrijednosti "DateTime", "Dates" ili "Times" i umjesto toga bacaju "ArgumentError" u konstruktore i raščlanjuju, dok "tryparse" ne vraća ništa.
  • Package Distributed
    • Konfiguracija paketa (aktivni projekt, "LOAD_PATH", "DEPOT_PATH") se sada širi prilikom dodavanja lokalnih radnih procesa (npr. korištenjem "addprocs(N::Int)" ili korištenjem oznake komandne linije "--procs=N").
    • "addprocs" za lokalne radne procese sada prihvata argument pod nazivom "env" za prosljeđivanje varijabli okruženja radnim procesima.
  • Unicode: "graphemes(s, m:n)" vraća podniz od m-tog do n-og grafema u "s".
  • Paket DelimitedFiles je uklonjen iz sistemskih biblioteka i sada se distribuira kao poseban paket koji mora biti eksplicitno instaliran da bi se koristio.
  • Eksterne zavisnosti
    • U Linuxu se verzija sistemske biblioteke libstdc++ automatski otkriva i, ako je novija, učitava se. Staro ponašanje učitavanja ugrađenog u libstdc++, bez obzira na verziju sistema, može se vratiti postavljanjem varijable okruženja "JULIA_PROBE_LIBSTDCXX=0".
    • Uklonjeno je "RPATH" iz julia binarne datoteke, koja može pokvariti biblioteke na Linuxu koje ne mogu definirati varijablu "RUNPATH".
    • Poboljšanja alata: Izlaz "MethodError" i metoda (na primjer iz "methods(my_func)") je sada formatiran i obojen u skladu s principom izlaza metoda u tragu steka.

    izvor: opennet.ru

Dodajte komentar