不同编程语言之间的通信方式有哪些?

2016-06-03 19:23:06 +08:00
 hujianxin

最近在思考一个问题,就是两种或者多种编程语言之间有哪些通信方式,以及他们的适合领域是哪些呢?

我自己能想到的(但是并不一定对)有:

  1. ffi 方式。例如 racket 有自己的 ffi 模块,可以使用 c 语言。但是这种方式试用范围很有限,只能使用少数几种编程语言支持的编程语言。
  2. 共用数据库。在有些场合中,两种编程语言之间只需要交互数据,这样的话可以共用数据库。
  3. webserver 方式,例如 java 和 python 之间通信,可以使用 flask 起一个 web server ,然后 java 起一个简单的客户端。这种应该是用的比较多的吧?
  4. 甚至可以通过在一种编程语言使用管道运行另一种编程语言。

但是,最近还在网上看到了 rpc 通信方式,由于没有经验,对这方面不是很懂,希望这方面经验大大可以指教一下。

10879 次点击
所在节点    程序员
32 条回复
peter999
2016-06-03 19:32:33 +08:00
json, protobuf 类似的很多
am241
2016-06-03 19:34:35 +08:00
动态链接库, swig , ctypes , jni
共享内存 /文件
管道
消息
COM/ActiveX
socket
RPC/DBUS
XML/JSON API
hujianxin
2016-06-03 19:44:20 +08:00
@am241 多谢多谢,请问 rest api 方式效率会是瓶颈吗?
Mutoo
2016-06-03 19:47:12 +08:00
游戏开发就很常见呀,脚本语言跟宿主语言通过共享内存通信:比如 c++/lua 以及 c/python
另外还有客户端(c++) 跟服务端(erlang) 通过 socket + protobuf 协议通信
am241
2016-06-03 19:54:43 +08:00
@hujianxin 看需求。和共享内存、 socket 之类的相比,效率肯定差,不过开发起来快啊
hujianxin
2016-06-03 19:57:09 +08:00
@Mutoo @am241 @peter999 多谢几位,我大体知道当下比较主流的方式了。
dphdjy
2016-06-03 20:33:47 +08:00
楼上们说着就变成数据交互格式了,虽然我也是小白

JSON/XML/protobuf/flatbuf/Parcel 都是对传输数据的封装并不是方式!!!

这个问题在不同平台和环境答案都不一样
1 两种语言的关系
2 是否同一进程
3 是否在同一设备


比如 Lua 和 C 通讯,因为 Lua 的解释器是 C 编写的,所以可以直接在解释层处理
而 Java 和 Lua ,需要通过 C 在中间转换对象

同一设备可以通过系统内的资源进行处理
比如共享内存 /共享文件 /管道

跨设备无法直接共享资源
就要 TCP

然后,因为通过网络协议封装好,适应性广泛,所以常用这种,但是这种相对于上面的性能有所损耗,但是一般也无需在意,然后 TCP 传输二进制流,流本身读取需要写结构体,各种拆包,于是出现类似 JSON/XML 这类字符串组成的文本协议,后来因为效率问题,出现 protobuf 之类的有通用结构的二进制协议

RPC 是远程调用,也是约定协议,远程执行一些需求,是上述的具体实现加以封装

同 RPC 上面一大堆乱七八糟的名词也基本都是具体封装

不过有些是平台提供的
比如 Android 的远程服务,通过内核处理的原生封装
Windows 的 Com/ActiveX (大概

如有错误,欢迎楼下指正

就酱~
markocen
2016-06-03 21:17:04 +08:00
Rabitmq, Redis
alexapollo
2016-06-03 21:23:37 +08:00
IPC, RPC => socket, pipe, file, 信号量, 共享内存
以上,左为概念,右为具体形式
444683462
2016-06-03 21:40:44 +08:00
json
yxzblue
2016-06-03 22:50:11 +08:00
Thrift
billlee
2016-06-03 22:52:53 +08:00
1. 同进程: C API
2. 不同进程:
2.1 管道
2.2 socket: unix domain socket, TCP/IP
2.3 消息队列: POSIX mq, redis, RabitMQ, dbus
2.4 HTTP API: RESTful, JSON-RPC
2.5 Signal

至于共享内存什么的,不同编程语言很难用到一起吧
SoloCompany
2016-06-04 01:42:55 +08:00
不同进程但同主机下的通信,其实还有一种比较常用的原始方式,就是文件交换
也可以算是消息队列的一种吧
edsgerlin
2016-06-04 01:51:18 +08:00
CORBA 这种老古董,果然已经没人提了吗?
JamesRuan
2016-06-04 03:07:18 +08:00
这个可以做为面试题目了。
ayaseangle
2016-06-04 03:23:07 +08:00
序列化。。。
hujianxin
2016-06-04 07:24:40 +08:00
@dphdjy 受教了,你说的很多概念我不是很懂,还得自己消化一下
hujianxin
2016-06-04 07:25:05 +08:00
@billlee 感谢回复
realpg
2016-06-04 09:26:23 +08:00
有三种:
文件,网络,共享内存

文件可以利用高层实现的锁,也可以映射到内存增加存取速度
共享内存不用说了
网络是概念,具体实现上有使用 TCP/UDP 的 在网络上有高层协议使用 http 流或者原生二进制流的,然后各种流都有承载内容类型的封装
visonme
2016-06-04 09:33:25 +08:00
大多数回答都是集中在数据交换和功能调用上,这类的依据有消息队列, web 服务,共享内存, socket ,动态链接库等,而 json/XML/PF 最多就是一种数据契约。
还有种我们说的通信是一种语言包含了解释 /编译 /运行另一种语言的模块或者功能,比如 lua 和 C/C++

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

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

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

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

© 2021 V2EX