Апублікаваны рэліз мовы праграмавання Julia 1.7, які спалучае такія якасці як высокая прадукцыйнасць, падтрымка дынамічнай тыпізацыі і ўбудаваныя сродкі для паралельнага праграмавання. Сінтаксіс Julia блізкі да MATLAB з запазычаннем некаторых элементаў з Ruby і Lisp. Метад маніпуляцыі радкамі нагадвае Perl. Код праекту распаўсюджваецца пад ліцэнзіяй MIT.
Ключавыя асаблівасці мовы:
- Высокая прадукцыйнасць: адной з ключавых мэт праекта з'яўляецца дасягненне прадукцыйнасці блізкай да праграм на мове Сі. Кампілятар Julia заснаваны на напрацоўках праекту LLVM і генеруе эфектыўны натыўны машынны код для шматлікіх мэтавых платформаў;
- Падтрымка розных парадыгмаў праграмавання, уключаючы элементы аб'ектна-арыентаванага і функцыянальнага праграмавання. Стандартная бібліятэка падае ў тым ліку функцыі для асінхроннага ўводу/высновы, кіраванні працэсамі, вядзенні логаў, прафіляванні і кіраванні пакетамі;
- Дынамічная тыпізацыя: мова не патрабуе відавочнага вызначэння тыпаў для зменных па аналогіі са скрыптовымі мовамі праграмавання. Падтрымліваецца інтэрактыўны рэжым працы;
- Апцыянальная магчымасць відавочнага ўказання тыпаў;
- Сінтаксіс, які выдатна падыходзіць для лікавых вылічэнняў, навуковых разлікаў, сістэм машыннага навучання і візуалізацыі дадзеных. Падтрымка многіх лікавых тыпаў дадзеных і сродкаў для распаралельвання вылічэнняў.
- Магчымасць прамога выкліку функцый з бібліятэк на мове Сі без дадатковых праслоек.
Новыя магчымасці мовы Julia 1.7:
- Новы сінтаксіс для стварэння шматмерных масіваў. Сімвалы кропкі з коскі выкарыстоўваюцца для падзелу вымярэнняў масіва, пры гэтым колькасць кропак з коскі паказвае памер. Напрыклад, адна кропка з коскай у «[A; B]» азначае канкатэнацыю ў першым вымярэнні (па вертыкалі ў аднамерным масіве), дзве кропкі з коскі «[A;; B]» робяць гэта ў другім вымярэнні (па гарызанталі як новы радок матрыцы), тры кропкі з коскі «;;;» у трэцім і г.д.
- Зваротная касая рыса (\) у канцы радка ўсярэдзіне радковага літарала зараз выдаляе знак перакладу радка і водступы. Гэта можна выкарыстоўваць для падзелу доўгіх радкоў на некалькі радкоў кода без дадання лішніх сімвалаў.
- Зваротная касая рыса перад новым радком у літаралах запуску кансольных каманд `cmd \…` зараз заўсёды выдаляе пераклад радка і інтэрпрэтуе паслядоўнасць як бесперапынны радковы литерал, тады як вынік раней не быў выразна вызначаны.
- Выраз «(; a, b) = x» для стварэння асобных зменных a і b з x. Гэты сінтаксіс эквівалентны a = getproperty(x, :a); b = getproperty(x, :b)».
- Няяўнае перамнажэнне зараз дазволена для знакаў радыкалаў (напрыклад, x√y і x∛y).
- Лагічныя аператары "&&" і "||" зараз могуць быць скарыстаны ў дачыненні да элементаў масіва ў форме «.&&» і «.||».
- Аператары ⫪(U + 2AEA, \Top, \downvDash) і ⫫(U + 2AEB, \Bot, \upvDash, \indep) зараз могуць быць скарыстаны ў якасці бінарных аператараў.
- Дададзена опцыя "-check-bounds=yes|no|auto" для кантролю за макрасамі @inbounds са значэннем па-змаўчанні auto.
Змяненні мовы
- Ужывальны па змаўчанні генератар псеўдавыпадковых лікаў зменены з Mersenne Twister на Xoshiro256++, таму ўсе выпадковыя лікі будуць рознымі (нават з адным і тым жа пачатковым лікам), калі толькі не выкарыстоўваецца відавочны аб'ект RNG. Новы генератар мае лепшую прадукцыйнасць, цудоўныя статыстычныя характарыстыкі і выкарыстоўваецца для прайграванай выпадковасці ў шматструменных праграмах (захоўвае стан для кожнай выкананай задачы і адгаліноўвае асобны стан пры стварэнні новай задачы).
- Дэструктурызацыя больш не змяняе значэння ў працэсе прысваення левай часткі пры атрыманні значэнняў з правай часткі выразы. Напрыклад, для масіва x, выраз «x[2], x[1] = x» зараз будзе мяняць месцамі першы і другі элемент x, у той час як раней для запаўнення абедзвюх запісаў выкарыстоўвалася x[1] таму што x[2] змяняўся падчас ітэрацыі прысваення x.
- macroexpand, @macroexpand і @macroexpand1 больш не генеруюць памылку LoadError. @test_throws таксама быў зменены, каб захаваць працаздольнымі закранутыя тэсты.
- Сярэдні пункт «·» (\cdotpU + 00b7) і грэцкі інтэрпрункт ·(U + 0387) зараз апрацоўваюцца як эквівалент аператара пункта «⋅» (\cdotU + 22c5).
- Знак мінус "−" (\minusU + 2212) цяпер разглядаецца як эквівалент знака злучка-мінус "-" (U + 002d).
- Iterators.peel(itr) зараз вяртае "nothing" калі itr пуста, а не выкідвае выключэнне BoundsError.
- Некалькі паслядоўных кропак з коскі ў выразе масіва раней ігнараваліся (напрыклад, «[1;; 2] == [1; 2]»). Цяпер гэты сінтаксіс выкарыстоўваецца для падзелу вымярэнняў.
- Незбалансаваныя дырэктывы фарматавання "#= … =#" у Unicode зараз забароненыя ў радках і каментарах, каб паменшыць верагоднасць ін'екцый parse/eval кода.
Змяненні параметраў каманднага радка
- Параметр julia -project і зменная асяроддзі JULIA_PROJECT зараз падтрымліваюць выбар агульных асяроддзяў. Напрыклад, зараз эквівалентныя julia -project=@myenv і export JULIA_PROJECT="@myenv".
Змены шматструменнасці
- Унутраныя функцыі для аперацый з атамарнымі паказальнікамі зараз вызначаны для пэўных памераў байтаў.
- Дададзена падтрымка аб'явы і выкарыстання асобных палёў для mutable struct як атамарных; гл. новы макрас @atomic.
- Калі для зменнай асяроддзі JULIA_NUM_THREADS зададзена значэнне "auto", тая колькасць струменяў будзе роўна колькасці струменяў працэсара.
- Кожны аб'ект Task мае лакальны стан генератара выпадковых лікаў, што па змаўчанні забяспечвае якое прайграваецца (не якое залежыць ад раскладу) выкананне кода раўналежнага мадэлявання. Генератар па змаўчанні таксама працуе раўналежна значна хутчэй, чым у папярэдніх версіях.
- Задачы зараз могуць перамяшчацца паміж патокамі. Раней задача заўсёды запускалася ў тым патоку, які запусціў яе першым.
Новыя функцыі бібліятэкі
- Дададзеныя метады findmax(f, domain), argmax(f, domain) і адпаведныя "min"-версіі з двума аргументамі.
- isunordered(x) вяртае true, калі x - гэта значэнне, якое павінна быць неўпарадкавана, напрыклад NaN або missing.
- Новая функцыя keepat!(vector, inds), якая з'яўляецца эквівалентам vector[inds] спісу inds цэлых лікаў.
- Метад lock(f, lck) для двух аргументаў зараз прымае Channel якасці другога аргументу.
- Новы функтар Returns(value) вяртае value для любых аргументаў.
- Новыя макрасы @something і, @coalesce якія з'яўляюцца версіямі something і coalesce, адпаведна.
- Новая функцыя redirect_stdio для перанакіравання stdin, stdoutі stderr.
- Новы макрас "Base.@invoke f(arg1::T1, arg2::T2; kwargs…)" забяспечвае просты сінтаксіс для выкліку "invoke(f, Tuple{T1,T2}, arg1, arg2; kwargs…)".
- Новы макрас "Base.@invokelatest f(args…; kwargs…)" забяспечвае зручны спосаб выкліку "Base.invokelatest(f, args…; kwargs…)".
Новыя магчымасці бібліятэкі
- Картэж можа быць створаны з ключавым словам context у фармаце ":key => value", каб паказаць атрыбуты для перадачы ў IOContext.
- bytes2hex і hex2bytes больш не абмяжоўваюцца аргументамі тыпу "Union{String,AbstractVector{UInt8}}" і зараз патрабуюць толькі таго, каб тыпы былі паслядоўнасцямі і мелі вылічальную даўжыню.
- stat(file) атрымаў больш падрабязны і зручны show метад.
Змяненні стандартнай бібліятэкі
- count і findall зараз прымаюць AbstractChar аргумент для пошуку знака ў радку.
- Новыя метады range(start, stop) і range(start, stop, length).
- range зараз падтрымліваецца start як апцыянальны ключавы аргумент.
- Некаторыя аперацыі з дыяпазонамі зараз вяртаюць StepRangeLen замест StepRange дазваляючы быць нулявым канчатковаму кроку. Раней λ.* (1:9) выдаваў памылку пры λ = 0.
- islowercase і isuppercase зараз апрацоўваюць Unicode-катэгорыі ніжняга і верхняга рэгістра.
- iseven і isodd функцыі зараз падтрымліваюць тыпы выдатныя ад Integer.
- escape_string зараз прымае набор сімвалаў праз ключавое слова keep, для сімвалаў, якія павінны заставацца такімі, якія яны ёсць.
- getindex для NamedTuple зараз прымае картэж сімвалаў для індэксацыі некалькіх значэнняў.
- Падтыпы AbstractRange вынікаюць агульным паводзінам індэксацыі масіваў пры індэксаванні Bool, памылках для скаляраў Bool і пры апрацоўцы масіваў (уключаючы дыяпазоны) Bool як лагічных азначнікаў.
- keys(::RegexMatch) вяртае capture-ключы рэгулярнага выраза па імі, ці па азначніку, калі імён няма.
- keys(::Generator) вяртае ключы ітэратара.
- RegexMatch зараз итерируется, выдаючы захопленыя падрадкі.
- lpad/rpad вызначаны ў для textwidth.
- Test.@test зараз прымае найменныя аргументы broken і skip, якія паўтараюць паводзіны Test.@test_broken і Test.@test_skip, але дазваляюць прапускаць тэсты, якія завальваюцца толькі пры вызначаных умовах. Напрыклад if T == Float64 @test_broken isequal(complex(one(T)) / complex(T(Inf), T(-Inf)), complex(zero(T), zero(T))) else @test isequal(complex(one(T)) / complex(T(Inf), T(-Inf)), замяніць на @test isequal(complex(one(T)) / complex(T(Inf), T(-Inf)), complex(zero(T), zero(T))) broken=(T == Float64)
- @lock зараз экспартуецца з Base.
- Эксперыментальная функцыя Base.catch_stack() пераназваная ў current_exceptions() і атрымала пэўны тып якое вяртаецца значэння.
- Некаторыя трыганаметрычныя функцыі (sind, cosd, tand, asind, acosd, asecd, acscd, acotd, atand) зараз прымаюць квадратную матрыцу.
- replace(::String) зараз прымае некалькі шаблонаў, якія будуць ужывацца злева направа адначасова, таму да любога знака будзе ўжывацца толькі адзін шаблон, а шаблоны будуць ужывацца толькі да ўваходнага тэксту, але не да іх паслядоўных замен.
- Функцыя length на зададзеных дыяпазонах вызначаных тыпаў больш не правярае integer-перапаўненне ў большасці выпадкаў. checked_length - новая функцыя, якая выкарыстоўвае правераную арыфметыку да кропкі перапаўнення, калі вынік можа быць з пераносам. Ці выкарыстоўвайце пакет SaferIntegers.jl, калі ёсць рызыка перапаўнення дыяпазону.
- Новыя replace метады для замены элементаў у Tuple.
Мэнэджэр пакетаў
- У рэжыме кансолі "julia>" для using- або import-пакетаў якія не ўсталяваныя, але даступныя ў рэестры "pkg> add", прапануецца ўсталяваць пакет аўтаматычна.
- Manifest.toml выкарыстоўвае новы фармат з новымі метададзенымі, у тым ліку версію julia, якая згенеравала маніфест. Маніфесты старога фармату па-ранейшаму падтрымліваюцца ў зыходным фармаце да таго часу, пакуль карыстальнік не запусціць Pkg.upgrade_manifest().
- "pkg> precompile" зараз будзе папярэдне кампіляваць новыя версіі ўжо загружаных пакетаў, а не адкладаць іх да наступнага сеансу.
- "pkg> rm, pin і free" зараз падтрымліваюць аргумент "-all" для выкліку дзеяння для ўсіх пакетаў адразу.
- Рэестры, загружаныя з Pkg Server (не git), больш не распакоўваюцца ў файлы, а чытаюцца непасрэдна з архіва ў памяць. Каб адключыць гэтую функцыю, усталюеце зменную асяроддзі JULIA_PKG_UNPACK_REGISTRY=true.
- Цяпер можна выкарыстоўваць вонкавы выкананы файл git замест бібліятэкі libgit2 па змаўчанні для загрузак, якія адбываюцца праз пратакол Git, усталяваўшы зменнае асяроддзі JULIA_PKG_USE_CLI_GIT=true.
- Рэестры, загружаныя з сервера Pkg (не git), зараз лічацца нязменнымі. Змены, унесеныя ўручную ў іх файлы, могуць не быць прыняты запушчаным сеансам Pkg.
- Даданне пакетаў па імі каталога ў рэжыме REPL зараз патрабуе дадання "./" да імя, калі пакет знаходзіцца ў бягучым каталогу; напрыклад "add ./Package" замест "add Package". Гэта зроблена для таго, каб пазбегнуць блытаніны паміж імем пакета Package і лакальным каталогам Package.
- Выдалена ключавое слова mode для PackageSpec.
Лінейная алгебра
- Выкарыстоўвайце Libblastrampoline для падлучэння BLAS і LAPACK падчас выканання. Па змаўчанні OpenBLAS падлучаецца ў складзе дыстрыбутыва Julia. Новы механізм падлучэння можа быць скарыстаны для замены BLAS і LAPACK карыстацкімі наладамі.
- На aarch64 OpenBLAS зараз выкарыстоўвае ILP64 BLAS, таксама як і ўсе іншыя 64-бітныя платформы.
- OpenBLAS абноўлены да версіі 0.3.13.
- SuiteSparse абноўлены да версіі 5.8.1.
- Форма матрыцы UpperHessenberg захоўваецца пры вызначаных арыфметычных аперацыях, напрыклад, пры множанні ці дзяленні на UpperTriangular матрыцу.
- Сапраўдныя квазітрохкутныя факторызацыі Шура зараз можна пераўтварыць у складаную верхнетрохкутную форму з дапамогай выраза «Schur{Complex}(S)».
- cis(A) зараз падтрымлівае матрыцы як аргументы.
- dot падтрымлівае UniformScaling для тыпу AbstractMatrix.
- qr[!] і lu[!] зараз падтрымліваюць значэнні LinearAlgebra.PivotingStrategy аднаэлементнага тыпу ў якасці неабавязковага pivot-аргумента: значэнні па змаўчанні qr(A, NoPivot()) у параўнанні qr(A, ColumnNorm()) з паваротам і lu(A, Row NoPivot()) без павароту. Ранейшыя Val{true/false} выклікі састарэлі.
- det(M::AbstractMatrix{BigInt}) выклікае det_bareiss(M), які выкарыстоўвае алгарытм Bareiss для вылічэння дакладных значэнняў.
АДКАЗ
- Доўгія радкі зараз выдаляюцца з выкарыстаннем сінтаксісу «head» ⋯ 12345 bytes ⋯ «tail» пры адлюстраванні ў REPL.
- Устаўка Repl прыкладаў з буфера абмену ў REPL зараз падтрымлівае ўсе рэжымы Repl ( julia, pkg, shell, help?) і рэжым аўтаматычна перамыкаецца.
- "help?>" для модуляў без радкоў дакументацыі зараз вяртае спіс экспартаваных імёнаў і выводзіць змесціва звязанага, README.md калі яно знойдзена.
SparseArrays
- Новы метад sizehint!(::SparseMatrixCSC, ::Integer)\.
- cholesky() зараз цалкам захоўвае паказаную карыстальнікам перастанову.
- issparse зараз ужываецца ўзгоднена да ўсіх масіваў-абертка, уключаючы ўкладзеныя, шляхам праверкі issparse бацькоўскага масіва абгорткі.
Маніпуляцыі з датамі
- Функцыя Dates.periods можа быць скарыстана для атрымання Vector-значэнняў з Period з CompoundPeriod.
Спампаваць
- Калі загаловак cookie усталяваны ў перанакіраваным запыце, cookie зараз будзе адпраўляцца ў наступных запытах.
- Калі файл ~/.netrc існуе, ён выкарыстоўваецца як крыніца пароляў для вэб-сайтаў з аўтэнтыфікацыяй.
- Індыкацыя імя сервера зараз выконваецца з усімі TLS-злучэннямі, нават калі ідэнтычнасць сервера не праверана (гл. NetworkOptions).
- Пры праверцы TLS-злучэнняў у Windows, калі сервер водгуку сертыфікатаў недаступны, злучэнне дазволена; гэта адпавядае таму, што робяць іншыя прыкладанні і як выконваецца водгук у macOS.
- Цяпер існуе 30-секунднае чаканне факта злучэнне і 20-секунднае чаканне на адпраўку дадзеных. Гэта гарантуе, што злучэнні з'яўляюцца жывымі, ці ж яны будуць адключаныя менш чым праз хвіліну.
Смала
- Tar.extract зараз ігнаруе дакладны рэжым дазволаў у tarball і нармалізуе рэжымы гэтак жа, як робіць гэта Tar.create. Што аналагічна git.
- Функцыі, якія выкарыстоўваюць архівы tar, зараз апрацоўваюць цвёрдыя спасылкі: мэтай спасылкі павінен быць раней прагледжаны файл; Tar.list пералічвае запіс з :hardlink тыпам і .link полем, якое паказвае шлях да мэты; іншыя функцыі - Tar.extract, Tar.rewrite, Tar.tree_hash - пераўтвораць жорсткую сувязь у копію мэтавага файла.
- Стандартны фармат, створаны Tar.create і Tar.rewrite зараз уключае запісы для непустых каталогаў. Некаторыя прылады, якія выкарыстоўваюць tarball (уключаючы докер), збіваюцца з панталыку з-за адсутнасці гэтых запісаў у каталогу.
- Tar зараз прымае tarball з пачатковымі прабеламі ў васьмярковых цэлалікавых палях загалоўка: тэхнічна гэта недапушчальны фармат паводле спецыфікацыі POSIX, але старыя tar каманды Solaris стваралі такія архівы, таму гэты фармат сапраўды сустракаецца ў дзікай прыродзе, і здаецца бясшкодным яго прымаць.
- Tar.extract зараз прымае set_permissions аргумент ключавога слова, які па змаўчанні роўны true; калі false перадаецца замест гэтага, дазволы вынятых файлаў не змяняюцца пры выманні.
Mmap
- mmap зараз экспартуецца і даступны для выкарыстання.
DelimitedFiles
- Readdlm зараз па змаўчанні выкарыстоўвае use_mmap=false ва ўсіх аперацыйных сістэмах для забеспячэння стабільнай надзейнасці ў ненармальных сітуацыях з файлавай сістэмай.
Крыніца: opennet.ru
