Выпуск мовы праграмавання Julia 1.8

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

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

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

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

  • Новыя магчымасці мовы
    • Палі змянянай структуры (mutable struct) зараз могуць быць анатаваны як канстанты, каб прадухіліць іх змены і забяспечыць магчымасць аптымізацыі.
    • Анатацыі тыпаў можна дадаваць да глабальных зменных.
    • Пустыя n-мерныя масівы можна ствараць, выкарыстоўваючы некалькі кропак з коскі ўнутры квадратных дужак, напрыклад "[;;;]" стварае масіў 0×0×0.
    • Блокі try зараз могуць дадаткова мець блок else, які выконваецца адразу пасля асноўнага цела, калі не было выдадзена ніякіх памылак.
    • @inline і @noinline можна размяшчаць унутры цела функцыі, што дазваляе анатаваць ананімную функцыю.
    • @inline і @noinline зараз можна прымяняць да функцыі на сайце выкліку або ў блоку, каб прымусова ўключыць (ці не ўключыць) адпаведныя выклікі функцый.
    • ∀, ∃ і ∄ дазволены ў якасці сімвалаў ідэнтыфікатара.
    • Дададзена падтрымка спецыфікацыі Unicode 14.0.0.
    • метад Module(:name, false, false) можна выкарыстоўваць для стварэння модуля, які не ўтрымоўвае імёнаў, не імпартуе Base ці Core і не ўтрымоўвае спасылкі на сябе.
  • Змены ў мове
    • Ізноў створаныя аб'екты Task (@spawn, @async і т. д.) зараз world_age для метадаў з бацькоўскага Task пры стварэнні, што дазваляе аптымізаваць іх выкананне. Папярэдні варыянце актывацыі даступны пры дапамозе метаду Base.invokelatest.
    • Дырэктывы незбалансаванага двунакіраванага фарматавання Unicode зараз забароненыя ў радках і каментарах у пазбяганні ін'екцый.
    • Base.ifelse зараз вызначаецца як агульная функцыя, а не як убудаваная, што дазваляе пакетам пашыраць яе вызначэнне.
    • Кожнае прысваенне глабальнай зменнай зараз спачатку праходзіць праз выклік convert(Any, x) або convert(T, x), калі для глабальнай зменнай быў абвешчаны тып T. Перад выкарыстаннем глабальных зменных, пераканайцеся, што інварыянт convert(Any, x) === x заўсёды праўдзівы, інакш гэта можа прывесці да нечаканых паводзін.
    • Убудаваныя функцыі зараз падобныя на ўніверсальныя функцыі і могуць быць праграмна пералічаныя з дапамогай метадаў.
  • Паляпшэнні кампілятара/асяроддзя выканання
    • Час пачатковай загрузкі скарочана прыкладна на 25 працэнтаў.
    • Кампілятар на аснове LLVM быў аддзелены ад runtime-бібліятэкі ў новую бібліятэку libjulia-codegen. Ён загружаецца па змаўчанні, таму пры звычайным выкарыстанні змен быць не павінна. У разгортваннях, якім не патрэбен кампілятар (напрыклад, сістэмныя выявы, у якіх увесь неабходны код папярэдне скампіляваны), гэтую бібліятэку (і яе LLVM-залежнасць) можна проста выключыць.
    • Выснова ўмоўнага тыпу зараз магчымы праз перадачу аргументу метаду. Напрыклад, для Base.ifelse(isa(x, Int), x, 0) вяртае ::Int, нават калі тып x невядомы.
    • SROA (Scalar Replacement of Aggregates) палепшана: выключае выклікі getfield з пастаяннымі глабальнымі палямі, выключае змяняныя структуры з неініцыялізаваны палямі, павышае прадукцыйнасць і апрацоўку ўкладзеных выклікаў getfield.
    • Выснова тыпаў адсочвае розныя эфекты - пабочныя змены і адсутнасць адкідвання. Улічваецца распаўсюджвання канстант, што значна падвышае прадукцыйнасць падчас кампіляцыі. У некаторых выпадках, напрыклад, выклікі функцый, якія не могуць быць убудаваны па месцы выкліку, але не ўплываюць на вынік, будуць адкінуты на час выканання. Правілы для эфектаў можна перазапісаць уручную з дапамогай макраса Base.@assume_effects.
    • Папярэдняя кампіляцыя (з відавочнымі дырэктывамі папярэдняй кампіляцыі ці зададзенымі працоўнымі нагрузкамі) зараз захоўвае больш кода, вызначанага тыпам, што прыводзіць да скарачэння часу першага запуску. Любыя новыя камбінацыі метадаў/тыпаў, неабходныя вашаму пакету, незалежна ад таго, дзе гэтыя метады былі вызначаны, зараз могуць кэшавацца ў файле прекомпиляции, калі яны выкліканыя метадам, прыналежным вашаму пакету.
  • Змяненні параметраў каманднага радка
    • Паводзіны па змаўчанні для назірання за аб'явамі @inbounds зараз з'яўляюцца опцыяй auto ў "-check-bounds=yes|no|auto".
    • Новая опцыя "-strip-metadata" для выдалення радкоў дакументацыі, інфармацыі аб зыходным месцазнаходжанні і імёнаў лакальных зменных пры стварэнні выявы сістэмы.
    • Новая опцыя «strip-ir» для выдалення кампілятарам прамежкавага падання зыходнага кода пры зборцы выявы сістэмы. Выніковая выява будзе працаваць, толькі калі выкарыстоўваецца «compile=all» або калі ўвесь неабходны код папярэдне скампіляваны.
    • Калі замест імя файла паказаны знак "-", то выкананы код чытаецца са стандартнага струменя ўводу.
  • Змены падтрымкі шматструменнасці
    • Threads.@threads па змаўчанні выкарыстоўвае новы параметр раскладу :dynamic, які адрозніваецца ад папярэдняга рэжыму тым, што ітэрацыі будуць планавацца дынамічна для даступных працоўных струменяў, а не замацоўвацца за кожным струменем. Такі рэжым дазваляе лепш размяркоўваць укладзеныя цыклы з @spawn і @threads.
  • Новыя бібліятэчныя функцыі
    • eachsplit(str) для шматразовага выканання split(str).
    • allequal(itr) для праверкі роўнасці ўсіх элементаў у ітэратары.
    • 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().
    • range прымае альбо stop, альбо length у якасці адзінага аргумента ключавога слова.
    • precision і setprecision зараз прымаюць base ў якасці ключавога слова
    • Аб'екты сокетаў TCP зараз падаюць closewrite метад і падтрымліваюць выкарыстанне напаўадкрытага рэжыму.
    • extrema зараз прымае аргумент init.
    • Iterators.countfrom зараз прымае любы тып, які вызначае метад +.
    • @time зараз вылучае % часу, выдаткаванага на перакампіляванне метадаў са змененымі тыпамі.
  • Змяненні стандартнай бібліятэкі
    • Ключы са значэннем Nothing зараз выдаляюцца з асяроддзя ў addenv.
    • Iterators.reverse (і, такім чынам, last) падтрымлівае eachline.
    • Функцыя length для дыяпазонаў вызначаных тыпаў больш не правярае цэлалікавае перапаўненне. Даступная новая функцыя checked_length, утрымоўвае логіку кантролю пераносу разраду. Пры неабходнасці, выкарыстоўвайце SaferIntegers.jl, для пабудовы тыпу дыяпазону.
    • Ітэратар Iterators.Reverse рэалізуе інвертаванне eachindex, калі гэта магчыма.
  • Мэнэджэр пакетаў
    • Новыя індыкатары ⌃ і ⌅ побач з пакетамі ў статусе "pkg>", для якіх даступныя новыя версіі. ⌅ паказвае, што новыя версіі не могуць быць устаноўлены.
    • Новы аргумент outdated::Bool для Pkg.status (—outdated ці -o у рэжыме REPL), каб паказаць інфармацыю аб пакетах папярэдніх версіі.
    • Новы аргумент compat::Bool для Pkg.status (-compat або -c у рэжыме REPL), каб паказаць любыя запісы [compat] у Project.toml.
    • Новы рэжым "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. Ён робіць гэта на аснове хэш запісаў deps і compat праекта (іншыя палі ігнаруюцца) у маніфесце пры яго дазволе, каб можна было выявіць любую змену ў deps Project.toml або запісах compat без паўторнага дазволу.
    • Калі "pkg> add" не можа знайсці пакет з указаным імем, зараз будуць прапанаваны пакеты з аналагічнымі імёнамі, якія можна дадаць.
    • Версія julia, якая захоўваецца ў маніфесце, больш не ўключае нумар зборкі, т. е. master зараз будзе запісвацца як 1.9.0-DEV.
    • Перапыненне тэсту "pkg>" зараз будзе выяўляцца стабільней, і будзе карэктна вяртаць у REPL.
  • InteractiveUtils
    • Новы макрас @time_imports для справаздачы аб часе, выдаткаваным на імпарт пакетаў і іх залежнасцяў, з вылучэннем часу кампіляцыі і перакампілявання ў працэнтах на імпарт.
  • Лінейная алгебра
    • Падмодуль BLAS зараз падтрымлівае level-2 BLAS функцыі spr!.
    • Стандартная бібліятэка LinearAlgebra.jl зараз цалкам незалежная ад SparseArrays.jl як з пункта гледжання зыходнага кода, так і з пункта гледжання модульнага тэставання. Як следства, разрэджаныя масівы больш не вяртаюцца (няяўна) метадамі з LinearAlgebra, ужытымі да аб'ектаў Base ці LinearAlgebra. У прыватнасці, гэта прыводзіць да наступных крытычных змен:
      • Канкатэнацыі з выкарыстаннем спецыяльных "разрэджаных" матрыц (напрыклад, дыяганальная) зараз вяртаюць шчыльныя матрыцы; Як следства, палі D1 і D2 аб'ектаў SVD, створаныя пры выкліках getproperty, зараз з'яўляюцца шчыльнымі матрыцамі.
      • Метад similar(::SpecialSparseMatrix, ::Type, ::Dims) вяртае шчыльную нулявую матрыцу. Як следства, творы двух-, трох-і сіметрычных трохдыяганальных матрыц сябар на сябра прыводзяць да спараджэння шчыльнай матрыцы. Акрамя таго, пабудова падобных матрыц з трыма аргументамі з адмысловых "разрэджаных" матрыц з (нестатычных) матрыц зараз не атрымоўваецца з-за "zero(::Type{Matrix{T}})".
  • Printf
    • Цяпер для фарматавання шырыні %s і %c выкарыстоўвае аргумент textwidth.
  • Профіль
    • Прафіляванне загрузкі працэсара зараз запісвае метададзеныя, уключаючы патокі і задачы. Profile.print() мае новы аргумент groupby, які дазваляе групаваць струмені, задачы ці ўкладзеныя струмені/задачы, задачы/струмені, а таксама аргументы threads і tasks для забеспячэння фільтрацыі. Акрамя таго, працэнт выкарыстання зараз паведамляецца або як агульны, або па патоках, у залежнасці ад таго, ці прастойвае паток ці не ў кожнай выбарцы. Profile.fetch() уключае новыя метададзеныя па змаўчанні. Для зваротнай сумяшчальнасці з вонкавымі спажыўцамі дадзеных прафілявання яго можна выключыць, перадаўшы include_meta=false.
    • Новы модуль Profile.Allocs дазваляе прафіляваць вылучэнне памяці. Запісваецца трасіроўка стэка, тып і памер кожнага вылучэння памяці, а аргумент sample_rate дазваляе прапускаць наладжвальную колькасць размеркаванняў, змяншаючы нагрузку на прадукцыйнасць.
    • Прафіляванне працэсара з фіксаванай працягласцю зараз можа запускацца карыстачом падчас выканання задач без папярэдняй загрузкі профіля, і справаздача будзе адлюстроўвацца падчас выканання. У MacOS і FreeBSD націсніце ctrl-t або выклічце SIGINFO. Для іншых платформ актывуйце SIGUSR1, г.зн. % kill -USR1 $julia_pid. У Windows гэта недаступна.
  • АДКАЗ
    • RadioMenu зараз падтрымлівае дадатковыя спалучэнні клавіш для прамога выбару параметраў.
    • Паслядоўнасць "?(x, y", за якой ідзе націск TAB, адлюстроўвае ўсе метады, якія можна выклікаць з аргументамі x, y, …. (Прабел у пачатку не дазваляе ўвайсці ў рэжым даведкі.) "MyModule.?(x, y » абмяжоўвае пошук «MyModule". Націск TAB патрабуе, каб па меншай меры адзін аргумент меў тып, больш канкрэтны, чым Any. Або выкарыстоўвайце SHIFT-TAB замест TAB, каб дазволіць любыя сумяшчальныя метады.
    • Новая глабальная зменная err дазваляе атрымаць апошняе выключэнне, падобнае на паводзіны ans з апошнім адказам. Увод err паўторна друкуе інфармацыю аб выключэнні.
  • 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 зараз прымае ключавое слова chartransform, якое можна выкарыстоўваць для падавання карыстацкіх супастаўленняў знакаў, а таксама падаецца функцыя Unicode.julia_chartransform для прайгравання супастаўлення, выкарыстоўванага пры нармалізацыі ідэнтыфікатараў сінтаксічным аналізатарам Julia.
  • тэст
    • '@test_throws "some message" triggers_error()' зараз можна выкарыстоўваць для праверкі таго, ці ўтрымоўвае які адлюстроўваецца тэкст памылкі "some message", незалежна ад пэўнага тыпу выключэння. Таксама падтрымліваюцца рэгулярныя выразы, спісы радкоў і функцыі супастаўлення.
    • @testset foo() зараз можна выкарыстоўваць для стварэння набору тэстаў з зададзенай функцыі. Імя тэставага набору - гэта імя выкліканай функцыі. Выкліканая функцыя можа змяшчаць @test і іншыя азначэнні @testset, у тым ліку для выклікаў іншых функцый, пры гэтым запісваючы ўсе прамежкавыя вынікі тэставання.
    • TestLogger і LogRecord зараз экспартуюцца са стандартнай бібліятэкі Test.
  • размеркаваны
    • SSHManager зараз падтрымлівае працоўныя струмені з абгорткай csh/tcsh праз метад addprocs() і параметр shell=:csh.
  • Іншыя змены
    • GC.enable_logging(true) можна выкарыстоўваць для рэгістрацыі кожнай аперацыі зборкі смецця з указаннем часу і аб'ёму сабранай памяці.

Крыніца: opennet.ru

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