互操作性如何工作
Posted
技术标签:
【中文标题】互操作性如何工作【英文标题】:How interoperability works 【发布时间】:2013-07-06 20:49:07 【问题描述】:我知道许多大型应用程序(例如视频游戏)是使用多种语言创建的。例如,游戏/物理引擎很可能是用 C++ 编写的,而游戏任务、GUI 可能是用 Python 或 Lua 之类的东西编写的。
我明白为什么这种角色划分是这样的;将低级语言用于需要极端优化、调整、效率和速度的任务,同时使用高级语言来加快生产时间,减少令人讨厌的错误等。
最近,我决定进行一个更大的个人项目,并希望将项目的部分内容与上述类似。在这个时间点上,我真的很困惑语言之间的这种互操作性(尤其是编译与解释)是如何工作的。
当用 C/C++ 之类的东西编写时,我非常熟悉从 ANSCII 代码测试到加载可执行文件的细节。我很好奇像电子游戏这样的东西,由许多不同的语言构建而成,是如何工作的。这是一个大/广泛的问题,但我特别感兴趣:
代码级逻辑如何工作? IE。如何从 C++ 程序调用 Python 代码?特别是因为它们不支持相同的内置类型? 程序图像是什么样的?据我所知,一个视频游戏在单个进程中运行,那么运行调用 Python 函数的 C/C++ 程序时,运行时映像是什么样的? 如果从编译程序调用解释语言的代码,发生的事件顺序是什么?即,如果我在编译的可执行文件中,并且由于某种原因在循环中调用了解释语言,我是否必须在每次迭代时等待解释器?我实际上很难找到有关机器级别发生的事情的信息,因此我们将不胜感激。虽然我一般对软件的互操作性很好奇,但我对 C++ 和 Python 的交互特别感兴趣。
非常感谢您提供的任何见解,即使它只是指出我可以找到更多信息的地方。
【问题讨论】:
en.wikipedia.org/wiki/Foreign_function_interface您可能不知道要搜索的正确术语 @aryjczyk 谢谢你的链接。是的,我不知道这个词。这非常有助于理解这是如何完成的。我仍然对这种物理上的工作方式感到困惑,尤其是在 GC 与非 GC 环境中。我不知道过程图像会是什么样子。无论如何,谢谢,我会继续寻找! 【参考方案1】:在 python 的特定情况下,您基本上有三个选项(这通常适用于所有方面):
Host python in C++:从C++程序的角度来看,python解释器是一个C库。在 python 方面,您可能需要也可能不需要使用 ctypes 之类的东西来公开 C(++) api。
Python 使用 C++ 代码作为 DLL/SO - C++ 代码可能对 python 一无所知,python 肯定必须使用外部函数接口。
进程间通信 - 基本上,两个独立的进程运行,它们通过套接字进行通信。如今,您可能会使用某种 Web 服务架构来完成此任务。
【讨论】:
是的,我知道 (3)。关于(1),我有点理解这是一个自然的想法;虽然我不太明白它是如何实现的,因为 Py 解释器显然 不是 C 共享/动态库。此外,没有非 GC 环境的 GC 环境如何运行?此外,例如,如果我用 C/C++ 制作了一些使用嵌入式 Python 的应用程序,是否所有用户都需要在他们的磁盘上安装 Py 解释器? @Zak 我认为您只需要研究进程如何工作的基础知识,以及如何在后台构建二进制程序。 Python 只会管理它自己分配的对象。可以为嵌入构建 Python。考虑嵌入意味着什么来回答您的最后一个问题。 好的,谢谢马尔辛。感谢您的回复 - 我会调查的!【参考方案2】:取决于你想做什么:
看看 SWIG:http://www.swig.org/ 这是一个旨在将 C/C++ 代码与 Python、Tcl、Perl、Ruby 等连接起来的工具。常见的用例是 Python 界面(图形或非图形)这将调用 C/C++ 代码。 SWIG 将解析 C/C++ 代码以生成接口。
Libpython:它是一个允许您嵌入 Python 代码的库。你在这里有一些例子:http://docs.python.org/3.0/extending/embedding.html
【讨论】:
我的问题更多是关于 SWIG 之类的如何工作的。但是谢谢你的回复 @Zak 确实,只是您可以在他们的网站上找到有关 SWIG 工作原理的更多信息。无论如何,我已经编辑了我的答案以添加更多信息。以上是关于互操作性如何工作的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Visual Studio 2022 注册 32 位 COM 互操作