Publikimi i gjuhës programuese Julia 1.8

Lëshimi i gjuhës së programimit Julia 1.8 është i disponueshëm, duke kombinuar cilësi të tilla si performanca e lartë, mbështetje për shtypjen dinamike dhe mjete të integruara për programim paralel. Sintaksa e Julia është afër MATLAB, duke huazuar disa elemente nga Ruby dhe Lisp. Metoda e manipulimit të vargut të kujton Perl. Kodi i projektit shpërndahet nën licencën MIT.

Karakteristikat kryesore të gjuhës:

  • Performanca e lartë: një nga qëllimet kryesore të projektit është arritja e performancës afër programeve C. Përpiluesi Julia bazohet në punën e projektit LLVM dhe gjeneron kod efikas të makinës vendase për shumë platforma të synuara;
  • Mbështet paradigma të ndryshme programimi, duke përfshirë elementë të programimit të orientuar drejt objektit dhe funksional. Biblioteka standarde ofron, ndër të tjera, funksione për hyrje/dalje asinkrone, kontrollin e procesit, regjistrimin, profilizimin dhe menaxhimin e paketave;
  • Shtypja dinamike: gjuha nuk kërkon përcaktim të qartë të llojeve për variabla, të ngjashëm me gjuhët e programimit të skriptimit. Mbështetja e modalitetit interaktiv;
  • Aftësia opsionale për të specifikuar në mënyrë eksplicite llojet;
  • Një sintaksë ideale për llogaritjen numerike, llogaritjen shkencore, mësimin e makinerive dhe vizualizimin e të dhënave. Mbështetje për shumë lloje të të dhënave numerike dhe mjete për paralelizimin e llogaritjeve.
  • Aftësia për të thirrur drejtpërdrejt funksionet nga bibliotekat C pa shtresa shtesë.

