Հասանելի է Julia 1.8 ծրագրավորման լեզվի թողարկումը, որը համատեղում է այնպիսի որակներ, ինչպիսիք են բարձր կատարողականությունը, դինամիկ մուտքագրման աջակցությունը և զուգահեռ ծրագրավորման ներկառուցված գործիքները: Ջուլիայի շարահյուսությունը մոտ է MATLAB-ին՝ որոշ տարրեր փոխառելով Ruby-ից և Lisp-ից։ Լարի մանիպուլյացիայի մեթոդը հիշեցնում է Perl-ը։ Ծրագրի կոդը բաշխվում է MIT լիցենզիայի ներքո:
Լեզվի հիմնական հատկանիշները.
- Բարձր կատարողականություն. նախագծի առանցքային նպատակներից է C ծրագրերին մոտ կատարման հասնելը: Julia կոմպիլյատորը հիմնված է LLVM նախագծի աշխատանքի վրա և ստեղծում է արդյունավետ տեղական մեքենայի կոդ բազմաթիվ թիրախային հարթակների համար.
- Աջակցում է ծրագրավորման տարբեր պարադիգմների, ներառյալ օբյեկտի վրա հիմնված և ֆունկցիոնալ ծրագրավորման տարրերը: Ստանդարտ գրադարանը, ի թիվս այլ բաների, ապահովում է գործառույթներ ասինխրոն I/O-ի, գործընթացի վերահսկման, գրանցման, պրոֆիլավորման և փաթեթների կառավարման համար:
- Դինամիկ մուտքագրում. լեզուն չի պահանջում փոփոխականների տեսակների հստակ սահմանում, ինչպես ծրագրավորման ծրագրավորման լեզուները: Աջակցված է ինտերակտիվ ռեժիմ;
- Տեսակները հստակորեն նշելու կամընտիր ունակություն;
- Շարահյուսություն, որն իդեալական է թվային հաշվարկների, գիտական հաշվարկների, մեքենայական ուսուցման և տվյալների վիզուալիզացիայի համար: Աջակցություն բազմաթիվ թվային տվյալների տեսակների և գործիքների` հաշվարկների զուգահեռացման համար:
- C գրադարաններից առանց լրացուցիչ շերտերի գործառույթներ ուղղակիորեն կանչելու հնարավորություն:
Julia 1.8-ի հիմնական փոփոխությունները.
- Լեզվի նոր առանձնահատկություններ
- Փոփոխական կառուցվածքի դաշտերը այժմ կարող են նշվել որպես հաստատուններ՝ կանխելու դրանց փոփոխությունը և թույլ տալու օպտիմալացում:
- Տիպի անոտացիաները կարող են ավելացվել գլոբալ փոփոխականներին:
- Դատարկ n-չափ զանգվածներ կարող են ստեղծվել քառակուսի փակագծերի ներսում մի քանի ստորակետերի միջոցով, օրինակ՝ «[;;;]»-ը ստեղծում է 0x0x0 զանգված:
- Փորձի բլոկներն այժմ կարող են կամայականորեն ունենալ Another բլոկ, որը գործարկվում է հիմնական մարմնից անմիջապես հետո, եթե սխալներ չեն հայտնաբերվել:
- @inline-ը և @noinline-ը կարող են տեղադրվել ֆունկցիայի մարմնի ներսում՝ թույլ տալով ծանոթագրել անանուն ֆունկցիան:
- @inline-ը և @noinline-ն այժմ կարող են կիրառվել զանգի կայքի կամ արգելափակման ֆունկցիայի վրա՝ ստիպելու համապատասխան գործառույթի կանչերը ներառել (կամ չներառել):
- ∀, ∃ և ∄ թույլատրվում են որպես նույնացուցիչ նիշեր:
- Ավելացված է աջակցություն Unicode 14.0.0-ի ճշգրտման համար:
- Module(:name, false, false) մեթոդը կարող է օգտագործվել մոդուլ ստեղծելու համար, որը չի պարունակում անուններ, չի ներմուծում Base կամ Core և չի պարունակում հղում իր մասին:
- Լեզվի փոփոխություններ
- Նորաստեղծ առաջադրանքի օբյեկտներ (@Spawn, @async եւ այլն) այժմ ունեն World_age ծնողական առաջադրանքների մեթոդների համար, երբ ստեղծվել են, թույլ տալով օպտիմիզացված կատարում: Նախորդ ակտիվացման տարբերակը հասանելի է Base.invokelatest մեթոդի միջոցով:
- Յունիկոդի անհավասարակշիռ երկկողմանի ձևաչափման հրահանգներն այժմ արգելված են տողերում և մեկնաբանություններում՝ ներարկումներից խուսափելու համար:
- Base.ifelse-ն այժմ սահմանվում է որպես ընդհանուր ֆունկցիա, այլ ոչ թե ներկառուցված, որը թույլ է տալիս փաթեթներին ընդլայնել դրա սահմանումը:
- Համաշխարհային փոփոխականի յուրաքանչյուր հանձնարարությունն այժմ առաջին հերթին անցնում է փոխարկելու (ցանկացած, x) կամ փոխարկելու (T, X), եթե գլոբալ փոփոխականը հայտարարվի Type Ty Type Type (ցանկացած , x) === x-ը միշտ ճիշտ է, հակառակ դեպքում դա կարող է հանգեցնել անսպասելի վարքի:
- Ներկառուցված գործառույթներն այժմ նման են ընդհանուր գործառույթներին և կարող են ծրագրային կերպով թվարկվել՝ օգտագործելով մեթոդները:
- Կազմողի/աշխատանքի բարելավումներ
- Բեռնման ժամանակը կրճատվել է մոտավորապես 25%-ով:
- LLVM-ի վրա հիմնված կոմպիլյատորը գործարկման ժամանակի գրադարանից առանձնացվել է նոր գրադարանի՝ libjulia-codegen-ի: Այն լռելյայն բեռնված է, ուստի նորմալ օգտագործման ժամանակ փոփոխություններ չպետք է լինեն: Այն տեղաբաշխումներում, որոնք կոմպիլյատորի կարիք չունեն (օրինակ՝ համակարգի պատկերները, որոնցում բոլոր անհրաժեշտ ծածկագիրը նախապես կազմված է), այս գրադարանը (և դրա LLVM կախվածությունը) կարող է պարզապես բաց թողնել:
- Պայմանական տիպի եզրակացությունն այժմ հնարավոր է մեթոդին արգումենտ փոխանցելու միջոցով: Օրինակ, Base.ifelse(isa(x, Int), x, 0)-ի համար վերադարձնում է ::Int, նույնիսկ եթե x-ի տեսակն անհայտ է:
- SROA-ն (Ագրեգատների Scalar Replacement) բարելավվել է. վերացնում է «Getfield» զանգերը մշտական գլոբալ դաշտերով, վերացնում է փոփոխական կառուցվածքները՝ չնախապատրաստված դաշտերով, բարելավում է կատարողականությունը և կառավարումը nested getfield զանգերի հետ:
- Տիպի եզրակացությունը հետևում է տարբեր էֆեկտներին՝ կողմնակի էֆեկտներին և չթողնելուն: Հաշվի է առնվում մշտական տարածումը, ինչը զգալիորեն բարելավում է կոմպիլյացիայի ժամանակի կատարումը: Որոշ դեպքերում, օրինակ, գործառույթների զանգերը, որոնք չեն կարող ներկառուցվել, բայց չեն ազդում արդյունքի վրա, կհեռացվեն գործարկման ժամանակ: Էֆեկտների կանոնները կարող են ձեռքով վերագրվել՝ օգտագործելով Base.@assume_effects մակրո:
- Precompilation-ը (նախապատրաստման հստակ հրահանգներով կամ որոշակի աշխատանքային ծանրաբեռնվածությամբ) այժմ պահպանում է ավելի շատ տիպի սահմանված կոդ, ինչը հանգեցնում է առաջին անգամ ավելի արագ կատարման: Ձեր փաթեթին անհրաժեշտ ցանկացած նոր մեթոդի/տիպի համակցություններ, անկախ նրանից, թե որտեղ են սահմանվել այդ մեթոդները, այժմ կարող են պահվել նախնական կոմպիլյացիայի ֆայլում, եթե դրանք կանչված են ձեր փաթեթին պատկանող մեթոդով:
- Փոփոխություններ հրամանի տողի ընտրանքներում
- @inbounds հայտարարագրերի մոնիտորինգի համար լռելյայն վարքագիծն այժմ ավտոմատ տարբերակն է «--check-bounds=yes|no|auto»-ում:
- Նոր «--strip-metadata» տարբերակ՝ համակարգի պատկեր ստեղծելիս փաստաթղթերի տողերը, աղբյուրի գտնվելու վայրի տեղեկատվությունը և տեղական փոփոխականների անունները հեռացնելու համար:
- Նոր «--strip-ir» տարբերակ, որը թույլ է տալիս կոմպիլյատորին հեռացնել միջանկյալ աղբյուրի կոդը համակարգի պատկերը կառուցելիս: Ստացված պատկերը կաշխատի միայն այն դեպքում, եթե օգտագործվի «--compile=all»-ը կամ եթե ամբողջ պահանջվող կոդը նախապես կազմված է:
- Եթե ֆայլի անվան փոխարեն նշված է «-» նիշը, ապա գործարկվող կոդը կարդացվում է ստանդարտ մուտքային հոսքից:
- Multithreading աջակցության փոփոխություններ
- Threads.@threads-ը լռելյայն օգտագործում է պլանավորման նոր տարբերակը :dynamic, որը տարբերվում է նախորդ ռեժիմից նրանով, որ կրկնությունները դինամիկ կերպով պլանավորվելու են հասանելի աշխատանքային շղթաներում, այլ ոչ թե վերագրվելու են յուրաքանչյուր շղթային: Այս ռեժիմը թույլ է տալիս ավելի լավ բաշխել nested loops @spawn և @threads-ով:
- Գրադարանի նոր գործառույթներ
- everysplit(str)՝ մի քանի անգամ split(str) գործարկելու համար:
- allequal(itr) ստուգելու համար, թե արդյոք iterator-ի բոլոր տարրերը հավասար են:
- hardlink (src, dst) կարող է օգտագործվել կոշտ հղումներ ստեղծելու համար:
- setcpuaffinity (cmd, cpus) պրոցեսորի միջուկի հարաբերակցությունը գործարկված գործընթացներին սահմանելու համար:
- diskstat(path=pwd()) սկավառակի վիճակագրություն ստանալու համար:
- Նոր @showtime մակրո՝ և՛ գնահատվող տողը, և՛ @time հաշվետվությունը ցուցադրելու համար:
- LazyString-ը և lazy"str" մակրո-ն ավելացվել են սխալների ուղիներում սխալ հաղորդագրությունների ծույլ կառուցմանը աջակցելու համար:
- Ուղղել է միաժամանակության խնդիր Dict-ում և այլ ածանցյալ օբյեկտներում, ինչպիսիք են keys(::Dict), values(::Dict) և Set: Կրկնման մեթոդներն այժմ կարող են կանչվել բառարանի կամ հավաքածուի վրա, քանի դեռ չկան զանգեր, որոնք փոփոխում են բառարանը կամ հավաքածուն:
- @time-ը և @timev-ն այժմ ունեն կամընտիր նկարագրություն, որը թույլ է տալիս, օրինակ, նշել ժամանակի հաշվետվությունների աղբյուրը: @time «Evaluating foo» foo():
- միջակայքը վերցնում է կանգառը կամ երկարությունը որպես իր միակ հիմնաբառի փաստարկը:
- precision-ը և setprecision-ն այժմ հիմք են ընդունում որպես հիմնաբառ
- TCP socket օբյեկտներն այժմ ապահովում են փակ գրելու մեթոդ և աջակցում են կիսաբաց ռեժիմի կիրառմանը:
- extrema-ն այժմ ընդունում է init փաստարկը:
- Iterators.countfrom-ն այժմ ընդունում է ցանկացած տեսակ, որը սահմանում է + մեթոդ:
- @time now-ը հատկացնում է փոփոխված տեսակներով մեթոդների վերակոմպիլյացիայի ժամանակ ծախսված ժամանակի տոկոսը:
- Ստանդարտ գրադարանի փոփոխություններ
- Արժեք ունեցող ստեղներ:
- Iterators.reverse (և հետևաբար վերջին) աջակցում է յուրաքանչյուր տող:
- Որոշակի տիպերի միջակայքերի երկարության ֆունկցիան այլևս չի ստուգում ամբողջ թվերի արտահոսքի առկայությունը: Հասանելի է նոր գործառույթ՝ checked_length, այն պարունակում է բիթերի փոխանցման կառավարման տրամաբանություն: Անհրաժեշտության դեպքում օգտագործեք SaferIntegers.jl միջակայքի տեսակը կառուցելու համար:
- Iterators.Reverse iterator-ը, հնարավորության դեպքում, իրականացնում է յուրաքանչյուր ինդեքսի հակադարձում:
- Փաթեթի կառավարիչ
- Նոր ⌃ և ⌅ ցուցիչներ «pkg>» կարգավիճակի փաթեթների կողքին, որոնց համար հասանելի են նոր տարբերակները: ⌅ ցույց է տալիս, որ նոր տարբերակները չեն կարող տեղադրվել:
- Նոր հնացած::Bool արգումենտ Pkg.status-ում (--հնացած կամ -o REPL ռեժիմում)՝ նախորդ տարբերակների փաթեթների մասին տեղեկատվություն ցուցադրելու համար:
- Նոր compat::Bool արգումենտ Pkg.status-ին (--compat կամ -c REPL ռեժիմում)՝ Project.toml-ում [compat] գրառումները ցուցադրելու համար:
- Նոր «pkg>compat» (և Pkg.compat) ռեժիմ՝ նախագծի համատեղելիության գրառումները կարգավորելու համար: Ապահովում է ինտերակտիվ խմբագրիչ «pkg>compat» կամ «pkg>Foo 0.4,0.5» ուղղակի գրառումների կառավարման միջոցով, որը կարող է բեռնել ընթացիկ գրառումները ներդիրների լրացման միջոցով: Այսինքն, «pkg> compat Fo»-ն ավտոմատ կերպով թարմացվում է «pkg> Foo 0.4,0.5»-ի, որպեսզի գոյություն ունեցող գրառումը հնարավոր լինի խմբագրել:
- Pkg-ն այժմ միայն փորձում է փաթեթներ ներբեռնել փաթեթի սերվերից, եթե սերվերը վերահսկում է փաթեթը պարունակող ռեեստրը:
- Pkg.instantiate-ն այժմ նախազգուշացում կհրապարակի, երբ Project.toml-ը չհամաժամեցվի Manifest.toml-ի հետ: Այն դա անում է ծրագրի դեփների և համադրելի գրառումների հաշիշի հիման վրա (այլ դաշտերը անտեսվում են) մանիֆեստում այն լուծելիս, որպեսզի Project.toml deps-ի կամ compat գրառումների ցանկացած փոփոխություն հնարավոր լինի հայտնաբերել առանց նորից լուծելու:
- Եթե «pkg>add»-ը չի կարողանում գտնել տվյալ անունով փաթեթ, այժմ կառաջարկի նմանատիպ անուններով փաթեթներ, որոնք կարելի է ավելացնել:
- Մանիֆեստում պահվող julia-ի տարբերակն այլևս չի ներառում կառուցման համարը, այսինքն՝ Master-ն այժմ գրվելու է որպես 1.9.0-DEV:
- Փորձնական ընդհատումը «pkg>»-ն այժմ ավելի հետևողականորեն կհայտնաբերվի և ճիշտ կվերադարձվի REPL:
- Ինտերակտիվներ
- Նոր @time_imports մակրո՝ փաթեթների ներմուծման և դրանց կախվածության վրա ծախսված ժամանակի մասին հաղորդելու համար՝ ընդգծելով կազմման և վերահամալրման ժամանակը որպես ներմուծման տոկոս:
- Գծային հանրահաշիվ
- BLAS ենթամոդուլն այժմ աջակցում է 2 մակարդակի BLAS spr! ֆունկցիաները:
- LinearAlgebra.jl ստանդարտ գրադարանն այժմ լիովին անկախ է SparseArrays.jl-ից՝ և՛ սկզբնաղբյուրի, և՛ միավորի փորձարկման տեսանկյունից: Որպես հետևանք, նոսր զանգվածներն այլևս չեն վերադարձվում (ուղղակիորեն) LinearAlgebra-ի մեթոդներով, որոնք կիրառվում են Base կամ LinearAlgebra օբյեկտների վրա: Մասնավորապես, դա հանգեցնում է հետևյալ բեկումնային փոփոխությունների.
- Հատուկ «նոսր» մատրիցներ օգտագործող միացումները (օրինակ՝ անկյունագծային) այժմ վերադարձնում են խիտ մատրիցներ; Որպես հետևանք, getproperty կանչերով ստեղծված SVD օբյեկտների D1 և D2 դաշտերը այժմ խիտ մատրիցներ են:
- Նմանատիպ(::SpecialSparseMatrix, ::Type, ::Dims) մեթոդը վերադարձնում է խիտ զրոյական մատրիցա: Որպես հետևանք, երկու, երեք և սիմետրիկ եռանկյուն մատրիցների արտադրյալները միմյանց հետ հանգեցնում են խիտ մատրիցայի առաջացմանը: Բացի այդ, նմանատիպ մատրիցների կառուցումը երեք արգումենտներով հատուկ «նոսր» մատրիցներից (ոչ ստատիկ) մատրիցներից այժմ ձախողվում է «zero(::Type{Matrix{T}})» պատճառով։
- Printf
- %s և %c-ն այժմ օգտագործում են textwidth արգումենտը՝ լայնությունը ձևավորելու համար:
- Տվյալներ
- CPU-ի բեռնվածության պրոֆիլավորումն այժմ գրանցում է մետատվյալները՝ ներառյալ թելերը և առաջադրանքները: Profile.print()-ն ունի նոր groupby արգումենտ, որը թույլ է տալիս խմբավորել թելերը, առաջադրանքները կամ ենթաթելերը/առաջադրանքները, առաջադրանքները/թելերը և թելերն ու առաջադրանքների փաստարկները՝ զտում ապահովելու համար: Բացի այդ, օգտագործման տոկոսն այժմ հաղորդվում է որպես ընդհանուր կամ մեկ շղթա՝ կախված նրանից, թե արդյոք շարանը պարապ է, թե ոչ յուրաքանչյուր նմուշում: Profile.fetch() լռելյայն ներառում է նոր մետատվյալները: Պրոֆիլի տվյալների արտաքին սպառողների հետ հետ համատեղելիության համար այն կարելի է բացառել՝ անցնելով include_meta=false:
- Նոր Profile.Allocs մոդուլը թույլ է տալիս պրոֆիլավորել հիշողության հատկացումները: Գրանցվում է յուրաքանչյուր հիշողության բաշխման տեսակի և չափի հետքը, և sample_rate արգումենտը թույլ է տալիս կարգավորելի թվով հատկացումներ բաց թողնել՝ նվազեցնելով կատարողականի գերբեռնվածությունը:
- Ֆիքսված տևողությամբ CPU-ի պրոֆիլավորումն այժմ կարող է գործարկվել օգտատիրոջ կողմից, մինչ առաջադրանքները գործարկվում են, առանց նախապես բեռնելու պրոֆիլը, և հաշվետվությունը կցուցադրվի գործարկման ընթացքում: MacOS-ում և FreeBSD-ում սեղմեք ctrl-t կամ զանգահարեք SIGINFO: Այլ հարթակների համար ակտիվացրեք Sigusr1- ը, I.E- ն: Սպանել -URR1 $ Julia_pid. Սա մատչելի չէ Windows- ում:
- ՊԱՏՐԱՍՏԵԼ
- RadioMenu-ն այժմ աջակցում է ստեղնաշարի լրացուցիչ դյուրանցումներ՝ ընտրանքների ուղղակի ընտրության համար:
- «?(x, y» հաջորդականությունը, որին հաջորդում է TAB սեղմումը, ցուցադրում է բոլոր մեթոդները, որոնք կարելի է կանչել x, y, ... արգումենտներով: (Առաջատար բացատը թույլ չի տալիս մուտք գործել օգնության ռեժիմ:) «MyModule.?(x, y " սահմանափակում է որոնումը "MyModule"-ով: TAB սեղմելու համար պահանջվում է, որ առնվազն մեկ արգումենտ լինի ավելի կոնկրետ, քան Any: Կամ օգտագործեք SHIFT-TAB-ը TAB-ի փոխարեն՝ ցանկացած համատեղելի մեթոդներ թույլատրելու համար:
- Նոր գլոբալ err փոփոխականը թույլ է տալիս ստանալ վերջին բացառությունը, որը նման է ans-ի վարքագծին վերջին պատասխանով: Սխալ մուտքագրելով վերատպվում է բացառության տեղեկատվությունը:
- SparseArrays
- SparseArrays կոդը Julia-ի պահոցից տեղափոխեց արտաքին SparseArrays.jl պահոց:
- Նոր զուգակցման գործառույթները sparse_hcat, sparse_vcat և sparse_hvcat վերադարձնում են SparseMatrixCSC տեսակ՝ անկախ մուտքային արգումենտների տեսակներից: Սա անհրաժեշտ դարձավ մատրիցների սոսնձման մեխանիզմը միավորելու համար LinearAlgebra.jl և SparseArrays.jl ծածկագրերը բաժանելուց հետո։
- Փայտամթերում
- Ստանդարտ գրանցման մակարդակները BelowMinLevel, Debug, Info, Warn, Error և AboveMaxLevel այժմ արտահանվում են ստանդարտ Logging գրադարանից:
- Unicode
- Ավելացվեց isequal_normalized ֆունկցիան՝ ստուգելու Unicode-ի համարժեքությունը՝ առանց բացահայտորեն նորմալացված տողերի կառուցման:
- Unicode.normalize ֆունկցիան այժմ ընդունում է charttransform հիմնաբառը, որը կարող է օգտագործվել անհատական նիշերի քարտեզագրում տրամադրելու համար, իսկ Unicode.julia_chartransform ֆունկցիան տրամադրվում է նաև վերարտադրելու այն քարտեզագրումը, որն օգտագործվում է, երբ Julia վերլուծիչը նորմալացնում է նույնացուցիչները:
- փորձարկում
- «@test_throws «որոշ հաղորդագրություն» triggers_error()» այժմ կարող է օգտագործվել՝ ստուգելու համար, թե արդյոք ցուցադրված սխալի տեքստը պարունակում է «որոշ հաղորդագրություն» սխալ՝ անկախ բացառության հատուկ տեսակից: Կանոնավոր արտահայտությունները, տողերի ցուցակները և համապատասխան գործառույթները նույնպես աջակցվում են:
- @testset foo()-ն այժմ կարող է օգտագործվել տվյալ ֆունկցիայից թեստային հավաքածու ստեղծելու համար: Փորձարկման դեպքի անվանումը կանչվող ֆունկցիայի անունն է: Կանչված գործառույթը կարող է պարունակել @test և այլ @testset սահմանումներ, այդ թվում՝ այլ գործառույթների զանգերի համար՝ միաժամանակ գրանցելով բոլոր միջանկյալ թեստի արդյունքները:
- TestLogger-ը և LogRecord-ն այժմ արտահանվում են ստանդարտ Test գրադարանից:
- Տարածված
- SSHManager-ն այժմ աջակցում է աշխատանքային թելերը csh/tcsh փաթաթվածով addprocs() մեթոդի և shell=:csh պարամետրի միջոցով:
- Այլ փոփոխություններ
- GC.enable_logging(true)-ը կարող է օգտագործվել աղբահանության յուրաքանչյուր գործողություն գրանցելու համար հավաքված հիշողության ժամանակի և քանակի հետ:
Source: opennet.ru