AnyMath 文档

反思与反省

Julia提供了多种运行时反射功能。

模块绑定

A的公开名称 模块 可使用 名称(m::模块),这将返回一个数组 符号表示公共绑定的元素。 名称(m::Module,all=true) 返回所有绑定的符号 m,无论公共地位如何。

数据类型字段

的名称 数据类型 字段可以使用 字段名称. 例如,给定以下类型, 字段名(点) 返回一个元组 符号s表示字段名称:

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

请注意 字段名(数据类型) 给出每个字段的名称 数据类型 本身,其中一个领域是 类别 在上面的例子中观察到的场。

亚型

任何的_direct_子类型 数据类型 可使用下列方法列出 亚型. 例如,摘要 数据类型 [医抽象浮]有四个(具体)亚型:

julia> InteractiveUtils.subtypes(AbstractFloat)
5-element Vector{Any}:
 BigFloat
 Core.BFloat16
 Float16
 Float32
 Float64

任何抽象子类型也将包含在此列表中,但其进一步的子类型不会;递归应用 亚型可用于检查完整类型树。

请注意 亚型位于内 交互式活动但在使用REPL时会自动导出。

数据类型布局

A的内部表示 数据类型 在与C代码接口时是非常重要的,并且有几个函数可以用来检查这些细节。 isbitstype(T::数据类型)如果返回true T 以C兼容的对齐方式存储。 fieldoffset(T::DataType,i::Integer)返回字段_i_相对于类型开头的(字节)偏移量。

函数方法

任何泛型函数的方法都可以使用 方法. 可以使用以下方法搜索方法调度表以查找接受给定类型的方法 方法,方法.

膨胀和降低

如在 元编程部分, 宏扩展函数给出无引号和插值表达式(Expr)给定宏的形式。 要使用 宏扩展, 报价 表达式块本身(否则,宏将被评估,结果将被传递!). 例如:

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增加高亮显示的输出 代码类型.

离机器更近的地方,函数的LLVM中间表示可以使用 code_llvm,最后编译后的机器代码可用使用 编码,编码(这将触发任何先前未被调用的函数的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,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[]=:来源.