首页 >

不同编程语言的程序可不可以通过接口相互调用? – 网络|

cad布局视囗怎么旋转,网络安全销售薪资待遇如何,怎么下载恢复数据恢复不同编程语言的程序可不可以通过接口相互调用? - 网络|不同编程语言的程序可不可以通过接口相互调用

一、本地调用

本地调用又两个方面阐述,一是不同进程(不同进行语言可能不一样)之间的通信;二是不同语言本地调用,这一点举了几种常用的语言调用,其他的不再累赘:

1、不同进程之间主要通过以下方式进行通信(IPC调用)

进程间通信(IPC,InterProcessCommunication)是指在不同进程之间传播或交换信息。IPC的方式通常有管道(包括无名管道和命名管道)、消息队列、信号量、共享存储、Socket、Streams等。其中Socket和Streams支持不同主机上的两个进程IPC。

2、C++跨语言调用Java

JavaJDK提供了JNI接口供C/C++程序调用Java编译后的类与方法,主要依赖于头文件(jni.h)和动态库(jvm.so/jvm.dll),JNI包含了丰富的接口映射和跨语言的数据通信,非常复杂。

3、C、C++中调用Python

通过C++调用Python脚本,主要利用Python提供的API,实际上,C++主要调用的是Python的解释器,而Python的解释器本质就是实现在动态链接库里的,因此在调用前后要进行一些初始化和资源释放的工作,另外,要调用Python脚本里的函数等等,需要使用Python提供的一些特殊的API来包装C++调用。比如:

  • 初始化Python解释器,若初始化失败,继续调用会出现各种错误

voidPy_Initialize(void)

  • 检查Python解释器是否初始化,返回0表示没有经过初始化

intPy_IsInitialized(void)

  • 反初始化解释器,包括子解释器,同时释放Python解释器占用的资源

voidPy_Finalize()

  • 实际上是一个宏,执行Python代码

intPyRun_SimpleString(constchar*command)

  • 导入一个模块,name是Python文件的文件名,不带.py,类似于Python内建的import

PyObject*PyImport_ImportModule(char*name)

  • 相当于Python模块对象的dict属性,得到模块名称空间下的字典对象

PyObject*PyModule_GetDict(PyObject*module)

  • 执行一段Python代码

PyObject*PyRun_String(constchar*str,intstart,PyObject*globals,PyObject*locals)

  • 把Python数据类型转换为C的类型

intPyArg_Parse(PyObject*args,char*format,…)

  • 返回模块对象o的attr_name属性或函数,相当于Python中的表达式o.attr_name

PyObject*PyObject_GetAttrString(PyObject*o,char*attr_name)

  • 构建一个参数列表,将C类型转换为Python对象

PyObject*Py_BuildValue(char*format,…)

  • 调用Python函数,两个参数都是Python对象指针,pfunc是要调用的Python函数,一般来说,可以用过PyObject_GetAttrString()获得,pargs是函数的参数列表,通常是Py_BuildValue()来构建的

PyObject*PyEval_CallObject(PyObject*pfunc,PyObject*pargs)

4、C#调用的C++库

提供了三种调用方式

(1)直接调用C++类库中的公共方法

使用DllImport特性对方法进行调用,比如一个C++类库SampleCppWrapper.dll中的公共方法:

extern“C”__declspec(dllexport)int__stdcallAdd(intn1,intn2);

__stdcall表示调用约定:参数都是从右向左通过堆栈传递,函数调用在返回前要由被调用者清理堆栈。

在C#中,调用如下:

[DllImport(“SampleCppWrapper.dll”)]privatestaticexternintAdd(intn1,intn2);

注意参数的类型,之后,可直接在C#编程中使用这个方法。

(2)调用C++类库中的类的方法

C#不能直接调用C++类库中的类,需要一种变通的解决方式,通过再做一个C++类库把要调用的类成员方法暴露出来

(3)使用C++类库中的回调函数

C++的回调函数是一种事件响应机制,和C#的委托相似,比如一个C++类中的回调函数:个人感觉与方法二大同小异,没有深入去探究,所以也就不太清楚功能上的优劣

二、远程调用

就是各种RPC了,RPC(RemoteProcedureCall)—远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。

RPC采用客户机/服务器模式。请求程序就是一个客户机,而服务提供程序就是一个服务器。首先,客户机调用进程发送一个有进程参数的调用信息到服务进程,然后等待应答信息。在服务器端,进程保持睡眠状态直到调用信息到达为止。当一个调用信息到达,服务器获得进程参数,计算结果,发送答复信息,然后等待下一个调用信息,最后,客户端调用进程接收答复信息,获得进程结果,然后调用执行继续进行。

其中客户机,服务器都可能是不同的语言,也有可能相同。他们通过RPC实现了互通

目前常用的RPC协议有哪些呢?主要有CORBA,JavaRMI,WebService,Hessian,Thrift,XML-RPC,SOAP,HTTP等


不同编程语言的程序可不可以通过接口相互调用? - 网络|
  • C语言,统计素数并求和? - 网络|
  • C语言,统计素数并求和? - 网络| | C语言,统计素数并求和? - 网络| ...

    不同编程语言的程序可不可以通过接口相互调用? - 网络|
  • 听说阿里巴巴都开始裁员了,是真的吗? - 网络|
  • 听说阿里巴巴都开始裁员了,是真的吗? - 网络| | 听说阿里巴巴都开始裁员了,是真的吗? - 网络| ...

    不同编程语言的程序可不可以通过接口相互调用? - 网络|
  • c语言字符串处理方法与实例分享 - 网络|
  • c语言字符串处理方法与实例分享 - 网络| | c语言字符串处理方法与实例分享 - 网络| ...