分析与反省
模块绑定
"模块"的公共名称可通过函数获得 `names(m::Module)',它返回一个元素数组 `符号'表示公共绑定。 'Names(m::Module,all=true)`函数返回`m`中所有绑定的字符,而不考虑公共可用性状态。
数据类型字段
julia> struct Point
x::Int
y
end
julia> fieldnames(Point)
(:x, :y)
'Point’对象中每个字段的类型存储在’Point’变量本身的’types’字段中:
julia> Point.types
svec(Int64, Any)
虽然变量’x’被标记为’Int`,但注释在类型定义中从`y`中删除,因此`y`默认情况下具有类型`Any'。
类型本身表示为"数据类型"结构:
julia> typeof(Point)
DataType
请注意,'fieldnames(DataType)`函数返回`DataType`结构本身的每个字段的名称,其中一个字段是上面示例中显示的`types’字段。
亚型
可以使用函数获得任何类型的"数据类型"的中介子类型列表 '亚型'。 例如,对于抽象类型’DataType` `AbstractFloat'四个(特定)亚型:
julia> InteractiveUtils.subtypes(AbstractFloat)
5-element Vector{Any}:
BigFloat
Core.BFloat16
Float16
Float32
Float64
此列表还包括任何抽象子类型,但不包括进一步的子类型;要探索整个类型树,您可以使用 `子类型'递归。
请注意 'subtypes'位于里面 'InteractiveUtils',但在使用REPL时自动导出。
数据类型结构
在与C代码交互时,`DataType’的内部表示非常重要。 有几个函数可用于分析。 'isbitstype(T::DataType)'如果类型`T`以与C兼容的对齐方式存储,则返回true。 `fieldoffset(T::DataType,i::Integer)'返回_i_字段相对于类型开头的偏移量(以字节为单位)。
函数方法
任何通用函数的方法列表都可以使用该函数获得 '方法'。 您可以使用函数在方法调度表中搜索接受特定类型的方法 'methodswith'。
扩张和降级
章中所述 元编程,函数 `macroexpand'返回表达式的插值形式(`Expr')这个宏没有引号。 要使用’macroexpand',请将表达式块本身用引号(`quote')括起来(否则,将计算宏本身并传输其结果)。 例如:
julia> InteractiveUtils.macroexpand(@__MODULE__, :(@edit println("")) )
:(InteractiveUtils.edit(println, (Base.typesof)("")))
函数的基础。元。show_sexpr’和 'dump'用于以符号形式表示表达式,并显示有关任何表达式的深度嵌入内容的信息。
最后,功能 '元。lower'返回任何表达式的’降低’形式,对于理解语言结构如何映射到原始操作(如赋值,分支和调用)特别有用。:
julia> Meta.lower(@__MODULE__, :( [1+2, sin(0.5)] ))
:($(Expr(:thunk, CodeInfo(
@ none within `top-level scope`
1 ─ %1 = 1 + 2
│ %2 = sin(0.5)
│ %3 = Base.vect(%1, %2)
└── return %3
))))
中间和编译表示
分析函数的简化形式需要选择特定的显示方法,因为通用函数可以有许多具有不同类型签名的方法。 为此,可以通过以下方式降级特定方法的代码 'code_lowered',以及具有类型推断的变体 'code_typed'。 'code_warntype'为输出数据添加高亮显示 'code_typed'。
在更接近机器级别的级别上,可以使用以下方法导出LLVM函数的中间表示 'code_llvm',并且编译后的机器代码可通过 'code_native'(这会为之前未被调用的任何函数启动JIT编译或代码生成)。
为了方便起见,有宏形式的上述函数的版本,它们接受标准函数调用并自动扩展参数类型。:
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’参数,它定义了调试信息输出的级别。
julia> InteractiveUtils.@code_typed debuginfo=:source +(1,1)
CodeInfo(
@ int.jl:87 within `+`
1 ─ %1 = Base.add_int(x, y)::Int64
└── return %1
) => Int64
'Debuginfo’的可能值是’:none',:source’和
:default'。 默认情况下,不显示调试信息。 要更改此行为,请设置"Base"。IRShow。default_debuginfo[]=:source`。