我试图更好地概念性地理解 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 函数可以返回多种类型。这里有一些问题: