你如何将一种语言(例如Python)绑定到另一种语言(比如说C ++)?

我远离Python专家,但我始终听到这个,关于它的C / C ++绑定。 这个概念如何工作,以及Python(和Java)如何绑定到像OpenGL这样的基于C的API? 这对我来说一直是个谜。


C89与反思写的口译员,谁知道?


我有一种感觉,你正在寻找解释的机制,而不是一个链接到API或说明如何编码。 所以,据我了解。 。 。

主要的解释器通常用C编写,并且是动态链接的。 在动态链接的环境中,即使C89也有一定的反射行为。 特别是, dlopen(3)dlsym(3)调用将加载一个动态(通常是ELF)库并查找由一个字符串命名的符号的地址。 给出这个地址,解释者可以调用一个函数。 即使静态链接,解释器也可以知道名称被编译到其中的C函数的地址。

那么,解释代码告诉解释器在特定的本地库中调用特定的本地函数只是一个简单的问题。

该机制可以是模块化的。 在脚本中编写的解释器扩展库本身可以调用dlopen(3)dlsym(3)的裸钩,并且连接到解释器从来不知道的新库。

为了按值传递简单对象,一些原型函数通常会允许不同的调用。 但对于结构化数据对象(想象stat(2)),包装模块需要知道数据的布局。 在某些时候,无论是在打包扩展模块还是安装扩展模块时,C接口模块都包含相应的头文件,并与手写代码一起构成接口对象。 这就是为什么你可能需要安装类似libsqlite3-dev东西,即使你的系统上已经有了sqlite3 。 只有-dev包有需要重新编译链接代码的.h文件。

我想我们可以总结一下:“这是用蛮力和无知来完成的”。 :-)


主要的一般概念被称为FFI,“外部函数接口” - 对于Java而言,它是JNI,Python是“Python C API”,Perl是XS等等,但是我认为给你一般艺术术语来帮助你更彻底地研究它。

给定一个FFI,你可以编写(例如)直接尊重它的C程序,和/或你可以使用代码生成器从他们从其他语言编写的代码接收和/或反思的元信息中生成这样的C代码(通常有一些帮助,例如,为了驱动SWIG代码生成器,您通常会使用SWIG特定的额外信息修饰.h C头文件中的信息以获得更好的包装)。

还有一些特殊语言,比如Cython,它是Python的一个“扩展子集”,它可以轻松生成FFI代码,同时匹配Python的大部分语法和语义 - 通常可能是大多数Python程序员编写Python扩展的最简单方法模块可以编译成快速机器代码,也可以使用一些现有的C-callable库。

ctypes方法与传统的FFI方法不同,尽管它自称为“Python的外部函数库” - 它依赖于DLL中可用的外部代码(或相当于如.so动态库Linux),并且在运行时生成和执行代码以达到动态加载的C代码(通常全部通过Python中的显式编程完成 - 但我不知道基于自省和ctypes代码生成的ctypes包装) 。 方便地避免必须安装任何特殊的任务来使用Python访问现有的DLL,但我认为它不能像FFI“基于链接器”的方法那样扩展(因为它需要更多的运行时间等等) 。 我不知道其他语言的其他语言的其他语言的实现,除了python的ctypes以外(我猜想有些语言确实存在,考虑到今天流行的DLL和.so包装,并且很想了解它们)。


通常这些语言都有加载用C语言编写的扩展的方法.Java接口被称为JNI(Java本地接口)。 Python有关于其扩展接口的全面文档。

Python的另一个选择是ctypes模块,它允许您使用动态加载的C库而无需编写自定义扩展代码。

链接地址: http://www.djcxy.com/p/96831.html

上一篇: How do you bind a language (python, for example) to another (say, C++)?

下一篇: why the currentThread method does NOT have the method BODY?