Стоит задуматься над тем, что на самом деле означает «время компиляции» у Джулии - потому что, вероятно, это не то, о чем вы думаете.
Когда вы определяете функцию:
julia> function somefun()
x::Int = 1
x = 0.5
end
somefun (generic function with 1 method)
Вы не компиляция.На самом деле, Джулия не скомпилирует это, пока вы не позвоните.Компилятор Джулии можно рассматривать как Just-Barely-Ahead-Of-Time, в отличие от типичных конструкций JIT или AOT.
Теперь, когда вы вызываете функцию, она компилирует ее, а затем запускает ее, которая выдаетошибка.Вы можете видеть, что эта компиляция происходит в первый раз, когда вы вызываете функцию - она занимает немного больше времени и памяти, поскольку она генерирует и кэширует специализированный код:
julia> @time try somefun() catch end
0.005828 seconds (6.76 k allocations: 400.791 KiB)
julia> @time try somefun() catch end
0.000107 seconds (6 allocations: 208 bytes)
Так что, возможно, вы можете увидеть это с помощью компиляции ДжулииДля модели не так важно, будет ли он пойман во время компиляции или нет - даже если Джулия отказалась скомпилировать (и кешировать) код, он будет вести себя точно так же, как вы сейчас видите.Он по-прежнему позволит вам определить функцию в первую очередь, и он все равно выдаст свою ошибку только при вызове функции.
Вопрос, который вы хотите задать, - это если Джулияможет (или должен) отловить эту ошибку во время функции определение .И тогда возникает вопрос: можно ли определить метод, который всегда приводит к ошибке?Как насчет функции, подобной error
самой ?В Джулии совершенно нормально определить метод, который безусловно ошибается, как этот, и для этого могут быть веские причины.
Теперь есть способы спросить Джулию, если это так.в состоянии обнаружить, что этот метод всегда будет безоговорочно ошибаться:
julia> @code_typed somefun()
CodeInfo(
1 ─ invoke Base.convert(Main.Int::Type{Int64}, 0.5::Float64)::Union{}
└── $(Expr(:unreachable))::Union{}
) => Union{}
Это самый первый шаг в процессе компиляции Джулии, и в этом случае он может видеть, что все, что за convert(Int, 0.5)
равно unreachable
-то есть это ошибки.Кроме того, он знает, что, поскольку функция никогда не вернется, ее тип возвращаемого значения равен Union{}
(то есть, возможный тип не может быть возвращен!). Таким образом, вы можете попросить Джулию сделать этот шаг, например, с @inferred
макрос как часть набора тестов.