Julia JIT 编译器如何处理函数的返回值?

问题描述 投票:0回答:1

我试图更好地概念性地理解 Julia JIT 编译过程(也许更好地表述为“编译序列”)的工作原理。

具体来说,我很想知道 Julia 如何处理函数返回值。

就上下文而言,我来自 C/C++/x86 ASM 背景。

请允许我简要描述一下函数编译在这种情况下是如何工作的。我的解释不会特别详细,但我希望足以说明这一点。

让我们考虑以下 C++ 代码。

void example_function() {
    auto tmp = another_function();
    std::cout << tmp << std::endl;
    return;
}

std::vector<double> another_function() {
    std::vector<double> tmp;
    tmp.push_back(1.0);
    return tmp;
}

以下是此示例中说明的重要概念的列表。

  • 该示例显示一个函数调用另一个函数
  • 被调用函数的返回值已知
    std::vector<double>
  • 此返回值在堆栈上具有静态大小,并且在编译时已知
  • 不要被
    cout
    语句分散注意力 - 只需假设某处提供了
    std::cout
    std::vector<double>
    实现。它只是为了说明返回值被用于某些用途

在 C++ 等静态语言中,返回值类型在编译时就已知。通常,编译器会在调用函数之前在堆栈上为返回值分配一些空间。

在此示例中,在调用

another_function
之前,编译器通常会将一块堆栈内存压入堆栈。该块的大小足以容纳返回值。该大小在编译时已知,因为编译器(在编译时)知道返回类型,因此也知道返回类型的大小。

通常编译器会通过从堆栈指针中添加(或减去?)来执行“堆栈推送”操作。 (如果我没记错的话?)

重点是,返回值的大小在编译时是已知的。

这在 Julia 中是如何工作的?

Julia 函数可以返回多种类型。这里有一些问题:

  • Julia 函数调用的返回值是否以与其他语言相同的方式存储在堆栈中?
  • Julia JIT 如何知道应该为返回值分配多少空间?
  • 它是否执行某种搜索来跟踪所有代码路径,以找出可能的返回类型集是什么,为其中最大的返回类型创建足够的空间?
compilation julia jit compiler-specific
1个回答
0
投票
长话短说,Julia 函数基本上有两种风格:返回类型可以推断的,以及不能推断的。如果可以的话,那么您基本上就得到了 C++ 函数的等价物。当不可能时,返回值就会被装箱,并且您会损失很多性能。

© www.soinside.com 2019 - 2024. All rights reserved.