Julia 1.9 programozási nyelv elérhető

Megjelent a Julia 1.9 programozási nyelv kiadása, amely olyan tulajdonságokat ötvöz, mint a nagy teljesítmény, a dinamikus gépelés támogatása és a párhuzamos programozás beépített eszközei. Julia szintaxisa közel áll a MATLAB-hoz, néhány elemet a Rubytól és a Lisp-től kölcsönzött. A karakterlánc-manipulációs módszer a Perl-re emlékeztet. A projekt kódját az MIT licence alatt terjesztik.

A nyelv főbb jellemzői:

  • Nagy teljesítmény: a projekt egyik kiemelt célja a C programokhoz közeli teljesítmény elérése. A Julia fordító az LLVM projekt munkáján alapul, és hatékony natív gépi kódot generál számos célplatformhoz;
  • Támogatja a különféle programozási paradigmákat, beleértve az objektumorientált és funkcionális programozás elemeit. A szabványos könyvtár többek között funkciókat biztosít az aszinkron I/O-hoz, folyamatvezérléshez, naplózáshoz, profilalkotáshoz és csomagkezeléshez;
  • Dinamikus gépelés: a nyelv nem követeli meg a változók típusának kifejezett meghatározását, hasonlóan a szkript programozási nyelvekhez. Interaktív mód támogatott;
  • Opcionális lehetőség a típusok explicit megadására;
  • Ideális szintaxis numerikus számításokhoz, tudományos számításokhoz, gépi tanuláshoz és adatvizualizációhoz. Számos numerikus adattípus támogatása és a számítások párhuzamosítására szolgáló eszköz.
  • Funkciók közvetlen meghívása C-könyvtárakból további rétegek nélkül.

