V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
hujianxin
V2EX  ›  程序员

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

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

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

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

    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  
       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
        21
    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   ·   我们的愿景   ·   实用小工具   ·   882 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 21:57 · PVG 05:57 · LAX 14:57 · JFK 17:57
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.