跨语言之间的调用,原理是什么?

2020-12-01 16:10:07 +08:00
 James369
比如:
java 通过 jni 调用 c/c++模块。
python 通过 pybind11 调用 c/c++模块。

这是一种基于编译器 /解释器的技术,还是什么二进制原理?
6804 次点击
所在节点    程序员
26 条回复
Mithril
2020-12-01 23:51:48 +08:00
实际上你举得这些例子都是虚拟机实现的功能,JVM 去加载了 C++的 DLL/SO,然后包了一层给虚拟机内的代码用。
其实跨语言调用还有很多种,比如 Windows 之前的 COM 这种,它的实现是系统提供的功能。
本质上跨语言调用要解决的问题就只有两个
1. 如何定位并调用对方的函数。
2. 双方的数据类型要如何转换。
你像 Java 或者 Python 调用 C++,这两个问题是虚拟机帮你解决了。Windows 的 COM 则是系统帮你解决了一部分,IDL 帮你解决了一部分,虽然这技术当年大部分也只用在 C++上,而且现在已经没人用了。
不过更多的则是用多进程的办法,然后通过 IPC 来处理。IPC 的方法就多了去了,但是核心上解决的也就是这两个问题。
你可以参考一下 SWIG 这个项目,它可以让各种语言去调用 C++的代码。
MrKrabs
2020-12-02 03:25:09 +08:00
dlopen
tianyamomo
2020-12-02 08:40:13 +08:00
搞 cef 和 qt 的 web 控件的时候都是把 c++的方法注册到 js 的执行环境里面,整个 js 环境都是 c/c++写的这应该不难,其他的都应该差不多吧
young1lin
2020-12-02 10:20:30 +08:00
我记得 Java 调用 DLL 也是有限制的,对应的 C++ 代码必须放在 JAVA_HOME/bin 下面好像。Java 虚拟机对这个 native 函数编译的时候就开始语法解析了。
mingl0280
2020-12-02 16:06:03 +08:00
Linux: dlopen(), dlsym(), dlclose()
Windows: LoadLibrary(), GetProcAddress(), FreeLibrary()
mingl0280
2020-12-02 16:17:49 +08:00
底层实际上是操作系统提供的一系列动态加载可执行代码的操作。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/731019

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX