Julia 1.8 ծրագրավորման լեզվի թողարկում

Հասանելի է 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

Добавить комментарий