A Julia 1.8 programozási nyelv kiadása

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

Hozzászólás