- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我远不是 python 专家,但我一直听到这个,关于它的 C/C++ 绑定(bind)。这个概念是如何工作的,Python(和 Java)如何绑定(bind)到基于 C 的 API,如 OpenGL?这东西对我来说一直是个谜。
最佳答案
我感觉您正在寻找有关机制的解释,而不是指向 API 的链接或有关如何对其进行编码的说明。所以,据我了解。 . .
主解释器通常是用 C 语言编写的,并且是动态链接的。在动态链接的环境中,即使是 C89 也有一定的反射行为。特别是,dlopen(3)
和 dlsym(3)
调用将加载动态(通常是 ELF)库并查找以字符串命名的符号的地址。给出那个地址,解释器就可以调用一个函数。即使是静态链接,解释器也可以知道其名称编译到其中的 C 函数的地址。
那么,只需让解释后的代码告诉解释器调用特定 native 库中的特定 native 函数即可。
该机制可以是模块化的。用脚本编写的解释器扩展库本身可以调用 dlopen(3)
和 dlsym(3)
的裸钩子(Hook)并连接到一个新库口译员从来不知道。
对于按值传递简单对象,一些原型(prototype)函数通常允许各种调用。但是对于结构化数据对象(想象一下 stat(2)),包装器模块需要知道数据的布局。在某些时候,无论是在打包扩展模块时还是在安装它时,C 接口(interface)模块都会包含适当的头文件,并结合手写代码构造一个接口(interface)对象。这就是为什么你可能需要安装类似 libsqlite3-dev
的东西,即使你的系统上已经有 sqlite3
了;只有 -dev
包有重新编译链接代码所需的 .h 文件。
我想我们可以这样总结:“这是用蛮力和无知完成的”。 :-)
关于java - 如何将一种语言(例如 python)绑定(bind)到另一种语言(例如 C++)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1475637/
我是一名优秀的程序员,十分优秀!