Julia 如何找到非泛型函数的源?
查找泛型函数的来源(感谢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/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
)是以这种方式实现的,那么Julia就不会被认为是一种快速语言——它的快速只是因为最终A[i,j]
会导致内联LLVM IR(对于类型推断成功的情况)getindex
如果你想了解更多关于红外发电的信息,我找到的最好的资源是。学习本教程需要花费一些时间才能发挥作用,但它肯定会解开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 forjl_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":