Főbb változások a Julia 1.9-ben:

  • Új nyelvi funkciók
    • Lehetővé teszi hozzárendelések elvégzését egy másik modulban a "setproperty!(::Module, ::Symbol, x)" használatával.
    • Több, a végső pozícióban nem szereplő feladat megengedett. Például az „a, b…, c = 1, 2, 3, 4” karakterlánc feldolgozása „a = 1; b… = 2, 3; c = 4". Ezt a Base.split_rest segítségével kezeljük.
    • Az egykarakteres literálok mostantól ugyanazt a szintaxist támogatják, mint a karakterlánc-literálok; azok. A szintaxis érvénytelen UTF-8 szekvenciákat jelenthet, amint azt a Char típus lehetővé teszi.
    • Hozzáadott támogatás a Unicode 15 specifikációhoz.
    • A sorok beágyazott kombinációi és az elnevezett karaktersorok mostantól használhatók típusparaméterként.
    • Új beépített függvények "getglobal(::Module, ::Symbol[, order])" és "setglobal!(::Module, ::Symbol, x[, order])" kizárólag globális változók olvasására és írására. A getglobal metódust most előnyben kell részesíteni a getfield metódussal szemben a globális változók eléréséhez.
  • Változások a nyelvben
    • Az 1.7-es verzióban bevezetett "@invoke" makró már exportálva van, és használható. Ezenkívül most a "Core.Typeof(x)" metódust használja az "Any" helyett abban az esetben, ha az "x" argumentum típusannotációja kimaradt. Erre azért van szükség, hogy az argumentumként átadott típusokat megfelelően feldolgozzák.
    • Az 1.7-es verzióban bevezetett "invokelatest" függvény és a "@invokelatest" makró exportálása engedélyezett.
  • Fordító/futásidejű fejlesztések
    • Jelentősen lerövidült az első végrehajtásig eltelt idő (TTFX – Az első végrehajtásig eltelt idő). Egy csomag előfordítása a natív kódot a "pkgimage"-ben tárolja, ami azt jelenti, hogy az előfordítási folyamat által generált kódot nem kell újrafordítani a csomag betöltése után. A pkgimages mód használata a "--pkgimages=no" opcióval letiltható.
    • A típuskövetkeztetés ismert kvadratikus összetettségi problémája kijavításra került, és a következtetés összességében kevesebb memóriát használ. Néhány éles eset, amely automatikusan generált hosszú függvényeket tartalmaz (mint például a ModelingToolkit.jl parciális differenciálegyenletekkel és nagy oksági modellekkel), sokkal gyorsabban fordítható le.
    • A konkrét típusok nélküli argumentumokat tartalmazó hívások mostantól befecskendezésre vagy statikus felbontásra optimalizálva uniós felosztásúak lehetnek, még akkor is, ha több különböző típusú jelölt van elküldésre. Ez javíthatja a teljesítményt bizonyos helyzetekben, amikor az objektumtípusok statikusan nincsenek teljesen feloldva, a "@nospecialize-d" hívási helyek statikus feloldásával és az újrafordítás elkerülésével.
    • A Base modulban a @pure makró minden felhasználását a Base.@assume_effects helyettesítette.
    • Az invoke(f, invokesig, args...) hívások, amelyek kevésbé specifikusak, mint általában az f(args...) esetén, már nem okozzák a csomag újrafordítását.
  • Változások a parancssori beállításokban
    • Linuxon és Windowson a "--threads=auto" opció most megpróbálja meghatározni a processzorok elérhető számát a CPU-affinitás alapján, amely maszk általában HPC- és felhőkörnyezetekben van beállítva.
    • A „--math-mode=fast” paraméter le van tiltva, helyette javasolt a „@fastmath” makrót használni, amely egyértelműen meghatározott szemantikával rendelkezik.
    • A "--threads" opció mostantól "auto | N[,auto|M]", ahol M a létrehozandó interaktív szálak számát jelzi (jelenleg az auto 1-et jelent).
    • „—heap-size-hint=” opció hozzáadva ", amely beállítja azt a küszöböt, amely után megkezdődik az aktív szemétszállítás. A méret megadható bájtban, kilobájtban (1000 KB), megabájtban (300 MB) vagy gigabájtban (1,5 GB).
  • Változások a többszálú kezelésben
    • A "Threads.@spawn" most már rendelkezik egy opcionális első argumentummal, amelynek értéke ":default" vagy ":interactive". Az interaktív feladatok alacsony válaszadási késleltetést igényelnek, és rövidre vagy gyakran végrehajtottra tervezték. Az interaktív feladatok interaktív szálakon futnak, ha a Julia indításakor meg vannak adva.
    • A Julia futási környezeten kívül futó szálak (például C-ből vagy Java-ból) mostantól a „jl_adopt_thread” használatával hívhatják meg a Julia kódot. Ez automatikusan megtörténik, amikor a Julia kódot a "cfunction" vagy a "@ccallable" belépési ponton keresztül írja be. Ennek eredményeként a szálak száma változhat a végrehajtás során.
  • Új könyvtári funkciók
    • Új funkció "Iterators.flatmap".
    • Az új "pkgversion(m::Module)" függvény az adott modult betöltött csomag verziójának lekéréséhez, hasonlóan a "pkgdir(m::Module)"-hoz.
    • Új "stack(x)" függvény, amely általánosítja a "reduce(hcat, x::Vector{<:Vector})" függvényt bármely dimenzióra, és lehetővé teszi az iterátorok bármely iterátorát. A "stack(f, x)" módszer általánosítja a "mapreduce(f, hcat, x)"-t, és hatékonyabb.
    • Új makró a lefoglalt memória "@allocations" elemzéséhez, hasonlóan a "@allocated"-hez, kivéve, hogy a memóriafoglalások számát adja vissza, nem pedig a lefoglalt memória teljes méretét.
  • Új könyvtári funkciók
    • A „RoundFromZero” mostantól a „BigFloat”-tól eltérő típusokhoz is használható.
    • A "Dict" mostantól manuálisan is csökkenthető a "sizehint!"
    • A „@time” mostantól külön határozza meg az érvénytelen metódusok újrafordítására fordított idő százalékos arányát.
  • Változások a szabványos könyvtárban
    • Javítva a párhuzamossági probléma a Dict és más származtatott objektumok iterációs módszereiben, mint például a kulcsok (::Dict), értékek (::Dict) és Set. Ezek az iterációs metódusok mostantól párhuzamosan hívhatók egy Dict-en vagy Set-en korlátlan számú szálon keresztül, mindaddig, amíg nincsenek olyan műveletek, amelyek módosítják a szótárt vagy a halmazt.
    • Egy "!f" predikátumfüggvény tagadása most egy "(!) ∘ f" összetett függvényt ad vissza anonim függvény helyett.
    • A dimenziós szelet függvények mostantól több dimenzióban is működnek: az "eachslice", "eachrow" és "eachcol" egy "Slices" objektumot ad vissza, amely lehetővé teszi a feladást a hatékonyabb módszerek biztosítása érdekében.
    • Hozzáadtuk a „@kwdef” makrót a nyilvános API-hoz.
    • Kijavítottuk a műveletek sorrendjével kapcsolatos hibát az "fld1"-ben.
    • A rendezés mostantól mindig időstabil (a QuickSort újratervezésre került).
    • A „Base.splat” most exportálva van. A visszatérési érték "Base.Splat" típusú, nem pedig anonim függvény, ami lehetővé teszi a szép kimenetet.
  • Csomagkezelő
    • "Csomagbővítmények": A Julia munkamenetben betöltött más csomagokból származó kódrészlet betöltésének támogatása. Az alkalmazás hasonló a „Requires.jl” csomaghoz, de az előzetes fordítás és a beállítások kompatibilitása támogatott.
  • LineárisAlgebra Könyvtár
    • Az elemenkénti osztással való összetéveszthetőség miatt eltávolította az "a" és "b\a" skalárt és "b" vektort tartalmazó "a/b" és "b\a" metódusokat, amelyek egyenértékűek az "a * pinv(b)"-vel.
    • A BLAS és a LAPACK hívása mostantól "libblastrampoline (LBT)"-t használ. Az OpenBLAS alapértelmezés szerint rendelkezésre áll, de a rendszerkép más BLAS/LAPACK könyvtárakkal való felépítése nem támogatott. Ehelyett javasolt az LBT-mechanizmus használata a BLAS/LAPACK lecserélésére egy másik meglévő könyvtárkészlettel.
    • A "lu" egy új mátrixforgatási stratégiát, a "RowNonZero()"-t támogatja, amely kiválasztja az első nem nulla elforgatási elemet az új aritmetikai típusokhoz és képzési célokra.
    • A "normalize(x, p=2)" mostantól minden normalizált "x" vektorteret támogat, beleértve a skalárokat is.
    • A BLAS-szálak alapértelmezett száma most megegyezik az ARM-architektúrák CPU-szálainak számával, más architektúrákon pedig a CPU-szálak számának felével.
  • Printf: Átdolgozott hibaüzenetek a helytelenül formázott karakterláncokhoz a jobb olvashatóság érdekében.
  • Profil: Új „Profile.take_heap_snapshot(file)” funkció, amely a Chrome-ban támogatott JSON-alapú „.heapsnapshot” formátumú fájlt ír.
  • Véletlenszerű: a randn és a randexp mostantól minden rand-ot definiáló AbstractFloat típushoz használható.
  • REPL
    • Az "Alt-e" billentyűkombináció megnyomásával megnyílik az aktuális bevitel a szerkesztőben. A tartalom (ha módosítva) a szerkesztőből való kilépéskor végrehajtódik.
    • A REPL-ben aktív aktuális modulkontextus megváltoztatható (alapértelmezetten Main) a "REPL.activate(::Module)" funkcióval, vagy a modul REPL-ben történő megadásával és az "Alt-m" billentyűkombináció megnyomásával.
    • A "számozott prompt" mód, amely minden bemenethez és kimenethez számokat nyomtat, és a pontozott eredményeket Out-ban tárolja, a "REPL.numbered_prompt!()" segítségével aktiválható.
    • A tabulátor befejezése megjeleníti az elérhető kulcsszóargumentumokat.
  • SuiteSparse: A „SuiteSparse” megoldó kódja áthelyezve a „SparseArrays.jl” mappába. A megoldásokat most a "SuiteSparse.jl" újraexportálja.
  • SparseArrays
    • A „SuiteSparse” megoldók mostantól „SparseArrays” almodulként érhetők el.
    • Az UMFPACK és a CHOLMOD szálvédelmi módokat a globális változók kiiktatásával és a zárak használatával javították. Többszálú "ldiv!" Az UMFPACK objektumok mostantól biztonságosan végrehajthatók.
    • A "SparseArrays.allowscalar(::Bool)" kísérleti függvény lehetővé teszi a ritka tömbök skaláris indexelésének letiltását vagy engedélyezését. Ez a funkció a "SparseMatrixCSC" objektumok véletlenszerű skaláris indexelésének észlelésére szolgál, ami a teljesítményproblémák gyakori forrása.
  • Új hibabiztos mód a tesztcsomagokhoz, amely hiba vagy hiba esetén korán leállítja a tesztfutást. Állítsa be a következővel: „@testset kwarg failfast=true” vagy „export JULIA_TEST_FAILFAST=true”. Ez néha szükséges a CI-futtatások során, hogy a hibaüzeneteket korán megkapja.
  • Dátumok: Az üres karakterláncok többé nem értelmezhetők hibásan érvényes "DateTime", "Dates" vagy "Times" értékként, hanem "ArgumentError"-t dobnak a konstruktorokba és az elemzésbe, míg a "tryparse" nem ad vissza semmit.
  • Kiosztott csomag
    • A csomagkonfiguráció (aktív projekt, "LOAD_PATH", "DEPOT_PATH") most terjesztésre kerül a helyi munkavégző folyamatok hozzáadásakor (például az "addprocs(N::Int)" használatával vagy a "--procs=N" parancssori jelzővel.
    • Az "addprocs" a helyi dolgozói folyamatokhoz mostantól elfogad egy "env" argumentumot a környezeti változók munkafolyamatoknak való átadásához.
  • Unicode: "graphemes(s, m:n)" az m-ediktől az n-edik grafémig terjedő részstringet adja vissza "s"-ben.
  • A DelimedFiles csomagot eltávolították a rendszerkönyvtárakból, és külön csomagként terjesztik, amelyet kifejezetten telepíteni kell a használathoz.
  • Külső függőségek
    • Linux alatt a rendszer automatikusan felismeri a libstdc++ rendszerkönyvtár verzióját, és ha újabb, akkor betölti. A régi libstdc++ beépített betöltési viselkedés a rendszer verziójától függetlenül visszaállítható a "JULIA_PROBE_LIBSTDCXX=0" környezeti változó beállításával.
    • Eltávolítottuk az „RPATH” elemet a julia binárisból, ami megtörheti azokat a Linux könyvtárakat, amelyek nem definiálják a „RUNPATH” változót.
    • Eszközfejlesztések: A "MethodError" és a metódusok kimenete (például a "methods(my_func)"-ból) mostantól a metódusok veremnyomban történő kimeneti elvének megfelelően formázva és színezett.

    Forrás: opennet.ru

Hozzászólás