扫码关注官方订阅号
小伙看你根骨奇佳,潜力无限,来学PHP伐。
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)无论是什么语言它的底层(虚拟机/运行时/库)肯定是二进制代码不可能是悬空的。然后大家就可以发挥想象力去创造各种混合编程的方式了。
dlopen/dlsym/LoadLibrary
我的认识比较短浅,我只会个c和汇编混合编程,可以知道c在编译过程中有一步是先编译成汇编语言,而嵌在c中的汇编语言是不需要这一步的。说到底cpu能够识别就是机器码0和1,不管什么语言最终都是使用机器码运行在cpu上,所以混合编程重要的是编译器对该语言的解释和编译。
微信扫码关注PHP中文网服务号
QQ扫码加入技术交流群
Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
PHP学习
技术支持
返回顶部
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上,所以混合编程重要的是编译器对该语言的解释和编译。