我怎么能得到julia代码的表达式根据函数和argtypes?



我是Julia的新手。我读了一篇关于Julia静态分析的文章。它给出一个函数。

function foo(x,y)
z = x + y
return 2 * z
end

并使用Julia自省函数code_typed获取输出:

code_typed(foo,(Int64,Int64))
1-element Array{Any,1}:
:($(Expr(:lambda, {:x,:y}, {{:z},{{:x,Int64,0},{:y,Int64,0},{:z,Int64,18}},{}},
:(begin  # none, line 2:
z = (top(box))(Int64,(top(add_int))(x::Int64,y::Int64))::Int64 # line 3:
return (top(box))(Int64,(top(mul_int))(2,z::Int64))::Int64
end::Int64))))

有Expr。但是当我调用code_typed时,输出是:

code_typed(foo, (Int64,Int64))
1-element Vector{Any}:
CodeInfo(
1 ─ %1 = Base.add_int(x, y)::Int64
│   %2 = Base.mul_int(2, %1)::Int64
└──      return %2
) => Int64

有一个CodeInfo。它与doc.

中的输出不同。Julia有零钱吗?以及如何根据我的函数和argtypes获得express ?

该代码片段似乎取自https://www.aosabook.org/en/500L/static-analysis.html,该代码发布于2016年(大约在Julia 1.0发布前两年),并引用了2015年的Julia 0.3版本。

Julia 1.0给出

julia> code_typed(foo,(Int64,Int64))
1-element Array{Any,1}:
CodeInfo(
2 1 ─ %1 = (Base.add_int)(x, y)::Int64                                   │╻ +
3 │   %2 = (Base.mul_int)(2, %1)::Int64                                  │╻ *
└──      return %2                                                     │ 
) => Int64

而当前版本如1.6和1.7给出

julia> code_typed(foo,(Int64,Int64))
1-element Vector{Any}:
CodeInfo(
1 ─ %1 = Base.add_int(x, y)::Int64
│   %2 = Base.mul_int(2, %1)::Int64
└──      return %2
) => Int64

(一个更小的变化,但仍然)

如果出于任何原因,您希望以Exprs的数组或向量的形式获得此结果,您似乎可以使用(例如)

julia> t = code_typed(foo,(Int64,Int64));
julia> t[1].first.code
3-element Vector{Any}:
:(Base.add_int(_2, _3))
:(Base.mul_int(2, %1))
:(return %2)

虽然这可能被认为是一个实现细节,并且在Julia的小版本之间可能会改变。

相关内容

  • 没有找到相关文章