Në dispozicion është lëshimi i gjuhës së programimit Julia 1.8, e cila kombinon cilësi të tilla si performanca e lartë, mbështetje për tipizimin dinamik dhe mjete të integruara për programimin paralel. Sintaksa e Julia është e ngjashme me atë të MATLAB, duke huazuar disa elemente nga Ruby dhe Lisp. Metoda për manipulimin e vargjeve i ngjan asaj në Perl. Kodi i projektit shpërndahet nën licencën MIT.
Veçoritë kyçe të gjuhës:
- Performancë e lartë: Një nga qëllimet kryesore të projektit është arritja e performancës afër programeve në gjuhën C. Kompilatori i Julia-s bazohet në punët e projektit LLVM dhe gjeneron kod të efektshëm të makinës natyrore për shumë platforma të synuara;
- Mbështetje për paradigmat të ndryshme të programimit, duke përfshirë elemente të programimit objekt-orientuar dhe funksional. Biblioteka standarde ofron gjithashtu funksione për hyrje/dalje asinkrone, menaxhimin e proceseve, regjistrimin, profilimin dhe menaxhimin e pakot;
- Tipizimi dinamik: gjuha nuk kërkon përcaktimin e qartë të tipave për variablat, ngjashëm me gjuhët e programimit të skriptimit. Mbështetet një mod i ndërveprueshëm;
- Mundësi opsionale për të specifikuar qartë tipet;
- Sintaksa, e cila përshtatet shkëlqyeshëm për llogaritjet numerike, llogaritjet shkencore, sistemet e mësimit të 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.
- Mundësia për të thirrur drejtpërdrejt funksionet nga bibliotekat në gjuhën C pa shtresa të tjera.
Ndryshimet kryesore në Julia 1.8:
- Mundësi të reja të gjuhës
- Fushat e strukturës së ndryshueshme (mutable struct) tani mund të annotohen si constante për të parandaluar ndryshimet dhe për të mundësuar optimizim.
- Annotimet e tipeve mund të shtohen në variablat globale.
- MĂ«nyra pĂ«r tĂ« krijuar array tĂ« zbrazĂ«t n-dimensional mund tĂ« bĂ«het duke pĂ«rdorur disa pika me presje brenda kllapave katrore, pĂ«r shembull «[;;;]» krijon njĂ« array 0Ă0Ă0.
- Blloqet try tani mund të kenë gjithashtu një bllok else, i cili ekzekutohet menjëherë pas trupit kryesor, nëse nuk ka ndodhur ndonjë gabim.
- @inline dhe @noinline mund të vendosen brenda trupit të funksionit, që lejon annotimin e funksionit anonim.
- @inline dhe @noinline tani mund të aplikohen në funksionin në vendin e thirrjes ose në bllok, për të detyruar përfshirjen (ose për të mos përfshirë) thirrjet përkatëse të funksioneve.
- â, â dhe â janĂ« tĂ« lejuara si simbole identifikues.
- Shtuar mbështetje për specifikimin 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 Base ose Core dhe nuk ka referenca për veten.
- Ndryshime në gjuhë
- Objektet e reja Task (@spawn, @async etj.) tani kanë world_age për metodat nga Task prind gjatë krijimit, duke lejuar optimizimin e ekzekutimit të tyre. Versioni i mëparshëm i aktivizimit është në dispozicion nëpërmjet metodës Base.invokelatest.
- Direktivët e formatimit të pavendosur dy drejtues Unicode tani janë të ndaluara në vargje dhe komente për të shmangur injeksionet.
- Base.ifelse tani përcaktohet si një funksion i përgjithshëm, jo si një të integruar, çka lejon paketat të zgjasin përcaktimin e saj.
- Ădo caktim i njĂ« variabli global tani kalon fillimisht pĂ«rmes thirrjes convert(Any, x) ose convert(T, x), nĂ«se pĂ«r variablin global Ă«shtĂ« shpallur tipi T. Para pĂ«rdorimit tĂ« variablave globalĂ«, sigurohuni qĂ« invarianti convert(Any, x) === x tĂ« jetĂ« gjithmonĂ« i vĂ«rtetĂ«, pĂ«rndryshe mund tĂ« sjellĂ« sjellje tĂ« papritur.
- Funksionet e integruara tani janë të ngjashme me funksionet universale dhe mund të enumerohen në mënyrë programatike me metoda.
- Përmirësime të kompiluesit/ambientit të ekzekutimit.
- Koha e ngarkesës fillestare është reduktuar me rreth 25%.
- Kompilatori i bazuar në LLVM është ndarë nga biblioteka e runtime në një bibliotekë të re libjulia-codegen. Ai ngarkohet automatikisht, kështu që për përdorim të zakonshëm nuk duhet të ketë ndryshime. Në shpërndarjet që nuk kanë nevojë për kompilator (për shembull, imazhe sistemesh ku gjithë kodi i nevojshëm është e kompiluar paraprakisht), kjo bibliotekë (dhe varësia e saj LLVM) mund të përjashtohet thjesht.
- Dalja e tipit të kushteve tani është e mundur përmes kalimit të argumentit në metodë. Për shembull, për Base.ifelse(isa(x, Int), x, 0) kthehet ::Int, edhe nëse tipi x është i panjohur.
- SROA (Zëvendësimi Skalar i Agregatëve) është përmirësuar: përjashtohen thirrjet getfield me fusha globale të qëndruara, përjashton struktura të ndryshueshme me fusha të pa inicializuara, rrit produktivitetin dhe përpunimin e thirrjeve të brendshme getfield.
- Dalja e tipeve ndjek efekte tĂ« ndryshme â ndryshime anĂ«sore dhe mungesĂ« hedhjesh. Merren parasysh pĂ«rhapjet e constanteve, çka e rrit ndjeshĂ«m produktivitetin gjatĂ« kompilimit. NĂ« disa raste, pĂ«r shembull, thirrjet e funksioneve, tĂ« cilat nuk mund tĂ« integrohen nĂ« vendngjarje, por qĂ« nuk ndikon nĂ« rezultat, do tĂ« hidhen nĂ« kohĂ«n e ekzekutimit. Rregullat pĂ«r efekte mund tĂ« pĂ«rditĂ«sohen manualisht me makron Base.@assume_effects.
- Kompilimi paraprak (me drejtime tĂ« dukshme pĂ«r kompilimin paraprak ose ngarkesa tĂ« pĂ«rcaktuara) tani ruan mĂ« shumĂ« kod tĂ« pĂ«rcaktuar nga tipi, çka shkakton njĂ« reduktim tĂ« kohĂ«s sĂ« fillimit tĂ« parĂ«. Ădo kombim tĂ« ri tĂ« metodave/tipave, qĂ« i nevojitet paketĂ«s tuaj, pavarĂ«sisht se ku ato metoda janĂ« pĂ«rcaktuar, tani mund tĂ« ruhet nĂ« skedarin e parakomplikuar nĂ«se ato thirren nga njĂ« metodĂ« qĂ« i takon paketĂ«s suaj.
- Ndryshimet në parametrat e komandës
- SidoqoftĂ«, sjellja e parazgjedhur pĂ«r monitorimin e shpalljeve @inbounds tani Ă«shtĂ« njĂ« opsion auto nĂ« «âcheck-bounds=yes|no|auto».
- Opcioni i ri «âstrip-metadata» pĂ«r tĂ« hequr rreshtat e dokumentacionit, informacionin mbi vendndodhjen burimore dhe emrat e variablave lokalĂ« gjatĂ« krijimit tĂ« njĂ« imazhi tĂ« sistemit.
- Opsioni i ri «âstrip-ir» pĂ«r tĂ« hequr pĂ«rfaqĂ«simin e ndĂ«rmjetĂ«m tĂ« kodit burimor gjatĂ« ndĂ«rtimit tĂ« imazhit tĂ« sistemit. Imazhi i rezultatit do tĂ« funksionojĂ« vetĂ«m nĂ«se pĂ«rdoret «âcompile=all» ose nĂ«se e gjithĂ« kodi i nevojshĂ«m Ă«shtĂ« pĂ«rpiluar paraprakisht.
- Nëse simboli «-« përmendet në vend të emrit të skedarit, kodi ekzekutiv lexohet nga rrjedha standarde e hyrjes.
- Ndryshime në mbështetje të shumëfishtë.
- Threads.@threads për të paracaktuar përdor parametrin e ri të programimit :dynamic, i cili ndryshon nga mënyra e mëparshme, pasi iteraçÔes do të planifikohen dinamikisht për threads e disponueshme, jo të caktohen për çdo thread. Kjo mënyrë lejon shpërndarjen më të mirë të cikleve të thella me @spawn dhe @threads.
- Funksionet e reja të bibliotekës
- eachsplit(str) për të realizuar shumë herë split(str).
- allequal(itr) për të kontrolluar barazinë e të gjithë elementeve në iterator.
- hardlink(src, dst) mund të përdoret për të krijuar lidhje të forta.
- setcpuaffinity(cmd, cpus) për të vendosur përputhshmërinë e bërthamës së procesorit me proceset e ekzekutimit.
- diskstat(path=pwd()) për të marrë statistikat për disqet.
- Makro i ri @showtime për të shfaqur si stringun e vlerësuar, ashtu edhe raportin @time.
- LazyString dhe makroja lazy»str» janë shtuar për të mbështetur ndërtimin e vonuar të mesazheve të gabimeve në rrugët e gabimeve.
- Problemi i qasjes së shumëfishtë në Dict dhe objekte të tjera të derived, si keys(::Dict), values(::Dict) dhe Set është zgjidhur. Metodat e iterimit tani mund të thirren për fjalorin ose shumësinë, me kusht që të mos ketë thirrje që ndryshojnë fjalorin ose shumësinë.
- @time dhe @timev tani kanë një përshkrim opsional, që lejon annotimin e burimit të raporteve për kohën, për shembull. @time «Evaluating foo» foo().
- range pranon ose stop, ose length si argumentin e vetëm të fjalës kyçe.
- precision dhe setprecision tani pranojnë base si fjalë kyçe.
- Objektet e socket TCP tani ofrojnë metodën closewrite dhe mbështesin përdorimin në modalitetin e pjesshëm të hapur.
- extrema tani pranon argumentin init.
- Iterators.countfrom tani pranon çdo tip që përcakton metodën +.
- @time tani ndan % e kohës së shpenzuar për ripërpilim të metodave me tipe të ndryshuara.
- Ndryshime në bibliotekën eståndar
- ĂelĂ«sat me vlerĂ«n Nothing tani hiqen nga mjedisi nĂ« addenv.
- Iterators.reverse (dhe, për rrjedhojë, last) mbështet eachline.
- Funksioni length për gamat e kufizuara nuk kontrollon më mbivendosjen e numrave të plotë. Një funksion i ri checked_length është disponibilizuar, i cili përmban logjikën e kontrollit të riprodhimit të numrave. Nëse është e nevojshme, përdorni SaferIntegers.jl për ndërtimin e tipit të gamës.
- Iterator Iterators.Reverse implementon inverzimin e eachindex, nëse është e mundur.
- Menaxheri i paketave
- TĂ« reja indikatorĂ«t â dhe â pranĂ« pakteve nĂ« statusin «pkg>», pĂ«r tĂ« cilat janĂ« tĂ« disponueshme versione tĂ« reja. â tregon se versionet e reja nuk mund tĂ« instalohen.
- Argumenti i ri outdated::Bool pĂ«r Pkg.status (âoutdated ose -o nĂ« modalitetin REPL), pĂ«r tĂ« shfaqur informacionin pĂ«r pakete tĂ« versioneve tĂ« mĂ«parshme.
- Argumenti i ri compat::Bool pĂ«r Pkg.status (âcompat ose -c nĂ« modalitetin REPL), pĂ«r tĂ« shfaqur çdo rekord [compat] nĂ« Project.toml.
- Një modalitet i ri «pkg> compat» (dhe Pkg.compat) për të konfigurimin e recetave të përputhshmërisë për projektin. Ofron një redaktor interaktiv përmes «pkg> compat» ose menaxhimin e drejtpërdrejtë të regjistrit përmes «pkg> Foo 0.4,0.5», i cili mund të ngarkojë regjistrat aktualë përmes autocompletion me tab. Pra, «pkg> compat Fo<TAB>» automatikisht plotëson deri në «pkg> Foo 0.4,0.5», në mënyrë që të mund të redaktoni regjistrin ekzistues.
- Tani Pkg përpiqet të ngarkojë paketat me server paketat vetëm nëse serveri ndjek regjistrin që përmban paketën.
- Pkg.instantiate tani do të shfaqë një paralajmërim kur Project.toml nuk është sinkronizuar me Manifest.toml. Ai e bën këtë bazuar në hash-in e regjistrave të deps dhe compat të projektit (fushat e tjera injorohen) në manifest gjatë zgjidhjes, në mënyrë që të mund të zbulojë çdo ndryshim në deps të Project.toml ose regjistrat e compat pa nevojën për një zgjidhje të përsëritur.
- Nëse «pkg> add» nuk mund të gjejë një paket me emrin e caktuar, tani do të proponohen 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, dmth. master tani do të regjistrohet si 1.9.0-DEV.
- Ndërprerja e testit «pkg>» tani do të zbulohet më stabilisht dhe do të kthehet saktë në REPL.
- InteractiveUtils
- Makro i ri @time_imports për raportimin e kohës së shpenzuar në importimin e paketeve dhe varësive të tyre, me ndarjen e kohës së përpilimit dhe ripërpilimit në përqindje gjatë importit.
- Algebra lineare
- Nëndermoduli BLAS tani mbështet funksionet e nivelit-2 BLAS spr!.
- Biblioteka e standardeve LinearAlgebra.jl tani është plotësisht e pavarur nga SparseArrays.jl, si në aspektin e kodit burimor ashtu edhe në aspektin e testimit modular. Si pasojë, matrica të holluara tani nuk kthehen (implicit) nga metodat e LinearAlgebra kur përdoren në objektet Base apo LinearAlgebra. Në veçanti, kjo çon në ndërrime kritike si vijon:
- Kombinimet duke përdorur mata të veçanta "të holluara" (p.sh., diagonale) tani kthejnë matrica të densa; si rezultat, fushat D1 dhe D2 të objekteve SVD, të krijuara gjatë thirrjeve të getproperty, tani janë matrica të densa.
- Metoda similar(::SpecialSparseMatrix, ::Type, ::Dims) kthen një matricë të dendur zero. Si pasojë, prodhimi i dy, tre dhe matricave simetrike tridimensionale njëra mbi tjetrën çon në krijimin e një matrice të dendur. Gjithashtu, ndërtimi i matriceve të ngjashme me tre argumente nga matrica "të holluara" (jo statike) tani dështon për shkak të "zero(::Type{Matrix{T}})."
- Printf
- Tani për formatimin e gjerësisë %s dhe %c përdoret argumenti textwidth.
- Profile
- Profilimi i ngarkesës së procesorit tani regjistron metadatat, duke përfshirë rrjedhat dhe detyrat. Profile.print() tani ka një argument të ri groupby, i cili lejon grupimin e rrjedhave, detyrave ose rrjedhave/ detyrave të ngulitura, si dhe argumentet threads dhe tasks për të mundësuar filtrimin. Për më tepër, përqindja e përdorimit tani raportohhet ose si e përgjithshme, ose për rrjedhat, në varësi të faktit nëse rrjedha është në pritje apo jo në çdo mostër. Profile.fetch() përfshin metadat të reja si parazgjedhje. Për të ruajtur kompatibilitetin me konsumatorët e jashtëm të të dhënave të profilimit, mund të përjashtohet duke kaluar include_meta=false.
- Moduli i ri Profile.Allocs lejon profilimin e alokimeve të memories. Regjistrohet gjurmimi i stackut, lloji dhe madhësia e çdo alokimi memorie, dhe argumenti sample_rate lejon kalimin e një numri të personalizuar të shpërndarjeve, duke reduktuar ngarkesën në performancë.
- Profilimi i procesorit me kohë të fikstuar tani mund të nisë nga përdoruesi gjatë ekzekutimit të detyrave pa nevojën për ngarkimin e profilit paraprakisht, dhe raporti do të shfaqet gjatë ekzekutimit. Në MacOS dhe FreeBSD shtypni ctrl-t ose thirrni SIGINFO. Për platforma të tjera aktivizoni SIGUSR1, pra % kill -USR1 $julia_pid. Në Windows kjo nuk është e disponueshme.
- REPL
- RadioMenu tani mbështet kombinime shtesë të çelësave për zgjedhje të drejtpërdrejta të opsioneve.
- Sekuenca "?(x, y", pasuar nga shtypja e TAB, shfaq tĂ« gjitha metodat qĂ« mund tĂ« thirren me argumentet x, y, âŠ. (HapĂ«sira nĂ« fillim nuk mundĂ«son hyrjen nĂ« modin e ndihmĂ«s). "MyModule.?(x, y" kufizon kĂ«rkimin nĂ« "MyModule." Shtypja e TAB kĂ«rkon qĂ« tĂ« paktĂ«n njĂ« argument tĂ« ketĂ« njĂ« tip mĂ« tĂ« veçantĂ« se Any. Ose pĂ«rdorni SHIFT-TAB nĂ« vend tĂ« TAB pĂ«r tĂ« lejuar çdo metodĂ« tĂ« pĂ«rshtatshme.
- Variabla globale e re err lejon që të marrësh përjashtimin më të fundit, duke ngjashmëruar sjelljen e ans me përgjigjen e fundit. Shkruani err për të ribotuar informacionin mbi përjashtimin.
- SparseArrays
- Kodi i SparseArrays është zhvendosur nga depoja e Julia në një depo të jashtme SparseArrays.jl.
- Funksionet e reja të kombinimit sparse_hcat, sparse_vcat dhe sparse_hvcat kthejnë tipin SparseMatrixCSC pavarësisht llojeve të argumenteve hyrëse. Kjo është bërë e nevojshme për të unifikuar mekanizmin e bashkimit të matriceve pas ndarjes së kodit LinearAlgebra.jl dhe SparseArrays.jl.
- Regjistrimi
- Niveli standard i regjistrit BelowMinLevel, Debug, Info, Warn, Error dhe AboveMaxLevel tani eksportohen nga biblioteka standarde Logging.
- Unicode
- Funksioni isequal_normalized është shtuar për të kontrolluar ekuivalencën Unicode pa ndërtuar shfaqur për strings e normalizuara.
- Funksioni Unicode.normalize tani pranon fjalëkalimin chartransform, i cili mund të përdoret për të ofruar përputhje simbolesh të personalizuara, si dhe ofrohet funksioni Unicode.julia_chartransform për të riprodhuar përputhjen e përdorur gjatë normalizimit të identifikatorëve nga analizuesi sintaksor i Julia.
- Test
- '@test_throws "some message" triggers_error()' tani mund të përdoret për të provuar nëse teksti i shfaqur përmban gabim "some message", pa marrë parasysh llojin konkret të përjashtimit. Për më tepër, përkrahim shprehjet e rregullta, shtrirje strings dhe funksione për përputhje.
- @testset foo() tani mund të përdoret për të krijuar një grup testesh nga një funksion të caktuar. Emri i grupit të testit është emri i funksionit të thirrur. Funksioni i thirrur mund të përmbajë @test dhe definicionet e tjera @testset, përfshirë thirrjet e funksioneve të tjera, duke regjistruar të gjitha rezultatet ndërmjetëse të testimit.
- TestLogger dhe LogRecord tani eksportohen nga biblioteka standarde Test.
- Distribuar
- SSHManager tani mbështet rrjedhat e punës me mbështjellës csh/tcsh përmes metodës addprocs() dhe parametrin shell=:csh.
- Ndryshime të tjera
- GC.enable_logging(true) mund të përdoret për të regjistruar çdo operacion të grumbullimit të plehrave me specifikimin e kohës dhe sasisë së memories së mbledhur.
Burimi: opennet.ru
