混合编程是怎么实现的?它的原理是什么?
比如c++和java c++和python 它们各自产生的机器码都不一样怎么实现一块工作的? 小白实在搞不懂 求大神讲讲
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
比如c++和java c++和python 它们各自产生的机器码都不一样怎么实现一块工作的? 小白实在搞不懂 求大神讲讲
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(5)
这实际上分为两种, 一种是库调用, 一种是跨语种的调用.
库调用的话, 只需要规范好的ABI, 就行了. Linux/Windows有自己的ABI规范, 只要符合这个规范, 那么编译出来的库, 就可以被其他语言所调用. 一个很简单的例子, 一个C/Fortran语言编写的库, 可以被其他C++程序调用.
还有一种是跨语种的, 通常在Native语言和Managed语言见到. 比一个C++程序和Python程序交互, 那么必须在Python层规范好FFI, 然后C++才可以给Python编写插件之类的, 让Python调用C++. Java/Python之类的都是这种. 本质上还是托管语言的ABI和Native语言的不一样, 需要在托管语言这边规范一下.
关于ABI看https://zh.wikipedia.org/wiki/X86%E8%B0%83%E7%94%A8%E7%BA%A6%E5%AE%9A
x86_64有一套参数传递规范,各个语言都遵守这个规范。
Java和python并不是产生机器码,他们产生供各自虚拟机使用的字节码。
然后java虚拟机(常用的Sun JVM)是用c++写的,常用的python(CPython)的解释器是用c写的,它们也都提供接口供调用c\c++程序,jvm提供JNI,python可以了解ctypes
有很多种方式,主要的我列一下。粗体的是宿主,启动的时候从宿主的入口开始,后面的是通过各种方式执行:
C/C++ + C/C++:各个平台都有各自的动态库。编译器按照操作系统定下来的规范来构造这个库,暴露出库中各函数的入口。操作系统有系统调用用于加载动态库。
Java + C/C++:有人已经说到JNI。你先用C/C++按照JNI的规定写好一个外部库,然后启动Java字节码控制虚拟机去加载外部库。虚拟机是C++写的,于是就回到方式1.
Python + C/C++:ctype。跟Java是类似的,Python运行时去加载好外部库然后给python代码用。回到了方式1.
C/C++ + Python:libpython。python提供了一个外部库libpython帮C/C++加入执行python脚本的功能。libpython实时解析脚本代码然后运行。
C/C++ + Lua:嵌入。跟方式4很类似,脚本代码实时解析并且运行。不过Lua可以静态链接进可执行文件里因为它比较小。
C/C++ + GLSL:嵌入。跟方式5类似,实时解析编译完代码之后交给GPU运行 :-)
还有就是用子进程和管道的方式来进行通信的方式……比如CGI :-)
总的来说,就是(1)系统调用(
dlopen/dlsym/LoadLibrary
)充当一个中介为各种二进制代码提供交通的渠道,(2)无论是什么语言它的底层(虚拟机/运行时/库)肯定是二进制代码不可能是悬空的。然后大家就可以发挥想象力去创造各种混合编程的方式了。我的认识比较短浅,我只会个c和汇编混合编程,可以知道c在编译过程中有一步是先编译成汇编语言,而嵌在c中的汇编语言是不需要这一步的。
说到底cpu能够识别就是机器码0和1,不管什么语言最终都是使用机器码运行在cpu上,所以混合编程重要的是编译器对该语言的解释和编译。