两种编程语言是怎么一起连接工作的？
C++完成这个模块代码，与JAVA和其它语言都写着擅长的功能模块，但是他们中间是怎么连接的？
原理上有两种：

- 同一进程融合

- 跨进程融合

主要区别在于通信是如何实现的。

### 同一进程融合

两个或者多个语言完成的模块在同一个操作系统进程中运行。这种情况一般是通过 _foreign function interface_ (FFI)实现。基本上就是把两个语言写成的程序，编译到一起。比如 Python 可以调用 C 或者 Rust 写成的函数（二进制），通常 Python会把计算密集的模块用 C 语言实现，比如 Numpy，然后再同一个进程里面调用它们，以提高计算性能。

同一进程的通讯可以直接通过共享虚拟内存空间实现，通讯性能最好。

### 跨进程融合

跨进程融合的灵活度是最高的，因为程序跑在不同的进程里面，这些进程可以是任何语言实现的，C、Java、Python、Rust、Lisp、Ocaml，任何语言。

弊端在于，由于无法共享同一虚拟内存空间，通讯相对于同一进程来说比较复杂。

- 内存映射 - 实际上还是共享物理内存

- Socket - 套接字

- 消息队列 - 用第三个进程来实现通讯

- 操作系统还提供一些底层的信号传递功能 - 信号

上面是实现二进制信息传递的方法，当然由于进程实现的语言和内存模型通常也是不一样的，在这个过程中我们可能还需要通讯协议，即确保两个进程对同一个二进制流的诠释是一样的，这通常会涉及一个序列化和反序列化的过程，因此通讯成本比单进程要高。

综上，根据项目的具体情况，我们可以选择不同的协同编程方案。总体来说：同进程融合性能最好，但是灵活度差；跨进程融合最灵活，但是性能会受到不同程度的损伤。