84669 Lernen von Personen
152542 Lernen von Personen
20005 Lernen von Personen
5487 Lernen von Personen
7821 Lernen von Personen
359900 Lernen von Personen
3350 Lernen von Personen
180660 Lernen von Personen
48569 Lernen von Personen
18603 Lernen von Personen
40936 Lernen von Personen
1549 Lernen von Personen
1183 Lernen von Personen
32909 Lernen von Personen
小伙看你根骨奇佳,潜力无限,来学PHP伐。
这实际上分为两种, 一种是库调用, 一种是跨语种的调用.库调用的话, 只需要规范好的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)无论是什么语言它的底层(虚拟机/运行时/库)肯定是二进制代码不可能是悬空的。然后大家就可以发挥想象力去创造各种混合编程的方式了。
dlopen/dlsym/LoadLibrary
我的认识比较短浅,我只会个c和汇编混合编程,可以知道c在编译过程中有一步是先编译成汇编语言,而嵌在c中的汇编语言是不需要这一步的。说到底cpu能够识别就是机器码0和1,不管什么语言最终都是使用机器码运行在cpu上,所以混合编程重要的是编译器对该语言的解释和编译。
这实际上分为两种, 一种是库调用, 一种是跨语种的调用.
库调用的话, 只需要规范好的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上,所以混合编程重要的是编译器对该语言的解释和编译。