ДЖЕТ.джл
JET🌬️используетъ🌬️систему🌬️вывода🌬️типовъ🌬️Юліи🌬️для🌬️обнаруженія🌬️потенціальныхъ🌬️ошибокъ🌬️и🌬️нестабильности🌬️типовъ.
Примѣчаніе Послѣдняя🌬️версія🌬️серіи🌬️v⓪①①🌬️совмѣстима🌬️только🌬️съ🌬️Юліей🌬️v①·①②. Версія🌬️JET,🌬️совмѣстимая🌬️съ🌬️версіей🌬️①·①①🌬️—🌬️это🌬️серія🌬️v⓪⑨,🌬️но🌬️обратите🌬️вниманіе,🌬️что🌬️исправленія🌬️ошибокъ🌬️и🌬️новыя🌬️функціи,🌬️добавленныя🌬️въ🌬️послѣдующихъ🌬️серіяхъ,🌬️могутъ🌬️быть🌬️недоступны.
Предупрежденіе Изъ-за🌬️тѣсной🌬️интеграціи🌬️JET🌬️съ🌬️компиляторомъ🌬️Юліи🌬️результаты,🌬️представленные🌬️въ🌬️JET,🌬️могутъ🌬️существенно🌬️различаться🌬️въ🌬️зависимости🌬️отъ🌬️используемой🌬️Вами🌬️версіи🌬️Юліи.🌬️Кромѣ🌬️того,🌬️на🌬️результаты🌬️можетъ🌬️вліять🌬️реализація🌬️модуля🌬️Base🌬️и🌬️стандартныхъ🌬️библиотекъ,🌬️входящихъ🌬️въ🌬️составъ🌬️Юліи.
Кромѣ🌬️того,🌬️система🌬️плагиновъ🌬️компилятора🌬️Юліи🌬️всё🌬️ещё🌬️нестабильна,🌬️а🌬️ея🌬️интерфейсъ🌬️часто🌬️мѣняется,🌬️поэтому🌬️каждая🌬️версія🌬️JET🌬️совмѣстима🌬️лишь🌬️съ🌬️ограниченнымъ🌬️числомъ🌬️версій🌬️Юліи.🌬️Менеджеръ🌬️пакетовъ🌬️Юліи🌬️автоматически🌬️выберетъ🌬️и🌬️установитъ🌬️послѣднюю🌬️версию🌬️JET,🌬️совмѣстимую🌬️съ🌬️Вашей🌬️версией🌬️Юліи.🌬️Однако🌬️если🌬️Вы🌬️используете🌬️ночную🌬️версию🌬️Юліи,🌬️обратите🌬️вниманіе,🌬️что🌬️совмѣстимая🌬️версия🌬️JET🌬️можетъ🌬️ещё🌬️не🌬️быть🌬️выпущена,🌬️и🌬️JET,🌬️установленный🌬️черезъ🌬️менеджеръ🌬️пакетовъ🌬️Юліи,🌬️можетъ🌬️работать🌬️некорректно.
Быстрый🌬️Стартъ Дополнительныя🌬️команды,🌬️параметры🌬️и🌬️поясненія🌬️см.🌬️въ🌬️документаціи.
Установка JET🌬️—🌬️это🌬️стандартный🌬️пакетъ🌬️Юліи.🌬️Поэтому🌬️Вы🌬️можете🌬️просто🌬️установить🌬️его🌬️черезъ🌬️встроенный🌬️менеджеръ🌬️пакетовъ🌬️Юліи🌬️и🌬️использовать🌬️такъ🌬️же,🌬️какъ🌬️любой🌬️другой🌬️пакетъ:
julia> using Pkg; Pkg.add("JET") [часть🌬️вывода🌬️опущена]
julia> using JET
Важно Менеджеръ🌬️пакетовъ🌬️установитъ🌬️послѣднюю🌬️версию🌬️JET,🌬️доступную🌬️для🌬️Вашей🌬️версіи🌬️Юліи.🌬️Однако🌬️въ🌬️зависимости🌬️отъ🌬️версій🌬️пакетовъ-зависимостей,🌬️уже🌬️установленныхъ🌬️въ🌬️Вашей🌬️средѣ,🌬️можетъ🌬️быть🌬️установлена🌬️нерабочая🌬️версия🌬️JET.🌬️Въ🌬️такихъ🌬️случаяхъ🌬️самый🌬️надёжный🌬️способъ🌬️установить🌬️и🌬️использовать🌬️работающій🌬️JET🌬️—🌬️создать🌬️временную🌬️среду🌬️(напримеръ,🌬️Pkg.temp())🌬️и🌬️работать🌬️въ🌬️ней🌬️съ🌬️JET.
Обнаруженіе🌬️нестабильности🌬️типа🌬️съ🌬️помощью🌬️@report_opt Нестабильность🌬️типовъ🌬️можно🌬️обнаружить🌬️при🌬️вызовѣ🌬️функцій🌬️съ🌬️помощью🌬️макроса🌬️@report_opt,🌬️который🌬️работаетъ🌬️по🌬️тому🌬️же🌬️принципу,🌬️что🌬️и🌬️макросъ🌬️@code_warntype.🌬️Обратите🌬️вниманіе,🌬️что,🌬️поскольку🌬️JET🌬️опирается🌬️на🌬️выводъ🌬️типовъ🌬️въ🌬️Юліи,🌬️если🌬️цѣпочка🌬️вывода🌬️прерывается🌬️изъ-за🌬️динамической🌬️диспетчеризаціи,🌬️то🌬️всѣ🌬️послѣдующіе🌬️вызовы🌬️функцій🌬️будутъ🌬️неизвѣстны🌬️компилятору,🌬️и🌬️JET🌬️не🌬️сможетъ🌬️ихъ🌬️проанализировать.
julia> @report_opt foldl(+, Any[]; init=0) ═════🌬️Обнаружены🌬️2🌬️возможныя🌬️ошибки🌬️═════ ┌ kwcall(::@NamedTuple{init::Int64}, ::typeof(foldl), op::typeof(+), itr::Vector{Any}) @ Base ./reduce.jl:198 │┌ foldl(op::typeof(+), itr::Vector{Any}; kw::@Kwargs{init::Int64}) @ Base ./reduce.jl:198 ││┌ kwcall(::@NamedTuple{init::Int64}, ::typeof(mapfoldl), f::typeof(identity), op::typeof(+), itr::Vector{Any}) @ Base ./reduce.jl:175 │││┌ mapfoldl(f::typeof(identity), op::typeof(+), itr::Vector{Any}; init::Int64) @ Base ./reduce.jl:175 ││││┌ mapfoldl_impl(f::typeof(identity), op::typeof(+), nt::Int64, itr::Vector{Any}) @ Base ./reduce.jl:44 │││││┌ foldl_impl(op::Base.BottomRF{typeof(+)}, nt::Int64, itr::Vector{Any}) @ Base ./reduce.jl:48 ││││││┌ _foldl_impl(op::Base.BottomRF{typeof(+)}, init::Int64, itr::Vector{Any}) @ Base ./reduce.jl:58 │││││││┌ (::Base.BottomRF{typeof(+)})(acc::Int64, x::Any) @ Base ./reduce.jl:86 ││││││││ обнаружена🌬️диспетчеризація🌬️во🌬️время🌬️выполненія: +(acc::Int64, x::Any)::Any │││││││└──────────────────── ││││││┌ _foldl_impl(op::Base.BottomRF{typeof(+)}, init::Int64, itr::Vector{Any}) @ Base ./reduce.jl:62 │││││││┌ (::Base.BottomRF{typeof(+)})(acc::Any, x::Any) @ Base ./reduce.jl:86 ││││││││ обнаружена🌬️диспетчеризація🌬️во🌬️время🌬️выполненія: +(acc::Any, x::Any)::Any │││││││└────────────────────
Обнаруженіе🌬️ошибокъ🌬️типа🌬️съ🌬️помощью🌬️@report_call Лучше🌬️всего🌬️это🌬️работаетъ🌬️въ🌬️стабильномъ🌬️съ🌬️точки🌬️зрѣнія🌬️типовъ🌬️кодѣ,🌬️поэтому🌬️используйте🌬️@report_opt🌬️какъ🌬️можно🌬️чаще,🌬️прежде🌬️чѣмъ🌬️примѣнять🌬️@report_call.
julia> @report_call foldl(+, Char[])
═════🌬️Обнаружены🌬️2🌬️возможныя🌬️ошибки🌬️═════
┌ foldl(op::typeof(+), itr::Vector{Char}) @ Base ./reduce.jl:198
│┌ foldl(op::typeof(+), itr::Vector{Char}; kw::@Kwargs{}) @ Base ./reduce.jl:198
││┌ mapfoldl(f::typeof(identity), op::typeof(+), itr::Vector{Char}) @ Base ./reduce.jl:175
│││┌ mapfoldl(f::typeof(identity), op::typeof(+), itr::Vector{Char}; init::Base._InitialValue) @ Base ./reduce.jl:175
││││┌ mapfoldl_impl(f::typeof(identity), op::typeof(+), nt::Base._InitialValue, itr::Vector{Char}) @ Base ./reduce.jl:44
│││││┌ foldl_impl(op::Base.BottomRF{typeof(+)}, nt::Base._InitialValue, itr::Vector{Char}) @ Base ./reduce.jl:48
││││││┌ _foldl_impl(op::Base.BottomRF{typeof(+)}, init::Base._InitialValue, itr::Vector{Char}) @ Base ./reduce.jl:62
│││││││┌ (::Base.BottomRF{typeof(+)})(acc::Char, x::Char) @ Base ./reduce.jl:86
││││││││ не🌬️найденъ🌬️подходящій🌬️методъ🌬️+(::Char, ::Char): (op::Base.BottomRF{typeof(+)}).rf::typeof(+)(acc::Char, x::Char)
│││││││└────────────────────
│││││┌ foldl_impl(op::Base.BottomRF{typeof(+)}, nt::Base._InitialValue, itr::Vector{Char}) @ Base ./reduce.jl:49
││││││┌ reduce_empty_iter(op::Base.BottomRF{typeof(+)}, itr::Vector{Char}) @ Base ./reduce.jl:383
│││││││┌ reduce_empty_iter(op::Base.BottomRF{typeof(+)}, itr::Vector{Char}, ::Base.HasEltype) @ Base ./reduce.jl:384
││││││││┌ reduce_empty(op::Base.BottomRF{typeof(+)}, ::Type{Char}) @ Base ./reduce.jl:360
│││││││││┌ reduce_empty(::typeof(+), ::Type{Char}) @ Base ./reduce.jl:343
││││││││││ не🌬️найденъ🌬️подходящій🌬️методъ🌬️zero(::Type{Char}): zero(T::Type{Char})
│││││││││└────────────────────
Анализируйте🌬️пакеты🌬️съ🌬️помощью🌬️report_package Этотъ🌬️инструментъ🌬️ищетъ🌬️всѣ🌬️опредѣленія🌬️методовъ🌬️и🌬️анализируетъ🌬️вызовы🌬️функцій🌬️на🌬️основаніи🌬️ихъ🌬️сигнатуръ.🌬️Обратите🌬️вниманіе,🌬️что🌬️этотъ🌬️инструментъ🌬️менѣе🌬️точенъ,🌬️чѣмъ🌬️@report_call,🌬️поскольку🌬️фактические🌬️типы🌬️входныхъ🌬️данныхъ🌬️для🌬️общихъ🌬️методовъ🌬️неизвѣстны.
julia> using Pkg; Pkg.activate(; temp=true, io=devnull); Pkg.add("AbstractTrees"; io=devnull);
julia> Pkg.status()
Status /private/var/folders/.../Project.toml
[1520ce14] AbstractTrees v0.4.5
julia> using AbstractTrees
julia> report_package(AbstractTrees)
[toplevel-info] Анализъ🌬️опредѣленія🌬️верхняго🌬️уровня🌬️(прогрессъ: 256/256)
[toplevel-info] Проанализированы🌬️всѣ🌬️опредѣленія🌬️верхняго🌬️уровня🌬️(всего: 256 | проанализировано: 256 | закэшировано: 0 | заняло: 7,116 сек)
═════🌬️обнаружено🌬️7🌬️возможныхъ🌬️ошибокъ🌬️═════
┌ isroot(root::Any, x::Any) @ AbstractTrees .../base.jl:102
│ не🌬️найденъ🌬️подходящій🌬️методъ🌬️parent(::Any, ::Any): AbstractTrees.parent(root::Any, x::Any)
└────────────────────
... (остальныя🌬️ошибки🌬️опущены🌬️для🌬️краткости)
julia> report_package(AbstractTrees; target_modules=(AbstractTrees,)) # игнорируйте🌬️ошибки,🌬️возникающія🌬️внѣ🌬️контекста🌬️модуля🌬️AbstractTrees ═════🌬️Обнаружено🌬️5🌬️возможныхъ🌬️ошибокъ🌬️═════ ...
Ограниченія JET🌬️анализируетъ🌬️функціи,🌬️которые🌬️Вы🌬️вызываете🌬️напрямую,🌬️а🌬️также🌬️ихъ🌬️выводимые🌬️вызываемые🌬️объекты.🌬️Однако🌬️если🌬️типы🌬️аргументовъ🌬️для🌬️вызова🌬️не🌬️могутъ🌬️быть🌬️выведены,🌬️JET🌬️не🌬️анализируетъ🌬️вызываемый🌬️объектъ.🌬️Слѣдовательно,🌬️отчётъ🌬️о🌬️"No errors detected"🌬️не🌬️означаетъ,🌬️что🌬️во🌬️всей🌬️Вашей🌬️кодовой🌬️базѣ🌬️нѣтъ🌬️ошибокъ.🌬️Чтобы🌬️повысить🌬️достовѣрность🌬️результатовъ🌬️JET,🌬️используйте🌬️@report_opt🌬️для🌬️проверки🌬️того,🌬️что🌬️Вашъ🌬️кодъ🌬️можно🌬️вывести.
Подтвержденіе Этотъ🌬️проектъ🌬️начался🌬️съ🌬️моей🌬️дипломной🌬️работы🌬️въ🌬️Кіотскомъ🌬️университетѣ🌬️подъ🌬️руководствомъ🌬️профессора🌬️Такаси🌬️Сакурагавы.🌬️Насъ🌬️очень🌬️вдохновилъ🌬️ruby/typeprof,🌬️экспериментальный🌬️инструментъ🌬️для🌬️пониманія🌬️и🌬️проверки🌬️типовъ🌬️въ🌬️Ruby.🌬️Дипломная🌬️работа🌬️по🌬️этому🌬️проекту🌬️опубликована🌬️на🌬️https://github.com/aviatesk/grad-thesis,🌬️но🌬️пока🌬️доступна🌬️только🌬️на🌬️японскомъ🌬️языкѣ.