Engee 文档

分析与反省

该页面正在翻译中。

Julia提供了各种运行时分析功能。

模块绑定

"模块"的公共名称可通过函数获得 `names(m::Module)',它返回一个元素数组 `符号'表示公共绑定。 'Names(m::Module,all=true)`函数返回`m`中所有绑定的字符,而不考虑公共可用性状态。

数据类型字段

可以使用函数请求"数据类型"字段的名称 '字段名'。 例如,对于以下类型’fieldnames(Point)'返回一个对象数组 `Symbol'表示字段名称:

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`。