【问题标题】:How to find source of non generic functions?如何找到非泛型函数的来源?
【发布时间】:2017-12-18 08:02:50
【问题描述】:

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

@edit sizeof("")

我看到它在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":

【问题讨论】:

  • grep 在 Julia 的 /src/base 目录中是一种方法。例如,在这种情况下,好的搜索字符串是 'core("sizeof")'jl_builtin_sizeof
  • 谢谢! :) 但是jl_builtin_sizeofcore("sizeof") 而核心是static jl_value_t *core(const char *name){ return jl_get_global(jl_core_module, jl_symbol(name));} 所以Core.sizeof 的源代码路径对我来说仍然是语义加密的:P
  • Greping for jl_builtin_sizeof 在第 3000 行附近的 codegen.cpp 中找到了一个命中,其中有更多关于如何实现 Core.sizeof 的信息。但也许一些额外的注释方法(和help)是一个很好的未来变化
  • 对,但它并不是这个函数的精确实现。在我看来,生成这个函数的代码。我预计类似于jl_alloc_string (src\array.c) 的东西,我可以看到分配字符串的前 (size_t) 个字节代表 sizeof 字符串。我只是想了解如何在 Julia 代码中“破解”读取这些字节。 @code_llvm sizeof("")sizeof 实现有其他看法,但此时对我来说也是“加密的”。再次感谢! :) 似乎这个任务“黑客”太深了,不能很好地评论文件......
  • 似乎 len 仍然存在于内存中:[unsafe_load(Base.unsafe_convert(Ptr{Int64}, pointer_from_objref("#"^i))) for i in 5000:5010] == collect(5000:5010) => true

标签: julia


【解决方案1】:

正如您和 Dan Getz 在 cmets 中制定的,这是一个 内置 函数。 Julia 有一组“原始”函数(列表starts here),这些函数由 Julia 的编译器显式处理。其中许多非常直接地映射到特定的CPU instructions,但采用通用形式(例如,添加但通常适用于 CPU 和 FPU 支持的所有类型)。简而言之,Julia 的编译器管道获取代码并对其进行转换(降低),执行类型推断和内联,并最终将其简化为对高级函数(未内联的函数)或内置函数的一组函数调用.或许与直觉相反,在大多数情况下没有内置函数的 C 实现:相反,内置函数仅作为代码生成器的“信号”,它采用这些大大简化的表达式并发出 LLVM IR并让 LLVM 生成本机代码。对于sizeof 的这种特殊情况,这里是code to generate the LLVM IR

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

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

如果您想了解有关 IR 生成的更多信息,我发现的最佳资源是 LLVM kaleidoscope tutorial。学习本教程需要一些时间才能发挥作用,但它肯定会揭开 Julia 的一些内部结构的神秘面纱。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-22
    • 1970-01-01
    相关资源
    最近更新 更多