Elérhető a Julia 1.8 programozási nyelv kiadása, amely olyan tulajdonságokat egyesít, 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.8-ban:
- Új nyelvi funkciók
- A változtatható struktúrák mezői mostantól konstansként annotálhatók, hogy megakadályozzák a változtatásukat, és lehetővé tegyék az optimalizálást.
- A globális változókhoz típusjegyzeteket lehet hozzáadni.
- Üres n-dimenziós tömbök hozhatók létre több pontosvesszővel szögletes zárójelben, például a "[;;;]" 0x0x0 tömböt hoz létre.
- A Try blokkokhoz immár opcionálisan lehet egy else blokk is, amely közvetlenül a törzs után fut le, ha nem történt hiba.
- Az @inline és a @noinline elhelyezhető egy függvénytörzsben, lehetővé téve anonim függvények megjegyzését.
- Az @inline és a @noinline mostantól alkalmazható egy függvényre egy hívási helyen vagy blokkban, hogy a megfelelő függvényhívásokat belefoglalják (vagy ne) kényszerítsék.
- ∀, ∃ és ∄ megengedett azonosító karakterként.
- Hozzáadott támogatás a Unicode 14.0.0 specifikációhoz.
- A Module(:name, false, false) metódussal olyan modult hozhatunk létre, amely nem tartalmaz neveket, nem importál Base-t vagy Core-t, és nem tartalmaz hivatkozást önmagára.
- Változások a nyelvben
- Az újonnan létrehozott Task objektumok (@spawn, @async stb.) létrehozásakor a szülő Task metódusaihoz rendelkeznek world_age értékkel, ami lehetővé teszi az optimalizált végrehajtást. Az előző aktiválási lehetőség a Base.invokelatest metódussal érhető el.
- A Unicode kiegyensúlyozatlan kétirányú formázási direktívák mostantól tilosak karakterláncokban és megjegyzésekben, hogy elkerüljék az injekciókat.
- A Base.ifelse ma már általános függvényként van definiálva, nem pedig beépített funkcióként, ami lehetővé teszi a csomagok számára, hogy kibővítsék a definícióját.
- Minden hozzárendelés egy globális változóhoz most először átmegy a convert(Any, x) vagy convert(T, x) híváson, ha a globális változó T típusúnak lett deklarálva. A globális változók használata előtt győződjön meg arról, hogy az invariáns convert(Any , x) === x mindig igaz, különben váratlan viselkedéshez vezethet.
- A beépített függvények ma már hasonlóak az általános függvényekhez, és metódusokkal programozottan felsorolhatók.
- Fordító/futásidejű fejlesztések
- A rendszerindítási idő körülbelül 25%-kal csökkent.
- Az LLVM-alapú fordító a futásidejű könyvtártól egy új, libjulia-codegen könyvtárba került. Alapértelmezés szerint be van töltve, így normál használat során nem kell változásnak lennie. Azokban a telepítésekben, amelyekhez nincs szükség fordítóra (például olyan rendszerképeknél, amelyekben az összes szükséges kód előre le van fordítva), ez a könyvtár (és LLVM-függősége) egyszerűen elhagyható.
- Most már lehetséges a feltételes típusú következtetés, ha argumentumot adunk át egy metódusnak. Például a Base.ifelse(isa(x, Int) esetén az x, 0) a ::Int értéket adja vissza, még akkor is, ha az x típusa ismeretlen.
- A SROA (Scalar Replacement of Aggregates) továbbfejlesztésre került: kiküszöböli a getfield hívásokat állandó globális mezőkkel, kiküszöböli az inicializálatlan mezőkkel rendelkező változó struktúrákat, javítja a teljesítményt és a beágyazott getfield hívások kezelését.
- A típuskövetkeztetés különféle hatásokat követ – a mellékhatásokat és a nem-ledobást. A rendszer figyelembe veszi az állandó terjedést, ami jelentősen javítja a fordítási idő teljesítményét. Egyes esetekben például a nem beilleszthető, de az eredményt nem befolyásoló függvények hívásait a rendszer futás közben elveti. Az effektusokra vonatkozó szabályok manuálisan felülírhatók a Base.@assume_effects makró használatával.
- Az előfordítás (explicit előfordítási direktívákkal vagy meghatározott munkaterhelésekkel) most több típus-definiált kódot ment el, ami gyorsabb első végrehajtást eredményez. Bármely új metódus/típus kombináció, amelyre a csomagodnak szüksége van, függetlenül attól, hogy ezeket a metódusokat hol definiálták, most gyorsítótárazhatóak az előfordítási fájlban, ha a csomagodhoz tartozó metódus hívja meg őket.
- Változások a parancssori beállításokban
- A @inbounds deklarációk figyelésének alapértelmezett viselkedése a "--check-bounds=yes|no|auto" automatikus beállítása.
- Az új "--strip-metadata" beállítás a docstringek, a forráshely információi és a helyi változónevek eltávolításához rendszerkép létrehozásakor.
- Az új "--strip-ir" opció lehetővé teszi a fordító számára, hogy eltávolítsa a közbenső forráskód-ábrázolást a rendszerkép összeállításakor. Az eredményül kapott kép csak akkor fog működni, ha a "--compile=all" kifejezést használja, vagy ha az összes szükséges kód előre le van fordítva.
- Ha a fájlnév helyett a "-" karaktert adjuk meg, akkor a végrehajtható kód a szabványos bemeneti adatfolyamból kerül kiolvasásra.
- Változások a többszálú támogatásban
- A Threads.@threads alapértelmezés szerint az új :dynamic ütemezési beállítást használja, amely abban különbözik az előző módtól, hogy az iterációkat a rendszer dinamikusan ütemezi a rendelkezésre álló munkaszálakon, ahelyett, hogy az egyes szálakhoz lenne hozzárendelve. Ez a mód lehetővé teszi a beágyazott hurkok jobb elosztását @spawn és @threads segítségével.
- Új könyvtári funkciók
- everysplit(str) a split(str) többszöri végrehajtásához.
- allequal(itr) annak tesztelésére, hogy egy iterátor minden eleme egyenlő-e.
- hardlink(src, dst) használható kemény hivatkozások létrehozására.
- setcpuaffinity(cmd, cpus) segítségével beállíthatja a processzormag affinitását az elindított folyamatokhoz.
- diskstat(path=pwd()) a lemezstatisztikák lekéréséhez.
- Új @showtime makró a kiértékelt sor és a @time jelentés megjelenítéséhez.
- A LazyString és a lazy"str" makró hozzáadásra került, hogy támogassák a hibaüzenetek lusta létrehozását a hibaútvonalakban.
- Kijavítottuk a Dict és más származtatott objektumok, például a kulcsok (::Dict), értékek (::Dict) és Set egyidejűségi problémáját. Az iterációs módszerek mostantól meghívhatók egy szótárban vagy halmazban, mindaddig, amíg nincsenek olyan hívások, amelyek módosítják a szótárt vagy halmazt.
- A @time és a @timev opcionális leírással rendelkezik, amely lehetővé teszi például az időjelentések forrásának megjegyzését. @time "Foo értékelése" foo().
- A tartomány egyetlen kulcsszó argumentumaként a stopot vagy a hosszúságot veszi fel.
- A precision és a setprecision mostantól elfogadja a bázist kulcsszóként
- A TCP socket objektumok most már bezárási módszert biztosítanak, és támogatják a félig nyitott mód használatát.
- Az extrema most elfogad egy init argumentumot.
- Az Iterators.countfrom minden olyan típust elfogad, amely + metódusokat határoz meg.
- A @time most lefoglalja a módosult típusok újrafordítására fordított idő %-át.
- Szabványos könyvtári változások
- A Semmi értékkel rendelkező kulcsok most eltávolításra kerülnek a környezetből az addenv-ben.
- Az Iterators.reverse (és ezért az utolsó) minden sort támogatja.
- A hosszfüggvény bizonyos típusú tartományok esetében már nem ellenőrzi az egész számok túlcsordulását. Elérhető egy új függvény, a checked_length, amely bitátvitel vezérlő logikát tartalmaz. Ha szükséges, használja a SaferIntegers.jl fájlt a tartománytípus létrehozásához.
- Az Iterators.Reverse iterátor minden indexfordítást megvalósít, ha lehetséges.
- Csomagkezelő
- Új ⌃ és ⌅ jelzők a „pkg>” állapotú csomagok mellett, amelyekhez új verziók érhetők el. ⌅ azt jelzi, hogy az új verziók nem telepíthetők.
- Új elavult::Bool argumentum a Pkg.statushoz (--outdated vagy -o REPL módban), hogy információkat jelenítsen meg a korábbi verziók csomagjairól.
- Új compat::Bool argumentum a Pkg.statushoz (--compat vagy -c REPL módban) a Project.toml összes [compat] bejegyzésének megjelenítéséhez.
- Új "pkg>compat" (és Pkg.compat) mód a projektkompatibilitási bejegyzések beállításához. Interaktív szerkesztőt biztosít a "pkg>compat"-on keresztül, vagy közvetlen rekordvezérlést a "pkg>Foo 0.4,0.5"-en keresztül, amely képes betölteni az aktuális rekordokat a lap kitöltésével. Vagyis "pkg> compat Fo " automatikusan "pkg>Foo 0.4,0.5"-re frissül, hogy lehetővé tegye egy meglévő bejegyzés szerkesztését.
- A Pkg mostantól csak akkor próbál meg csomagokat letölteni egy csomagkiszolgálóról, ha a kiszolgáló figyeli a csomagot tartalmazó rendszerleíró adatbázist.
- A Pkg.instantiate most figyelmeztetést ad ki, ha a Project.toml nincs szinkronban a Manifest.toml fájllal. Ezt a projekt deps- és kompat-rekordjainak hash-je alapján teszi a jegyzékben a feloldáskor, így a Project.toml-deps- vagy kompat-rekordok minden változása újrafeloldás nélkül észlelhető.
- Ha a "pkg>add" nem talál egy adott nevű csomagot, akkor hasonló nevű csomagokat javasol, amelyek hozzáadhatók.
- A jegyzékben tárolt julia verzió már nem tartalmazza a buildszámot, ami azt jelenti, hogy a master mostantól 1.9.0-DEV lesz.
- A teszt megszakítása "pkg>" mostantól következetesebben észlelhető, és megfelelően visszakerül a REPL-be.
- InteractiveUtils
- Az új @time_imports makró a csomagok és függőségeik importálására fordított idő jelentésére szolgál, kiemelve a fordítási és újrafordítási időt az importálás százalékában.
- Lineáris algebra
- A BLAS almodul mostantól támogatja a 2. szintű BLAS spr!-funkciókat.
- A LinearAlgebra.jl szabványos könyvtár most már teljesen független a SparseArrays.jl-től, mind forráskód, mind egységtesztelés szempontjából. Ennek következtében a ritka tömbök többé nem adják vissza (implicit módon) a LinearAlgebra Base vagy LinearAlgebra objektumokra alkalmazott metódusai. Ez különösen a következő törési változásokhoz vezet:
- A speciális "ritka" mátrixokat (pl. átlós) használó összefűzések most sűrű mátrixokat adnak vissza; Ennek következtében a getproperty hívások által létrehozott SVD objektumok D1 és D2 mezői ma már sűrű mátrixok.
- A hasonló(::SpecialSparseMatrix, ::Type, ::Dims) metódus sűrű nullmátrixot ad vissza. Következésképpen a két-, három- és szimmetrikus tridiagonális mátrixok egymással való szorzatai sűrű mátrix keletkezéséhez vezetnek. Ezenkívül a (nem statikus) mátrixok speciális "ritka" mátrixaiból három argumentummal hasonló mátrixok létrehozása most meghiúsul a "zero(::Type{Matrix{T}})" miatt.
- Printf
- %s és %c most a textwidd argumentumot használja a szélesség formázásához.
- profil
- A CPU terhelési profilja mostantól metaadatokat rögzít, beleértve a szálakat és a feladatokat. A Profile.print() rendelkezik egy új groupby argumentummal, amely lehetővé teszi szálak, feladatok vagy részszálak/feladatok, feladatok/szálak, valamint szálak és feladatok argumentumainak csoportosítását a szűrés érdekében. Ezen túlmenően a kihasználtság százalékos aránya mostantól vagy összességében, vagy szálanként jelenik meg, attól függően, hogy a szál tétlen-e vagy sem az egyes mintákban. A Profile.fetch() alapértelmezés szerint tartalmazza az új metaadatokat. A profilozási adatok külső fogyasztóival való visszamenőleges kompatibilitás érdekében az include_meta=false átadásával kizárható.
- Az új Profile.Allocs modul lehetővé teszi a memóriafoglalások profilozását. Az egyes memóriafoglalások típusának és méretének veremnyomkövetése rögzítésre kerül, és a sample_rate argumentum lehetővé teszi konfigurálható számú lefoglalás átugrását, csökkentve ezzel a teljesítmény többletköltségét.
- A rögzített időtartamú CPU-profilozást a felhasználó futtathatja a feladatok futása közben anélkül, hogy először betöltené a profilt, és a jelentés futás közben jelenik meg. MacOS és FreeBSD rendszeren nyomja meg a ctrl-t billentyűt, vagy hívja a SIGINFO-t. Más platformokon aktiválja a SIGUSR1-et, pl. % kill -USR1 $julia_pid. Ez nem érhető el Windows rendszeren.
- REPL
- A RadioMenu mostantól további billentyűparancsokat is támogat az opciók közvetlen kiválasztásához.
- A "?(x, y" sorozat, majd a TAB lenyomása megjeleníti az összes, x, y, ... argumentumokkal meghívható metódust. (A bevezető szóköz megakadályozza a súgó módba lépést.) "MyModule.?(x, y " a keresést a "MyModule"-ra korlátozza. A TAB billentyű lenyomásához legalább egy argumentumnak specifikusabbnak kell lennie, mint az Any. Vagy használja a SHIFT-TAB billentyűt a TAB helyett, hogy engedélyezze a kompatibilis metódusokat.
- Az új err globális változó lehetővé teszi a legújabb kivétel lekérését, hasonlóan az ans viselkedéséhez az utolsó választ. Az err beírása újranyomtatja a kivételinformációkat.
- SparseArrays
- Áthelyezte a SparseArrays kódot a Julia lerakatból a külső SparseArrays.jl tárba.
- Az új összefűzési függvények sparse_hcat, sparse_vcat és sparse_hvcat egy SparseMatrixCSC típust adnak vissza, függetlenül a bemeneti argumentumok típusától. Ez a LinearAlgebra.jl és a SparseArrays.jl kódok szétválasztása után vált szükségessé a mátrixok ragasztási mechanizmusának egységesítéséhez.
- Fakitermelés
- A BelowMinLevel, Debug, Info, Warn, Error és AboveMaxLevel szabványos naplózási szintek most exportálva vannak a szabványos naplózási könyvtárból.
- Unicode
- Hozzáadott isequal_normalized függvény a Unicode egyenértékűségének ellenőrzéséhez anélkül, hogy kifejezetten normalizált karakterláncokat szerkesztene.
- A Unicode.normalize függvény most már elfogadja a charttransform kulcsszót, amellyel egyéni karakterleképezéseket lehet biztosítani, és a Unicode.julia_chartransform függvény is rendelkezésre áll a Julia elemző azonosítók normalizálása során használt leképezés reprodukálására.
- Teszt
- A '@test_throws "some message" triggers_error()' most már használható annak tesztelésére, hogy a megjelenített hibaszöveg tartalmaz-e "valamilyen üzenet" hibát, függetlenül az adott kivételtípustól. A reguláris kifejezések, karakterlánc-listák és megfelelő függvények szintén támogatottak.
- A @testset foo() most már használható tesztkészlet létrehozására egy adott függvényből. A teszteset neve a meghívott függvény neve. A meghívott függvény tartalmazhat @test és más @testset definíciókat, beleértve más függvények hívásait is, miközben rögzíti az összes köztes teszteredményt.
- A TestLogger és a LogRecord most exportálva van a szabványos tesztkönyvtárból.
- Megosztott
- Az SSHManager mostantól támogatja a csh/tcsh burkolóval ellátott munkaszálakat az addprocs() metóduson és a shell=:csh paraméteren keresztül.
- Egyéb változások
- A GC.enable_logging(true) segítségével minden szemétgyűjtési művelet naplózható az összegyűjtött memória idejével és mennyiségével.
Forrás: opennet.ru