Java 如何将一种语言(例如python)绑定到另一种语言(例如C+;+;)上?
我远非python专家,但我经常听到这篇关于C/C++绑定的文章。这个概念是如何工作的,Python(和Java)是如何绑定到基于C的API(如OpenGL)的?这些东西对我来说一直是个谜。通常这些语言都有一种加载用C编写的扩展的方法。Java接口称为JNI(Java本机接口)。Python对其扩展接口有全面的了解Java 如何将一种语言(例如python)绑定到另一种语言(例如C+;+;)上?,java,python,binding,Java,Python,Binding,我远非python专家,但我经常听到这篇关于C/C++绑定的文章。这个概念是如何工作的,Python(和Java)是如何绑定到基于C的API(如OpenGL)的?这些东西对我来说一直是个谜。通常这些语言都有一种加载用C编写的扩展的方法。Java接口称为JNI(Java本机接口)。Python对其扩展接口有全面的了解 < Python的另一个选项是允许您使用动态可加载C库而不必编写自定义扩展代码的模块。 Perl,有两种调用C++子程序的方法: (另请参阅)-允许通过将C代码编译成可从Perl使
< Python的另一个选项是允许您使用动态可加载C库而不必编写自定义扩展代码的模块。
Perl,有两种调用C++子程序的方法:
- (另请参阅)-允许通过将C代码编译成可从Perl使用的模块,从Perl调用其他语言(主要是但不限于C)的子例程
- 扩展:从python访问c/c++
- 嵌入:从c/c访问python解释器++
有关详细的解释,请参见此。用C89编写的带反射的口译员,谁知道呢?
我感觉您在寻找对该机制的解释,而不是API的链接或关于如何编码的说明。所以,据我所知 主解释器通常是用C编写的,并且是动态链接的。在动态链接的环境中,即使是C89也有一定的反射行为。特别是,
dlopen(3)
和dlsym(3)
调用将加载动态(通常为ELF)库,并查找由字符串命名的符号的地址。给出那个地址,解释器可以调用一个函数。即使是静态链接,解释器也可以知道其名称被编译到其中的C函数的地址
因此,只需让解释后的代码告诉解释器调用特定本机库中的特定本机函数即可
该机构可以是模块化的。用脚本编写的解释器扩展库本身可以调用dlopen(3)
和dlsym(3)
的裸钩子,并连接到解释器不知道的新库
对于按值传递简单对象,一些原型函数通常允许各种调用。但是对于结构化数据对象(想象stat(2)),包装器模块需要知道数据的布局。在某些情况下,无论是打包扩展模块还是安装扩展模块,C接口模块都包含相应的头文件,并与手写代码一起构造接口对象。这就是为什么您可能需要安装类似于libsqlite3 dev
的东西,即使您的系统上已经安装了sqlite3
;只有-dev
包具有重新编译链接代码所需的.h文件
我想我们可以这样总结:“这是用暴力和无知完成的。”——) 下面的概念可以相对容易地概括,但是为了清晰起见,我将特别提到C和Python 从Python调用C 这是可行的,因为大多数低级语言/体系结构/操作系统都有定义良好的应用程序二进制接口,这些接口指定了应用程序如何相互交互以及如何与操作系统交互的所有低级细节。这里以x86-64(AMD64)的ABI为例:。它指定了所有细节,比如调用函数的约定和针对C对象文件的链接 有了这些信息,语言实现者就可以
PyObject* PyRun_StringFlags(const char *str, int start, PyObject *globals, PyObject *locals, PyCompilerFlags *flags)¶