在Julia中访问通用函数的AST

在Julia中访问通用函数的AST,julia,Julia,如何访问Julia中泛型函数的抽象语法树?由于多次分派,我不确定是否存在与泛型函数关联的AST。如果您正在编写函数定义fbody,您应该能够通过执行dump(quote(fbody))来获取AST。总而言之:Simon似乎在寻找与泛型函数关联的特定方法的AST。我们可以获得一个LambdaStaticData对象,该对象包含AST,具体方法如下: julia> f(x,y)=x+y julia> f0 = methods(f, (Any, Any))[1] ((Any,Any),(

如何访问Julia中泛型函数的抽象语法树?

由于多次分派,我不确定是否存在与泛型函数关联的AST。如果您正在编写函数定义
fbody
,您应该能够通过执行
dump(quote(fbody))
来获取AST。总而言之:Simon似乎在寻找与泛型函数关联的特定方法的AST。我们可以获得一个
LambdaStaticData
对象,该对象包含AST,具体方法如下:

julia> f(x,y)=x+y

julia> f0 = methods(f, (Any, Any))[1]
((Any,Any),(),AST(:($(expr(:lambda, {x, y}, {{}, {{x, Any, 0}, {y, Any, 0}}, {}}, quote  # none, line 1:
        return +(x,y)
    end)))),())

julia> f0[3]
AST(:($(expr(:lambda, {x, y}, {{}, {{x, Any, 0}, {y, Any, 0}}, {}}, quote  # none, line 1:
        return +(x,y)
    end))))

julia> typeof(ans)
LambdaStaticData
显然,此AST可以是Expr对象或压缩的AST对象,表示为字节序列:

julia> typeof(f0[3].ast)
Array{Uint8,1}
来自
base/show.jl
LambdaStaticData
show()
方法说明了在遇到以下情况时如何解压缩:

julia> ccall(:jl_uncompress_ast, Any, (Any, Any), f0[3], f0[3].ast)
:($(expr(:lambda, {x, y}, {{}, {{x, Any, 0}, {y, Any, 0}}, {}}, quote  # none, line 1:
        return +(x,y)
    end)))

julia> typeof(ans)
Expr

Julia有四个函数和四个类似于这些函数的宏,用于检查大量有关泛型函数的方法:

julia>f(x,y)=x+y
f(带1方法的泛型函数)
julia>方法(f)
#1通用函数“f”的方法:
无时的f(x,y):1
降低代码:
julia>code_(f,(Int,Int))
一元数组{Any,1}:
:($(Expr(:lambda,{:x,:y},{{{},{:x,:Any,0},{:y,:Any,0}},{},:(begin#none,第1行:
返回x+y
(完)
朱莉娅>@code_降低了f(1,1)#两个'Int's
…输出相同。
键入的代码:
julia>键入的代码(f,(Int,Int))
一元数组{Any,1}:
:($(Expr(:lambda,{:x,:y},{{},{{:x,Int64,0},{:y,Int64,0},{},:(begin#none,第1行:
返回(顶部(框))(Int64,(顶部(add_int))(x::Int64,y::Int64))::Int64
结束::Int64)))
朱莉娅>@code_降低了f(1,1)#两个'Int's
…输出相同。
LLVM代码:
julia>code\u llvm(f,(Int,Int))
定义i64@julia_f_24771(i64,i64){
顶部:
%2=添加i64%1、%0、!dbg!1014
ret i64%2,!dbg!1014
}                           
朱莉娅>@code_llvm f(1,1)#都是'Int's
…输出相同。
本机代码:
julia>code_native(f,(Int,Int))
.文本
文件名:无
来源行:1
推动RBP
mov RBP,RSP
来源行:1
加上RDI,RSI
莫夫拉克斯,RDI
流行限制性商业惯例
ret
朱莉娅>@code_llvm f(1,1)#都是'Int's
…输出相同。
类型不稳定警告(v0.4+):
julia>@code\u类型f(1,1)
变量:
x::Int64
y::Int64
正文:
从[17]第1行开始:
返回(顶部(框))(Int64,(顶部(add_int))(x::Int64,y::Int64))
结束::Int64


我发现你可以通过
方法(f,签名)
找到特定的方法。但是,其中的AST是
Uint8数组
,而不是
Expr
对象。关于如何转换它有什么想法吗?@DiegoJavierZea你知道如何从
dump(引号f end)
获得结果吗?它不返回任何内容,但打印我感兴趣的AST。
quote f end
已经是AST了<代码>转储只是漂亮地打印它。