如何区分 Julia codeinfo 插槽中的参数和局部变量?
How can I distinguish arguments and local variables in slot of Julia codeinfo?
我正在研究Julia静态分析,我有以下功能:
function f(x,y,z)
d=x+y
d=d*2*z
end
我用code_typed来分析一下
julia> y=code_typed(f)
1-element Vector{Any}:
CodeInfo(
1 ─ %1 = (x + y)::Any
│ %2 = (%1 * 2)::Any
│ %3 = (%2 * z)::Any
└── return %3
) => Any
我可以得到它的插槽和插槽类型。
julia> y[1].first.slotnames
5-element Vector{Symbol}:
Symbol("#self#")
:x
:y
:z
:d
julia> y[1].first.slottypes
5-element Vector{Any}:
Core.Const(f)
Any
Any
Any
Any
但是我有什么办法知道哪个是参数,哪个是槽中的局部变量?
您可以使用 Base.argnames
找出函数的参数:
julia> Base.method_argnames.(methods(f))
1-element Vector{Vector{Symbol}}:
[Symbol("#self#"), :x, :y, :z]
您也可以从 CodeInfo
对象中提取:
julia> Base.method_argnames(y[1].first.parent.def)
4-element Vector{Symbol}:
Symbol("#self#")
:x
:y
:z
我正在研究Julia静态分析,我有以下功能:
function f(x,y,z)
d=x+y
d=d*2*z
end
我用code_typed来分析一下
julia> y=code_typed(f)
1-element Vector{Any}:
CodeInfo(
1 ─ %1 = (x + y)::Any
│ %2 = (%1 * 2)::Any
│ %3 = (%2 * z)::Any
└── return %3
) => Any
我可以得到它的插槽和插槽类型。
julia> y[1].first.slotnames
5-element Vector{Symbol}:
Symbol("#self#")
:x
:y
:z
:d
julia> y[1].first.slottypes
5-element Vector{Any}:
Core.Const(f)
Any
Any
Any
Any
但是我有什么办法知道哪个是参数,哪个是槽中的局部变量?
您可以使用 Base.argnames
找出函数的参数:
julia> Base.method_argnames.(methods(f))
1-element Vector{Vector{Symbol}}:
[Symbol("#self#"), :x, :y, :z]
您也可以从 CodeInfo
对象中提取:
julia> Base.method_argnames(y[1].first.parent.def)
4-element Vector{Symbol}:
Symbol("#self#")
:x
:y
:z