如何在编程语言之间传递数据?
How to communicate data between programming languages?
我正在考虑开始一个新项目(桌面应用程序)。
性能是必须的,我需要像 Rust 这样快速可靠的语言。另一方面,我想使用 OS 提供的原生 UI 工具包,例如 SwiftUI.
我对此做了一些研究,但没有找到任何具体的东西。
- 我坚持使用 Rust 和 Swift,没有其他语言。
- 本地 API 并且打开端口不是一个选项。
- 写入文件然后使用其他语言从中读取可能是一种选择,但我不认为这样做是好的做法和效率。
- 使用一种进程间通信是一个很好的解决方案。但我不知道该怎么做,尤其是在两种不同的语言之间。如果有人可以解释它或有一些关于它如何工作的详细参考,可以从头开始实现它。
综上所述,我想使用 SwiftUI 作为前端,Rust 作为后端,数据通信速度最快,延迟最低。最好的方法是什么?
注意:也许上面的一些解决方案没有意义。有不对的请指正。
我不知道 Swift 因为我过去用 C++/C# 做过一些 IPC。
如果你想要“最高速度的数据通信和最低的延迟”,除了 C FFI 别无选择。这是非常快的,因为所有代码都在一个进程中,并且您可以非常轻松地共享内存而无需任何复制。
我不知道 Swift 但 Rust 代码可以提供 C API 允许从任何其他支持 C FFI 的语言调用。
您可以 link 动态地(通过将箱子类型设置为 cdylib 构建 DLL/.so)或静态地(通过将箱子类型设置为 staticlib)编写 Rust 代码。
您可以在此处阅读有关 FFI 的更多信息:https://doc.rust-lang.org/nomicon/ffi.html
如果你真的不需要“最高速度的数据通信和最低的延迟”(你可能因为你曾经考虑过文件作为选项),你可以考虑使用 2 个不同的进程,它们使用 OS 级机制进行互操作.
最常见的方法是使用管道:
- Unix 文档:https://man7.org/linux/man-pages/man2/pipe.2.html
- Windows 文档:https://docs.microsoft.com/en-us/windows/win32/ipc/pipes
您可以尝试使用这个 crate:https://crates.io/crates/os_pipe
此外,在 Unix 上您可以使用 unix domain sockets。这与网络套接字非常相似,但速度更快。
我正在考虑开始一个新项目(桌面应用程序)。 性能是必须的,我需要像 Rust 这样快速可靠的语言。另一方面,我想使用 OS 提供的原生 UI 工具包,例如 SwiftUI.
我对此做了一些研究,但没有找到任何具体的东西。
- 我坚持使用 Rust 和 Swift,没有其他语言。
- 本地 API 并且打开端口不是一个选项。
- 写入文件然后使用其他语言从中读取可能是一种选择,但我不认为这样做是好的做法和效率。
- 使用一种进程间通信是一个很好的解决方案。但我不知道该怎么做,尤其是在两种不同的语言之间。如果有人可以解释它或有一些关于它如何工作的详细参考,可以从头开始实现它。
综上所述,我想使用 SwiftUI 作为前端,Rust 作为后端,数据通信速度最快,延迟最低。最好的方法是什么?
注意:也许上面的一些解决方案没有意义。有不对的请指正。
我不知道 Swift 因为我过去用 C++/C# 做过一些 IPC。
如果你想要“最高速度的数据通信和最低的延迟”,除了 C FFI 别无选择。这是非常快的,因为所有代码都在一个进程中,并且您可以非常轻松地共享内存而无需任何复制。
我不知道 Swift 但 Rust 代码可以提供 C API 允许从任何其他支持 C FFI 的语言调用。 您可以 link 动态地(通过将箱子类型设置为 cdylib 构建 DLL/.so)或静态地(通过将箱子类型设置为 staticlib)编写 Rust 代码。 您可以在此处阅读有关 FFI 的更多信息:https://doc.rust-lang.org/nomicon/ffi.html
如果你真的不需要“最高速度的数据通信和最低的延迟”(你可能因为你曾经考虑过文件作为选项),你可以考虑使用 2 个不同的进程,它们使用 OS 级机制进行互操作. 最常见的方法是使用管道:
- Unix 文档:https://man7.org/linux/man-pages/man2/pipe.2.html
- Windows 文档:https://docs.microsoft.com/en-us/windows/win32/ipc/pipes
您可以尝试使用这个 crate:https://crates.io/crates/os_pipe
此外,在 Unix 上您可以使用 unix domain sockets。这与网络套接字非常相似,但速度更快。