2

我是 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 中的输出不同。

朱莉娅有什么变化吗?以及如何根据我的函数和 argtypes 获得 Expr?

4

1 回答 1

3

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

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

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

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

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 的次要版本之间发生变化。

于 2021-07-30T04:46:09.017 回答