我有兴趣了解 Julia 在编译过程中如何确定每个符号的范围。我想获得有关代码中每个符号实例范围的详细信息,最好是编译过程本身的输出。
Julia 中是否有内置方法可以在编译期间获取有关符号作用域的信息?
是否有任何标志或编译器选项可用于生成此信息作为输出?
如果没有,是否有任何推荐的方法或工具来分析 Julia 编译器管道中的符号范围?
任何关于 Julia 编译器如何处理符号解析和范围确定的见解或参考将不胜感激!
这是我尝试过的:
如果你想发现相同的变量名在不同的作用域中使用,你可以尝试使用
@code_warntype
:
考虑产生
5
的代码。
function f()
x = 5
for x in 2:2
print(x)
end
x
end
您可以通过运行发现一些范围问题与 x 相关:
julia> @code_warntype f()
MethodInstance for f()
from f() @ Main REPL[25]:1
Arguments
#self#::Core.Const(f)
Locals
@_2::Union{Nothing, Tuple{Int64, Int64}}
x@_3::Int64
x@_4::Int64
Body::Int64
1 ─ (x@_3 = 5)
...
通过观察
x
和x@_3
,可以发现x@_4
在不同范围内有不同的含义。
另一个有用的功能是
Base.@locals
。
考虑这个函数:
function f()
x = 5
for y in 2:2
@show Base.@locals
end
end
比你有:
julia> f()
#= REPL[29]:4 =# Base.@locals() = Dict{Symbol, Any}(:y => 2, :x => 5)