不同编程语言之间的通信方式有哪些? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
hujianxin
V2EX    程序员

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

  •  4
     
  •   hujianxin 2016-06-03 19:23:06 +08:00 11577 次点击
    这是一个创建于 3417 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

    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
        8
    markocen  
       2016-06-03 21:17:04 +08:00
    Rabitmq, Redis
    alexapollo
        9
    alexapollo  
       2016-06-03 21:23:37 +08:00
    IPC, RPC => socket, pipe, file, 信号量, 共享内存
    以上,左为概念,右为具体形式
    444683462
        10
    444683462  
       2016-06-03 21:40:44 +08:00
    json
    yxzblue
        11
    yxzblue  
       2016-06-03 22:50:11 +08:00
    Thrift
    billlee
        12
    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
        13
    SoloCompany  
       2016-06-04 01:42:55 +08:00
    不同进程但同主机下的通信,其实还有一种比较常用的原始方式,就是文件交换
    也可以算是消息队列的一种吧
    edsgerlin
        14
    edsgerlin  
       2016-06-04 01:51:18 +08:00   1
    CORBA 这种老古董,果然已经没人提了吗?
    JamesRuan
        15
    JamesRuan  
       2016-06-04 03:07:18 +08:00
    这个可以做为面试题目了。
    ayaseangle
        16
    ayaseangle  
       2016-06-04 03:23:07 +08:00
    序列化。。。
    hujianxin
        17
    hujianxin  
    OP
       2016-06-04 07:24:40 +08:00
    @dphdjy 受教了,你说的很多概念我不是很懂,还得自己消化一下
    hujianxin
        18
    hujianxin  
    OP
       2016-06-04 07:25:05 +08:00
    @billlee 感谢回复
    realpg
        19
    realpg  
    PRO
       2016-06-04 09:26:23 +08:00
    有三种:
    文件,网络,共享内存

    文件可以利用高层实现的锁,也可以映射到内存增加存取速度
    共享内存不用说了
    网络是概念,具体实现上有使用 TCP/UDP 的 在网络上有高层协议使用 http 流或者原生二进制流的,然后各种流都有承载内容类型的封装
    visonme
        20
    visonme  
       2016-06-04 09:33:25 +08:00
    大多数回答都是集中在数据交换和功能调用上,这类的依据有消息队列, web 服务,共享内存, socket ,动态链接库等,而 json/XML/PF 最多就是一种数据契约。
    还有种我们说的通信是一种语言包含了解释 /编译 /运行另一种语言的模块或者功能,比如 lua 和 C/C++
    ElloRay
       
    ElloRay  
       2016-06-04 09:40:05 +08:00
    thrift 没人用吗
    kanner
        22
    kanner  
       2016-06-04 10:10:22 +08:00
    thrift 的序列化+thrift 的 RPC
    elgoog1970
        23
    elgoog1970  
       2016-06-04 10:26:00 +08:00
    json,xml,protobuf, .....
    tobyxdd
        24
    tobyxdd  
       2016-06-04 10:28:37 +08:00 via Android
    socket 挺好
    ooTwToo
        25
    ooTwToo  
       2016-06-04 10:34:43 +08:00 via iPhone
    总归都是 tcp 和 udp 吧
    quericy
        26
    quericy  
       2016-06-04 10:42:30 +08:00
    json,msgpack
    alexapollo
        27
    alexapollo  
       2016-06-04 10:43:07 +08:00
    @ooTwToo RPC 才走协议栈
    alexapollo
        28
    alexapollo  
       2016-06-04 10:43:39 +08:00
    @ElloRay
    @kanner 现在都有哪些公司在用 thrift ?有用 grpc 的吗?
    edfward
        29
    edfward  
       2016-06-04 11:49:11 +08:00
    @alexapollo https://github.com/uber/tchannel Uber 内 thrift+tchannel 挺常见的
    alexapollo
        30
    alexapollo  
       2016-06-04 11:50:45 +08:00
    @edfward hmm ,我在想 thrift 对比 grpc 是否更成熟点
    alexapollo
        31
    alexapollo  
       2016-06-04 11:51:52 +08:00
    默默给各位安利一下刚刚画的两张图,说明这些技术、概念的关系的
    传送门 1 : http://www.anwcl.com/wordpress/ipc-rpc/
    传送门 2 : http://www.v2ex.com/t/283430#reply0
    smithtel
        32
    smithtel  
       2016-06-04 13:37:31 +08:00
    ICE
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2606 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 10:42 PVG 18:42 LAX 03:42 JFK 06:42
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86