互操作性如何工作

8
我知道很多大型应用程序,例如视频游戏,都是使用多种语言创建的。例如,游戏/物理引擎可能是用C++编写的,而游戏任务和GUI则是用类似Python或Lua的高级语言编写的。
我了解这种角色分工的原因;对于需要极端优化、调整、效率和速度的任务使用较低级别的语言,而使用高级语言加快生产时间、减少错误等。
最近,我决定承担一个更大的个人项目,并希望将项目的部分分配类似于上述方式。此时,我真的很困惑这些语言之间的互操作性(特别是编译与解释)是如何工作的。
我非常熟悉从ANSII代码测试到加载可执行文件的细节,当它们是C/C++等编程语言时。我非常好奇像视频游戏这样由许多不同语言构建的应用程序是如何工作的。这是一个大而广泛的问题,但我特别感兴趣的是:
- 代码层面逻辑如何工作?也就是说,我怎么能从C++程序中调用Python代码?特别是因为它们不支持相同的内置类型? - 程序图像是什么样子的?据我所知,视频游戏在单个进程中运行,那么当运行调用Python函数的C/C++程序时,运行时图像是什么样子的? - 如果从已编译的程序中调用解释语言的代码,发生了什么顺序事件?也就是说,如果我在我的已编译可执行文件内部,并且由于某种原因,在循环内部调用解释语言,那么我是否必须等待每个迭代的解释器?
我实际上很难找到关于机器级别发生的信息,所以任何帮助都将不胜感激。尽管我一般对软件互操作感兴趣,但我特别关注C++和Python的交互作用。
非常感谢您的任何洞察力,即使只是指向可以找到更多信息的地方。

2
http://en.wikipedia.org/wiki/Foreign_function_interface 你可能不知道要搜索什么术语 - aryan
@aryjczyk 谢谢你提供的链接。是的,我之前不知道这个术语。这对于帮助理解如何实现非常有帮助。我仍然不清楚像这样的东西在物理上是如何工作的,特别是在GC和非GC环境中。我不知道进程镜像会是什么样子。无论如何,谢谢,我会继续寻找! - gone
2个回答

3

对于Python而言,在IT技术方面,你基本上有三种选择(这通常适用于各个领域):

  1. 在C++中使用Python:从C++程序的角度看,Python解释器是一个C库。在Python方面,您可能需要使用类似ctypes的东西来公开C(++) API。

  2. Python将C++代码用作DLLs/SOs - C++代码可能完全不了解Python,Python必须使用外部函数接口。

  3. 进程间通信 - 基本上,两个单独的进程运行,并通过套接字进行通信。现在,您可能会使用某种Web服务架构来实现此目的。


啊,是的,我知道(3)的事情。关于(1),我有点理解这将是一个自然的想法;尽管我不太明白它如何被实现,因为Py解释器显然不是C共享/动态库。此外,如果没有非GC环境,GC环境如何运作?此外,例如,如果我在C/C++中制作了一些使用嵌入式Python的应用程序,所有用户是否都需要在他们的磁盘上安装Py解释器? - gone
@Zak 我认为你只需要学习进程的基础知识,以及二进制程序在底层是如何构建的。Python 只会管理它自己分配的对象。Python 可以用于嵌入式开发。考虑一下嵌入式开发的含义,以回答你的最后一个问题。 - Marcin
好的,谢谢Marcin。我很感激你的回复 - 我会去研究一下! - gone

0

根据你想要做什么:

  • 看一下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的工作原理。但是感谢您的回复。 - gone
@Zak 的确,你可以在他们的网站上找到更多关于 SWIG 如何工作的信息。无论如何,我已经编辑了我的答案以添加更多信息。 - Maxime Chéramy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接