Даступны мова праграмавання Julia 1.9

Апублікаваны рэліз мовы праграмавання Julia 1.9, які спалучае такія якасці як высокая прадукцыйнасць, падтрымка дынамічнай тыпізацыі і ўбудаваныя сродкі для паралельнага праграмавання. Сінтаксіс Julia блізкі да MATLAB з запазычаннем некаторых элементаў з Ruby і Lisp. Метад маніпуляцыі радкамі нагадвае Perl. Код праекту распаўсюджваецца пад ліцэнзіяй MIT.

Ключавыя асаблівасці мовы:

  • Высокая прадукцыйнасць: адной з ключавых мэт праекта з'яўляецца дасягненне прадукцыйнасці блізкай да праграм на мове Сі. Кампілятар Julia заснаваны на напрацоўках праекту LLVM і генеруе эфектыўны натыўны машынны код для шматлікіх мэтавых платформаў;
  • Падтрымка розных парадыгмаў праграмавання, уключаючы элементы аб'ектна-арыентаванага і функцыянальнага праграмавання. Стандартная бібліятэка падае ў тым ліку функцыі для асінхроннага ўводу/высновы, кіраванні працэсамі, вядзенні логаў, прафіляванні і кіраванні пакетамі;
  • Дынамічная тыпізацыя: мова не патрабуе відавочнага вызначэння тыпаў для зменных па аналогіі са скрыптовымі мовамі праграмавання. Падтрымліваецца інтэрактыўны рэжым працы;
  • Апцыянальная магчымасць відавочнага ўказання тыпаў;
  • Сінтаксіс, які выдатна падыходзіць для лікавых вылічэнняў, навуковых разлікаў, сістэм машыннага навучання і візуалізацыі дадзеных. Падтрымка многіх лікавых тыпаў дадзеных і сродкаў для распаралельвання вылічэнняў.
  • Магчымасць прамога выкліку функцый з бібліятэк на мове Сі без дадатковых праслоек.

