【发布时间】:2021-06-22 10:54:29
【问题描述】:
首先,我不是软件专家,我意识到这个问题可能很模糊(这只是一种好奇心),并准备好阅读我的一些野蛮猜测!
这个问题来自阅读一篇关于 Linux 开发人员如何在他们的操作系统中实现 Rust (https://www.zdnet.com/article/linus-torvalds-on-where-rust-will-fit-into-linux/) 的文章。
在他们的操作系统中实现 Rust 意味着什么?他们是否有一些用 C 编写的编译代码调用由 Rust 编写的编译代码?我不知道如何有效地完成此操作,因为您可能会有不同的编译器无法优化代码,因为在此过程中,它正在调用“外部”代码。我想如果您将 Python 或 Java 之类的未预编译的语言混入其中,情况会变得更糟。现在您将让 JVM 或 PVM 与已编译的代码一起运行,我想这将是非常不切实际的。我可以想到的一种方法是,如果您将所有这些事情视为单独的进程,并且您只需让一种语言的代码启动一个与另一种语言的代码相对应的进程,但我想这不会很有效...
再次,我意识到我本可以更直接,但我不是在寻找解决问题的具体答案,而是在寻找不同语言如何一起使用的一般见解。感谢理解!
【问题讨论】:
-
就像en.wikipedia.org/wiki/Foreign_function_interface 一样。但总的来说,我不明白这个问题。为什么不同的语言不能互相调用?为什么不呢?
I don't see how this can efficiently be done你问如何还是问效率。尽管如此,在 C 中,通常每个文件都是单独优化的,因此没有区别,而且 LTO 的运行成本太高。 -
@KamilCuk 我不是说他们不能,我是说我看不出他们怎么能。例如,如果 C 编译器有一种特定的方式来管理堆栈,这与 Rust 管理堆栈的方式完全不同,那么调用 Rust 代码可能会像从 C 代码中那样弄乱堆栈,因为它可以确保不再成立的假设。因为它们共享相同的进程,所以内存不受保护。在另一种情况下,每次需要运行一点点代码时,我们需要重新检查代码版本,看看它是否需要更新,然后在 VM 中运行。
-
if the C compiler has a specific way of managing the stack, that is completely different from how Rust manages stack但它不是,它是一样的。其规则由 ABI 管理,即。 uclibc.org/docs/psABI-x86_64.pdf 。尽管如此,如果一种语言确实以不同的方式使用堆栈,那么“只是”专门处理这种情况。我对 Python/Java 的东西一无所知 - Python 是用 C 编写的,所以你用 Python 编写的任何东西都由 C 执行,而 C 调用其他 C 函数(为了简化很多)。与 JVM 相同。而且它不是“虚拟机”,它更像是一个解释器。 -
另一方面,我认为除了研究什么是“ABI”之外,您还应该研究什么是“链接器”和“链接”,链接和共享库如何工作以及@是什么987654326@做。和ELF文件格式。我认为这些主题可能会让您更好地理解。
-
我明白了,刚刚了解了 ABI。我看到文章中提到过,但没有太在意。我想这是有道理的。 @user253751 也给了我一个关于如何集成基于 VM 的语言的好主意。感谢您的澄清!
标签: c linux rust compiler-construction jit