如何在编译时获取有关 Julia 中符号作用域的信息?

问题描述 投票:0回答:1

我有兴趣了解 Julia 在编译过程中如何确定每个符号的范围。我想获得有关代码中每个符号实例范围的详细信息,最好是编译过程本身的输出。

  1. Julia 中是否有内置方法可以在编译期间获取有关符号作用域的信息?

  2. 是否有任何标志或编译器选项可用于生成此信息作为输出?

  3. 如果没有,是否有任何推荐的方法或工具来分析 Julia 编译器管道中的符号范围?

  4. 任何关于 Julia 编译器如何处理符号解析和范围确定的见解或参考将不胜感激!

这是我尝试过的:

  • 我搜索了 Julia 文档和在线资源,但找不到任何内置功能或标志来实现此目的。
scope compilation julia
1个回答
0
投票

如果你想发现相同的变量名在不同的作用域中使用,你可以尝试使用

@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)
© www.soinside.com 2019 - 2024. All rights reserved.