Ndryshime të mëdha në Julia 1.8:

  • Karakteristikat e reja të gjuhës
    • Fushat e një strukture të ndryshueshme tani mund të shënohen si konstante për të parandaluar ndryshimin e tyre dhe për të lejuar optimizimin.
    • Shënimet e tipit mund të shtohen në variablat globale.
    • Vargje të zbrazëta n-dimensionale mund të krijohen duke përdorur pikëpresje të shumta brenda kllapave katrore, për shembull "[;;;]" krijon një grup 0x0x0.
    • Try blloqet tani mund të kenë opsionalisht një tjetër bllok, i cili ekzekutohet menjëherë pas trupit kryesor nëse nuk janë hedhur gabime.
    • @inline dhe @noinline mund të vendosen brenda një trupi funksioni, duke ju lejuar të shënoni një funksion anonim.
    • @inline dhe @noinline tani mund të aplikohen në një funksion në një sajt ose bllok thirrjesh për të detyruar thirrjet e funksioneve përkatëse të përfshihen (ose të mos përfshihen).
    • ∀, ∃ dhe ∄ lejohen si karaktere identifikuese.
    • Mbështetje e shtuar për specifikimet Unicode 14.0.0.
    • Metoda Module(:name, false, false) mund të përdoret për të krijuar një modul që nuk përmban emra, nuk importon bazën ose bërthamën dhe nuk përmban referencë për veten.
  • Ndryshimet në gjuhë
    • Objektet e detyrave të krijuara rishtazi (@spawn, @async, etj.) tani kanë moshën_botërore për metodat nga detyra mëmë kur krijohen, duke lejuar ekzekutimin e optimizuar. Opsioni i mëparshëm i aktivizimit është i disponueshëm duke përdorur metodën Base.invokelatest.
    • Direktivat e formatimit dydrejtimësh të pabalancuar të Unicode tani janë të ndaluara në vargje dhe komente për të shmangur injeksionet.
    • Base.ifelse tani përkufizohet si një funksion gjenerik dhe jo si një element i integruar, duke lejuar paketat të zgjerojnë përkufizimin e tij.
    • Çdo caktim për një ndryshore globale tani kalon fillimisht përmes një thirrjeje për konvertim (Any, x) ose konvertim (T, x) nëse ndryshorja globale është deklaruar të jetë e tipit T. Përpara se të përdorni variablat globale, sigurohuni që konvertimi invariant (Çdo , x) === x është gjithmonë e vërtetë, përndryshe mund të çojë në sjellje të papritur.
    • Funksionet e integruara tani janë të ngjashme me funksionet gjenerike dhe mund të numërohen programatikisht duke përdorur metoda.
  • Përmirësimet e përpiluesit/kohës së ekzekutimit
    • Koha e nisjes është zvogëluar me rreth 25%.
    • Përpiluesi i bazuar në LLVM është ndarë nga biblioteka e kohës së ekzekutimit në një bibliotekë të re, libjulia-codegen. Ai është i ngarkuar si parazgjedhje, kështu që nuk duhet të ketë ndryshime gjatë përdorimit normal. Në vendosjet që nuk kanë nevojë për një përpilues (për shembull, imazhet e sistemit në të cilat është parapërpiluar i gjithë kodi i nevojshëm), kjo bibliotekë (dhe varësia e saj LLVM) thjesht mund të hiqet.
    • Konkludimi i tipit të kushtëzuar tani është i mundur duke kaluar një argument në një metodë. Për shembull, për Base.ifelse(isa(x, Int), x, 0) kthen ::Int edhe nëse lloji i x është i panjohur.
    • SROA (Zëvendësimi Scalar i Agregateve) është përmirësuar: eliminon thirrjet getfield me fusha globale të vazhdueshme, eliminon strukturat e ndryshueshme me fusha të painitializuara, përmirëson performancën dhe trajtimin e thirrjeve getfield të ndërlidhura.
    • Konkluzionet e tipit gjurmojnë efekte të ndryshme—efekte anësore dhe mos rënie. Është marrë parasysh përhapja e vazhdueshme, gjë që përmirëson ndjeshëm performancën në kohën e përpilimit. Në disa raste, për shembull, thirrjet për funksione që nuk mund të futen në linjë, por që nuk ndikojnë në rezultat, do të hidhen poshtë në kohën e ekzekutimit. Rregullat për efektet mund të mbishkruhen manualisht duke përdorur makro Base.@assume_effects.
    • Përpilimi paraprak (me direktiva të qarta parapërpilimi ose ngarkesa të caktuara pune) tani ruan më shumë kode të përcaktuara nga lloji, duke rezultuar në ekzekutim më të shpejtë për herë të parë. Çdo kombinim i ri/lloji i nevojshëm nga paketa juaj, pavarësisht se ku janë përcaktuar ato metoda, tani mund të ruhet në skedarin e parapërpilimit nëse thirren nga një metodë që i përket paketës suaj.
  • Ndryshimet në opsionet e linjës së komandës
    • Sjellja e parazgjedhur për monitorimin e deklaratave @inbounds tani është opsioni automatik në "--check-bounds=yes|jo|auto".
    • Opsioni i ri "--strip-metadata" për të hequr vargjet e dokumenteve, informacionin e vendndodhjes së burimit dhe emrat e ndryshoreve lokale kur krijoni një imazh të sistemit.
    • Opsioni i ri "--strip-ir" për të lejuar përpiluesin të heqë paraqitjen e ndërmjetme të kodit burimor kur ndërton imazhin e sistemit. Imazhi që rezulton do të funksionojë vetëm nëse përdoret "--compile=all" ose nëse i gjithë kodi i kërkuar është i para-përpiluar.
    • Nëse karakteri "-" është specifikuar në vend të emrit të skedarit, atëherë kodi i ekzekutueshëm lexohet nga rrjedha standarde e hyrjes.
  • Ndryshimet e mbështetjes multithreading
    • Threads.@threads si parazgjedhje përdor opsionin e ri të planifikimit :dynamic, i cili ndryshon nga modaliteti i mëparshëm në atë që përsëritjet do të planifikohen në mënyrë dinamike nëpër temat e disponueshme të punëtorit në vend që t'i caktohen çdo thread. Ky modalitet lejon shpërndarje më të mirë të sytheve të mbivendosur me @spawn dhe @threads.
  • Funksionet e reja të bibliotekës
    • everysplit(str) për të ekzekutuar split(str) disa herë.
    • allequal(itr) për të testuar nëse të gjithë elementët në një përsëritës janë të barabartë.
    • hardlink (src, dst) mund të përdoret për të krijuar lidhje të forta.
    • setcpuaffinity(cmd, cpus) për të vendosur afinitetin e bërthamës së procesorit me proceset e nisura.
    • diskstat(path=pwd()) për të marrë statistikat e diskut.
    • Makro e re @showtime për të shfaqur linjën që vlerësohet dhe raportin @time.
    • LazyString dhe lazy"str" ​​makro janë shtuar për të mbështetur ndërtimin dembel të mesazheve të gabimit në shtigjet e gabimit.
    • Rregulloi një problem të konkurencës në Dict dhe objekte të tjera të prejardhura si çelësat(::Dict), vlerat(::Dict) dhe Set. Metodat e përsëritjes tani mund të thirren në një fjalor ose grup, për sa kohë që nuk ka thirrje që modifikojnë fjalorin ose grupin.
    • @time dhe @timev tani kanë një përshkrim opsional, duke ju lejuar të shënoni burimin e raporteve kohore, për shembull. @time "Evaluating foo" foo().
    • vargu merr ose ndalesën ose gjatësinë si argumentin e vetëm të fjalës kyçe.
    • precision dhe setprecision tani pranojnë bazën si fjalë kyçe
    • Objektet e prizës TCP tani ofrojnë një metodë mbylljeje dhe mbështesin përdorimin e modalitetit gjysmë të hapur.
    • Extrema tani pranon një argument init.
    • Iterators.countfrom tani pranon çdo lloj që përcakton një metodë +.
    • @time tani shpërndan % e kohës së shpenzuar për rikompilimin e metodave me lloje të ndryshuara.
  • Ndryshimet standarde të bibliotekës
    • Çelësat me vlerë Asgjë nuk është hequr tani nga mjedisi në addenv.
    • Iterators.reverse (dhe për rrjedhojë e fundit) mbështet çdo rresht.
    • Funksioni i gjatësisë për vargjet e llojeve të caktuara nuk kontrollon më për tejkalim të numrit të plotë. Një funksion i ri, checked_length, është i disponueshëm; ai përmban logjikën e kontrollit të transferimit të biteve. Nëse është e nevojshme, përdorni SaferIntegers.jl për të ndërtuar llojin e intervalit.
    • Përsëritësi Iterators.Reverse zbaton çdo ndryshim të indeksit nëse është e mundur.
  • Menaxheri i paketave
    • Treguesit e rinj ⌃ dhe ⌅ pranë paketave në statusin "pkg>" për të cilat disponohen versione të reja. ⌅ tregon se versionet e reja nuk mund të instalohen.
    • Argumenti i ri i vjetëruar::Bool te Pkg.status (--i vjetëruar ose -o në modalitetin REPL) për të shfaqur informacione rreth paketave nga versionet e mëparshme.
    • Argumenti i ri compat::Bool në Pkg.status (--compat ose -c në modalitetin REPL) për të shfaqur çdo hyrje [compat] në Project.toml.
    • Modaliteti i ri "pkg>compat" (dhe Pkg.compat) për vendosjen e hyrjeve të përputhshmërisë së projektit. Ofron një redaktues interaktiv nëpërmjet "pkg>compat" ose kontrollit të drejtpërdrejtë të regjistrimit nëpërmjet "pkg>Foo 0.4,0.5", i cili mund të ngarkojë të dhënat aktuale nëpërmjet plotësimit të skedës. Kjo do të thotë, "pkg> compat Fo" përditësohet automatikisht në "pkg> Foo 0.4,0.5" në mënyrë që një hyrje ekzistuese të mund të redaktohet.
    • Pkg tani përpiqet të shkarkojë paketa nga një server paketash vetëm nëse serveri monitoron regjistrin që përmban paketën.
    • Pkg.instantiate tani do të lëshojë një paralajmërim kur Project.toml është jashtë sinkronizimit me Manifest.toml. Ai e bën këtë bazuar në një hash të shënimeve të deps dhe kompat të projektit (fushat e tjera shpërfillen) në manifest kur e zgjidh atë, në mënyrë që çdo ndryshim në deps ose në regjistrimet e kompatimit të Project.toml të mund të zbulohet pa u rizgjidhur.
    • Nëse "pkg>add" nuk mund të gjejë një paketë me emrin e dhënë, tani do të sugjerojë paketa me emra të ngjashëm që mund të shtohen.
    • Versioni i julia i ruajtur në manifest nuk përfshin më numrin e ndërtimit, që do të thotë se masteri tani do të shkruhet si 1.9.0-DEV.
    • Ndërprerja e testit "pkg>" tani do të zbulohet në mënyrë më të qëndrueshme dhe do të kthehet saktë në REPL.
  • Interaktive Utils
    • Makro e re @time_imports për të raportuar kohën e shpenzuar për importimin e paketave dhe varësitë e tyre, duke theksuar kohën e përpilimit dhe rikompilimit si përqindje e importeve.
  • Algjebër lineare
    • Nënmoduli BLAS tani mbështet funksionet e nivelit 2 BLAS spr!.
    • Biblioteka standarde LinearAlgebra.jl tani është plotësisht e pavarur nga SparseArrays.jl, si nga këndvështrimi i kodit burimor ashtu edhe i testimit të njësisë. Si pasojë, vargjet e rralla nuk kthehen më (në mënyrë implicite) me metoda nga LinearAlgebra të aplikuara në objektet Base ose LinearAlgebra. Në veçanti, kjo çon në ndryshimet e mëposhtme të thyerjes:
      • Lidhjet që përdorin matrica speciale "të rralla" (p.sh. diagonale) tani kthejnë matrica të dendura; Si pasojë, fushat D1 dhe D2 të objekteve SVD të krijuara nga thirrjet getproperty tani janë matrica të dendura.
      • Metoda e ngjashme(::SpecialSparseMatrix, ::Type, ::Dims) kthen një matricë të dendur null. Si pasojë, produktet e matricave tridiagonale dy, tre dhe simetrike me njëra-tjetrën çojnë në gjenerimin e një matrice të dendur. Për më tepër, ndërtimi i matricave të ngjashme me tre argumente nga matrica speciale "të rralla" nga matricat (jostatike) tani dështon për shkak të "zero(::Type{Matrix{T}})".
  • Printf
    • %s dhe %c tani përdorin argumentin textwidth për të formatuar gjerësinë.
  • Profile
    • Profilizimi i ngarkesës së CPU-së tani regjistron meta të dhënat duke përfshirë temat dhe detyrat. Profile.print() ka një argument të ri groupby që ju lejon të gruponi threads, detyrat ose subthreads/tasks, tasks/threads dhe argumentet e threads dhe detyrave për të ofruar filtrim. Për më tepër, përqindja e përdorimit tani raportohet ose si total ose për fije, në varësi të faktit nëse filli është i papunë ose jo në çdo mostër. Profile.fetch() përfshin si parazgjedhje meta të dhënat e reja. Për pajtueshmërinë e prapambetur me konsumatorët e jashtëm të të dhënave të profilizimit, mund të përjashtohet duke kaluar include_meta=false.
    • Moduli i ri Profile.Allocs ju lejon të profilizoni ndarjet e memories. Regjistrohet një gjurmë stack e llojit dhe madhësisë së çdo alokimi të memories dhe argumenti mostër_rate lejon që një numër i konfigurueshëm i alokimeve të anashkalohet, duke reduktuar shpenzimet e performancës.
    • Profilizimi i CPU-së me kohëzgjatje fikse tani mund të ekzekutohet nga përdoruesi gjatë ekzekutimit të detyrave pa ngarkuar më parë profilin dhe raporti do të shfaqet gjatë ekzekutimit. Në MacOS dhe FreeBSD, shtypni ctrl-t ose telefononi SIGINFO. Për platformat e tjera, aktivizoni SIGUSR1, d.m.th. % vrasin -USR1 $julia_pid. Kjo nuk është e disponueshme në Windows.
  • PPLRGJIGJE
    • RadioMenu tani mbështet shkurtore shtesë të tastierës për zgjedhjen e drejtpërdrejtë të opsioneve.
    • Sekuenca "?(x, y" e ndjekur nga shtypja e TAB shfaq të gjitha metodat që mund të thirren me argumentet x, y, .... (Një hapësirë ​​kryesore ju pengon të hyni në modalitetin e ndihmës.) "MyModule.?(x, y "kufizon kërkimin në "MyModule". Shtypja e TAB kërkon që të paktën një argument të jetë i një lloji më specifik se Any. Ose përdorni SHIFT-TAB në vend të TAB për të lejuar çdo metodë të përputhshme.
    • Ndryshorja e re globale err ju lejon të merrni përjashtimin më të fundit, të ngjashëm me sjelljen e ans me përgjigjen e fundit. Futja e gabimit rishtyp informacionin e përjashtimit.
  • Vargjet e rralla
    • Zhvendos kodin SparseArrays nga depoja e Julia në depon e jashtme SparseArrays.jl.
    • Funksionet e reja të lidhjes sparse_hcat, sparse_vcat dhe sparse_hvcat kthejnë një lloj SparseMatrixCSC pavarësisht nga llojet e argumenteve hyrëse. Kjo u bë e nevojshme për të unifikuar mekanizmin për ngjitjen e matricave pas ndarjes së kodit LinearAlgebra.jl dhe SparseArrays.jl.
  • Prerje-transportim trupash
    • Nivelet standarde të regjistrimit BelowMinLevel, Debug, Info, Warn, Error dhe AboveMaxLevel tani eksportohen nga biblioteka standarde e Regjistrimit.
  • Unicode
    • U shtua funksioni isequal_normalized për të kontrolluar ekuivalencën e Unicode pa ndërtuar në mënyrë eksplicite vargjet e normalizuara.
    • Funksioni Unicode.normalize tani pranon fjalën kyçe të transformimit të grafikut, e cila mund të përdoret për të ofruar paraqitje të karaktereve të personalizuara, dhe funksioni Unicode.julia_chartransform ofrohet gjithashtu për të riprodhuar hartëzimin e përdorur kur analizuesi Julia normalizon identifikuesit.
  • Provë
    • '@test_throws "disa mesazh" triggers_error()" tani mund të përdoret për të testuar nëse teksti i gabimit të shfaqur përmban një gabim "disa mesazh", pavarësisht nga lloji specifik i përjashtimit. Shprehjet e rregullta, listat e vargjeve dhe funksionet që përputhen gjithashtu mbështeten.
    • @testset foo() tani mund të përdoret për të krijuar një grup testimi nga një funksion i caktuar. Emri i rastit të testimit është emri i funksionit që thirret. Funksioni i thirrur mund të përmbajë @test dhe përkufizime të tjera @testset, duke përfshirë thirrjet drejt funksioneve të tjera, ndërsa regjistron të gjitha rezultatet e ndërmjetme të testit.
    • TestLogger dhe LogRecord tani eksportohen nga biblioteka standarde e testit.
  • shpërndarë
    • SSHManager tani mbështet thread-et e punës me një mbështjellës csh/tcsh nëpërmjet metodës addprocs() dhe parametrit shell=:csh.
  • Ndryshime të tjera
    • GC.enable_logging(true) mund të përdoret për të regjistruar çdo operacion grumbullimi të mbeturinave me kohën dhe sasinë e kujtesës së mbledhur.

Burimi: opennet.ru

Shto një koment