反思与反省
Julia提供了多种运行时反射功能。
数据类型字段
julia> struct Point
x::Int
y
end
julia> fieldnames(Point)
(:x, :y)
A中每个字段的类型 点 对象存储在 类别 领域的 点 变量本身:
julia> Point.types
svec(Int64, Any)
而 x 被注释为 Int型, y 因此,在类型定义中没有说明 y 默认为 任何 类型。
类型本身表示为一个称为 数据类型:
julia> typeof(Point)
DataType
请注意 字段名(数据类型) 给出每个字段的名称 数据类型 本身,其中一个领域是 类别 在上面的例子中观察到的场。
数据类型布局
A的内部表示 数据类型 在与C代码接口时是非常重要的,并且有几个函数可以用来检查这些细节。 isbitstype(T::数据类型)如果返回true T 以C兼容的对齐方式存储。 fieldoffset(T::DataType,i::Integer)返回字段_i_相对于类型开头的(字节)偏移量。
膨胀和降低
julia> InteractiveUtils.macroexpand(@__MODULE__, :(@edit println("")) )
:(InteractiveUtils.edit(println, (Base.typesof)("")))
功能 基地。元。显示_sexpr 和 垃圾场用于显示任何表达式的S-expr样式视图和深度嵌套细节视图。
最后, 元。较低函数给出 降低了 任何表达式的形式,对于理解语言结构如何映射到原始操作(如赋值、分支和调用)特别感兴趣:
julia> Meta.lower(@__MODULE__, :( [1+2, sin(0.5)] ))
:($(Expr(:thunk, CodeInfo(
1 ─ %1 = :+
│ %2 = dynamic (%1)(1, 2)
│ %3 = sin
│ %4 = dynamic (%3)(0.5)
│ %5 = dynamic Base.vect(%2, %4)
└── return %5
))))
中间和编译表示
检查函数的降低形式需要选择要显示的特定方法,因为泛型函数可能有许多具有不同类型签名的方法。 为此,可以使用以下方法特定的代码降低 [医鳕鱼],并且类型推断形式可使用 代码类型. code_warntype增加高亮显示的输出 代码类型.
为了方便起见,上面的函数有宏版本,它们接受标准函数调用并自动展开参数类型:
julia> @code_llvm +(1,1)
; @ int.jl:87 within `+`
; Function Attrs: sspstrong uwtable
define i64 @"julia_+_476"(i64 signext %0, i64 signext %1) #0 {
top:
%2 = add i64 %1, %0
ret i64 %2
}
有关更多信息,请参阅 @code_lowered, @code_typed, @code_warntype, @code_llvm,和 @code_native.
调试信息的打印
上述函数和宏采用关键字参数 debuginfo,debuginfo 控制打印的级别调试信息。
julia> InteractiveUtils.@code_typed debuginfo=:source +(1,1)
CodeInfo(
@ int.jl:87 within `+`
1 ─ %1 = intrinsic Base.add_int(x, y)::Int64
└── return %1
) => Int64
可能的值 debuginfo,debuginfo 是: :无, :资料来源,而 :默认值. 不打印每个默认调试信息,但可以通过设置更改 基地。IRShow。default_debuginfo[]=:来源.