Асноўныя змены ў Julia 1.9:

  • Новыя магчымасці мовы
    • Дазволена выкананне прысваенняў у іншым модулі з дапамогай "setproperty!(::Module, ::Symbol, x)".
    • Дазволена множнае прысвойванне не ў фінальнай пазіцыі. Напрыклад радок "a, b…, c = 1, 2, 3, 4" будзе апрацаваны як "a = 1; b…, = 2, 3; c = 4». Гэта апрацоўваецца праз Base.split_rest.
    • Літаралы асобных знакаў зараз падтрымліваюць той жа сінтаксіс, што і радковыя литералы; г.зн. сінтаксіс можа прадстаўляць недапушчальныя паслядоўнасці UTF-8, як гэта дазволена тыпам Char.
    • Дададзена падтрымка спецыфікацыі Unicode 15.
    • Укладзеныя камбінацыі картэжаў і найменныя картэжы знакаў зараз можна выкарыстоўваць у якасці параметраў тыпу.
    • Новыя ўбудаваныя функцыі "getglobal(::Module, ::Symbol[, order])" і "setglobal!(::Module, ::Symbol, x[, order])" для чытання і запісы выключна ў глабальныя зменныя. Метад getglobal зараз павінен быць пераважней для доступу да глабальных зменных, чым метад getfield.
  • Змены ў мове
    • Макрас @invoke, прадстаўлены ў версіі 1.7, зараз экспартуецца і даступны для выкарыстання. Акрамя таго, зараз ён выкарыстоўвае метад "Core.Typeof(x)", а не "Any" у выпадку, калі анатацыя тыпу апушчана для аргументу "x". Гэта неабходна для таго, каб тыпы, якія перадаюцца ў якасці аргументаў, апрацоўваліся правільна.
    • Уключана экспартаванне функцыі "invokelatest" і макраса "@invokelatest", якія з'явіліся ў версіі 1.7.
  • Паляпшэнні кампілятара/асяроддзя выканання
    • Значна скарочаны час да першага выканання (TTFX - Time to first execution). Папярэдняя кампіляцыя пакета зараз захоўвае машынны код у "pkgimage", што азначае, што код, згенераваны падчас папярэдняй кампіляцыі, не запатрабуе паўторнай кампіляцыі пасля загрузкі пакета. Выкарыстанне рэжыму pkgimages можна адключыць з дапамогай опцыі "-pkgimages=no".
    • Выпраўлена вядомая праблема квадратычнай складанасці вывядзення тыпаў, і ў цэлым выснова выкарыстоўвае менш памяці. Некаторыя межавыя выпадкі з аўтаматычна згенераванымі доўгімі функцыямі (напрыклад, ModelingToolkit.jl з раўнаннямі ў прыватных вытворных і вялікімі прычынна-выніковымі мадэлямі) кампілююцца нашмат хутчэй.
    • Выклікі з аргументамі без канкрэтных тыпаў зараз могуць быць аптымізаваныя метадам Union-splitting для ўкаранення ці статычнага дазволу, нават калі існуе некалькі рознатыпавых кандыдатаў для дыспетчарызацыі. Гэта можа палепшыць прадукцыйнасць у пэўных сітуацыях, калі тыпы аб'ектаў не цалкам статычна дазволеныя, за кошт статычнага дазволу сайтаў выкліку "@nospecialize-d" і пазбягання паўторнай кампіляцыі.
    • Усе варыянты выкарыстання макраса @pure у модулі Base заменены на Base.@assume_effects.
    • Выклікі invoke(f, invokesig, args…) з менш канкрэтнымі тыпамі чым звычайна выкарыстоўваюцца для f(args…) больш не прыводзяць да перакампілявання пакета.
  • Змяненні параметраў каманднага радка
    • У Linux і Windows параметр "—threads=auto" зараз спрабуе вызначыць даступную колькасць працэсараў на аснове CPU affinity, маска якога звычайна ўсталёўваецца ў асяроддзях высокапрадукцыйных вылічэнняў і хмарных асяроддзях.
    • Адключаны параметр "—math-mode=fast", замест якога рэкамендуецца выкарыстоўваць макрас "@fastmath", які мае выразна пэўную семантыку.
    • Параметр «—threads» зараз мае фармат «auto» | N[,auto|M]», дзе M паказвае колькасць ствараных інтэрактыўных струменяў (у наш час auto азначае 1).
    • Дададзена опцыя «—heap-size-hint= », усталёўвальная парог, пасля якога пачынаецца актыўная зборку смецця. Памер можа быць паказаны ў байтах, кілабайтах (1000 КБ), мегабайтах (300 МБ) ці гігабайтах (1,5 ГБ).
  • Змены ў шматструменнасці
    • "Threads.@spawn" зараз мае апцыянальны першы аргумент са значэннем ": default" ці ": interactive". Інтэрактыўная задача патрабуе малой затрымкі водгуку і разлічана быць кароткай ці часта выкананай. Інтэрактыўныя задачы будуць выконвацца ў інтэрактыўных патоках, калі яны пазначаны пры запуску Julia.
    • Струмені, запушчаныя па-за асяроддзем выканання Julia (напрыклад, з C ці Java), зараз могуць выклікаць код Julia, выкарыстаючы «jl_adopt_thread». Гэта адбываецца аўтаматычна пры ўводзе кода Julia праз "cfunction" ці кропку ўваходу "@ccallable". Як следства, колькасць патокаў зараз можа змяняцца падчас выканання.
  • Новыя бібліятэчныя функцыі
    • Новая функцыя "Iterators.flatmap".
    • Новая функцыя "pkgversion(m::Module)" для атрымання версіі пакета, які загрузіў дадзены модуль, аналагічна "pkgdir(m::Module)".
    • Новая функцыя "stack(x)", якая абагульняе "reduce(hcat, x::Vector{<:Vector})" да любой памернасці і дапушчае любы ітэратар ітэратараў. Метад "stack(f, x)" абагульняе "mapreduce(f, hcat, x)" і з'яўляецца больш эфектыўным.
    • Новы макрас для аналізу выдзеленай памяці "@allocations", аналагічны "@allocated", за выключэннем таго, што вяртае колькасць аперацый вылучэння памяці, а не агульны памер выдзеленай памяці.
  • Новыя магчымасці бібліятэкі
    • "RoundFromZero" зараз працуе для тыпаў, выдатных ад "BigFloat".
    • "Dict" зараз можна паменшыць уручную з дапамогай "sizehint!".
    • "@time" зараз паказвае асобна адсотак часу, выдаткаванага на перакампіляванне несапраўдных метадаў.
  • Змяненні ў стандартнай бібліятэцы
    • Ухіленая праблема раўналежнага доступу ў метадах ітэрацыі для Dict і іншых вытворных аб'ектаў, такіх як keys(::Dict), values(::Dict) і Set. Гэтыя метады ітэрацыі зараз можна выклікаць для Dict або Set паралельна для неабмежаванай колькасці патокаў пры ўмове, што няма дзеянняў, якія змяняюць слоўнік ці набор.
    • Адмаўленне функцыі-прэдыката "!f" зараз вяртае складовую функцыю "(!) ∘ f" замест ананімнай функцыі.
    • Функцыі зрэзу памернасці зараз працуюць у некалькіх вымярэннях: "eachslice", "eachrow" і "eachcol" вяртаюць аб'ект "Slices", які дазваляе выконваць дыспетчарызацыю для прадастаўлення больш эфектыўных метадаў.
    • У агульнадаступны API дададзены макрас "@kwdef".
    • Выпраўлена праблема з парадкам аперацый у "fld1".
    • Сартаванне зараз заўсёды стабільная па часе (перапрацаваны QuickSort).
    • "Base.splat" цяпер экспартуецца. Вяртаецца значэнне ўяўляе сабой тып "Base.Splat", а не ананімную функцыю, што дазваляе яго прыгожа выводзіць.
  • Мэнэджэр пакетаў
    • "Package Extensions": падтрымка загрузкі фрагмента кода з іншых пакетаў, загружаных у сеансе Julia. Ужыванне падобнае з пакетам "Requires.jl", але падтрымліваецца папярэдняя кампіляцыя і сумяшчальнасць налад.
  • Бібліятэка LinearAlgebra
    • З-за рызыкі блытаніны з паэлементным дзяленнем выдалены метады "a/b" і "b\a" са скалярам "a" і вектарам "b", якія былі эквівалентныя "a*pinv(b)".
    • Для выкліку BLAS і LAPACK зараз ужываецца "libblastrampoline (LBT)". OpenBLAS пастаўляецца па змаўчанні, але зборка выявы сістэмы з іншымі бібліятэкамі BLAS/LAPACK не падтрымліваецца. Замест гэтага рэкамендуецца выкарыстоўваць механізм LBT для замены BLAS/LAPACK на іншы існуючы камплект бібліятэк.
    • "lu" падтрымлівае новую стратэгію павароту матрыцы "RowNonZero()", якая выбірае першы ненулявы элемент павароту для выкарыстання з новымі арыфметычнымі тыпамі і для навучальных мэт.
    • "normalize(x, p=2)" зараз падтрымлівае любую нармаваную вектарную прастору "x", уключаючы скаляры.
    • Колькасць струменяў BLAS па змаўчанні зараз роўна колькасці струменяў CPU на архітэктуры ARM і палове ліку струменяў CPU на іншых архітэктурах.
  • Printf: Для лепшай чытальнасці перапрацаваны паведамленні аб памылках для радкоў няправільнага фармату.
  • Profile: Новая функцыя "Profile.take_heap_snapshot(file)", якая запісвае файл у фармаце ".heapsnapshot" на аснове JSON, які падтрымліваецца ў Chrome.
  • Random: randn і randexp зараз працуюць для любога тыпу AbstractFloat, які вызначае rand.
  • АДКАЗ
    • Націск камбінацыі клавіш "Alt-e" зараз адкрывае бягучы ўвод у рэдактары. Змесціва (калі яно зменена) будзе выканана пры выхадзе з рэдактара.
    • Бягучы кантэкст модуля, актыўны ў REPL, можна змяніць (па змаўчанні гэта Main) з дапамогай функцыі "REPL.activate(::Module)" або шляхам уводу модуля ў REPL і націскі камбінацыі клавіш "Alt-m".
    • Рэжым "нумараванай падказкі", які выводзіць лікі для кожнага ўваходу і вынахаду і захоўвае ацэненыя вынікі ў Out, можа быць актываваны з дапамогай "REPL.numbered_prompt!()".
    • Аўтададатак з дапамогай табуляцыі адлюстроўвае даступныя аргументы ключавога слова.
  • SuiteSparse: Код для решателя "SuiteSparse" перамешчаны ў "SparseArrays.jl". Вырашальнікі зараз паўторна экспартуюцца "SuiteSparse.jl".
  • SparseArrays
    • Вырашальнікі «SuiteSparse» зараз даступныя як падмодулі «SparseArrays».
    • Рэжымы абароны патокаў UMFPACK і CHOLMOD палепшаны за кошт выключэння глабальных пераменных і выкарыстання блакіровак. Шматструменны "ldiv!" аб'ектаў UMFPACK зараз можна выконваць бяспечна.
    • Эксперыментальная функцыя "SparseArrays.allowscalar(::Bool)" дазваляе адключаць або ўключаць скалярнае індэксаванне разрэджаных масіваў. Гэта функцыя прызначана для выяўлення выпадковага скалярнага індэксавання аб'ектаў "SparseMatrixCSC", што з'яўляецца распаўсюджанай крыніцай праблем з прадукцыйнасцю.
  • Новы адмоваўстойлівы рэжым для набораў тэстаў, які датэрмінова завяршае тэставы запуск у выпадку збою ці памылкі. Усталёўваецца альбо праз "@testset kwarg failfast=true", альбо "export JULIA_TEST_FAILFAST=true". Падобнае бывае неабходна ў запусках CI для датэрміновага атрымання паведамленняў аб памылцы.
  • Dates: Пустыя радкі больш не аналізуюцца няправільна як дапушчальныя значэнні "DateTime", "Dates" ці "Times" і замест гэтага выдаюць памылку "ArgumentError" у канструктарах і сінтаксічным аналізе, у той час як "tryparse" нічога не вяртае.
  • Пакет Distributed
    • Канфігурацыя пакета (актыўны праект, "LOAD_PATH", "DEPOT_PATH") цяпер распаўсюджваецца пры даданні лакальных працоўных працэсаў (напрыклад, з дапамогай "addprocs(N::Int)" або з дапамогай сцяга каманднага радка "-procs=N").
    • "addprocs" для лакальных працоўных працэсаў зараз прымае аргумент з імем "env" для перадачы зменных асяроддзі працоўным працэсам.
  • Unicode: "graphemes(s, m:n)" вяртае падрадок ад m-й да n-й графемы ў "s".
  • Пакет DelimitedFiles вынесены з сістэмных бібліятэк і зараз распаўсюджваецца як асобны пакет, які павінен быць відавочна ўсталяваны для выкарыстання.
  • Вонкавыя залежнасці
    • У Linux аўтаматычна вызначаецца версія сістэмнай бібліятэкі libstdc++ і калі яна навейшая, то загружаецца. Старыя паводзіны загрузкі ўбудаванай libstdc++ незалежна ад версіі сістэмы можна аднавіць, усталяваўшы зменную асяроддзі "JULIA_PROBE_LIBSTDCXX=0".
    • З бінарнага файла julia выдалены "RPATH", што можа прывесці ў Linux да паломкі бібліятэк, якім не атрымалася вызначыць зменную "RUNPATH".
    • Паляпшэнні прылад: Выснова «MethodError» і метадаў (напрыклад з «methods(my_func)») зараз аформлены і размаляваны ў адпаведнасці з прынцыпам высновы метадаў пры трасіроўцы стэка.

    Крыніца: opennet.ru

Дадаць каментар