在Julia中访问通用函数的AST
如何访问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),(
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了<代码>转储只是漂亮地打印它。