Julia 如何找到非泛型函数的源?

Julia 如何找到非泛型函数的源?,julia,Julia,查找泛型函数的来源(感谢Julia的自省)很容易: 我看到它在julia/base/strings/string.jl中定义为 sizeof(s::String) = Core.sizeof(s) 有没有类似的方法可以找到Core.size函数的来源 帮助不是很有帮助: help?> Core.sizeof No documentation found. Core.sizeof is a Function. # 0 methods for generic functio

查找泛型函数的来源(感谢Julia的自省)很容易:

我看到它在
julia/base/strings/string.jl
中定义为

sizeof(s::String) = Core.sizeof(s) 
有没有类似的方法可以找到Core.size函数的来源

帮助不是很有帮助:

help?> Core.sizeof
  No documentation found.

  Core.sizeof is a Function.

  # 0 methods for generic function "sizeof":

正如您和Dan Getz在评论中指出的,这是一个内置函数。Julia有一组“基本”函数(列表),由Julia的编译器显式处理。其中许多非常直接地映射到特定类型,但以一般形式(例如,对于CPU和FPU支持的所有类型,添加但一般)。用非常粗略的术语来说,Julia的编译器管道获取代码并对其进行转换(降低),执行类型推断和内联,最终将其降低为一组对高级函数(未内联的函数)或内置函数的函数调用。也许与直觉相反,在大多数情况下,内置代码没有C实现:相反,内置代码只是作为代码生成器的“信号”,代码生成器接受这些大大减少的表达式,并发出并让LLVM生成本机代码。对于
sizeof
的这种特殊情况,下面是

这样做有令人信服的理由:

  • 如果你调用了一个C函数jl_sizeof,你必须支付函数调用的罚款,这与许多基本的CPU指令相比。例如,如果Julia的
    getindex
    (支持数组访问
    A[i,j]
    )是以这种方式实现的,那么Julia就不会被认为是一种快速语言——它的快速只是因为最终
    getindex
    会导致内联LLVM IR(对于类型推断成功的情况)
  • C缺少朱丽亚的惊人的灵活性,它的类型和重载函数:你必须调用更类似于C++模板特化的东西,而事实是,LLVM的发布比编译器为你有效地编写C++更容易(实际上,LLVM的全部)。

如果你想了解更多关于红外发电的信息,我找到的最好的资源是。学习本教程需要花费一些时间才能发挥作用,但它肯定会解开Julia的一些内部秘密。
/src
/base
目录中的grep是Julia的一种方法。例如,在本例中,好的搜索字符串是
'core(“sizeof”)
jl_builtin_sizeof
谢谢!)但是
jl_内置的sizeof
core(“sizeof”)
而core是
static jl_value_t*core(const char*name){返回jl_get_global(jl_core_模块,jl_符号(name))}
因此,
Core.sizeof
的源代码路径对我来说仍然是语义加密的:PGreping for
jl_builtin_sizeof
在第3000行的
codegen.cpp
中选取了一个热门内容,其中有一些关于
Core.sizeof
是如何实现的。但是也许一些附加的注释方法(和
帮助
)是一个很好的未来变更,但它并不是这个功能的精确实现。在我看来,生成这个函数就像是一段代码。我期望得到类似于
jl_alloc_string
src\array.c
)的东西,在这里我可以看到分配字符串的第一个(size_t)字节代表字符串的大小。我只是想了解如何“破解”Julia代码中这些字节的读取
@code_llvm sizeof(“”)
sizeof
实现进行了其他查看,但目前对我来说也是“加密”的。再次感谢!:)似乎这项任务“黑客”太深了,以至于没有很好的注释文件…似乎len仍然存在于内存中:
[不安全加载(Base.unsafe)转换(Ptr{Int64},指针_from_objref(“^i))=5000:5010中的i]==收集(5000:5010)
=>true
help?> Core.sizeof
  No documentation found.

  Core.sizeof is a Function.

  # 0 methods for generic function "sizeof":