欧美一区二区三区,国内熟女精品熟女A片视频小说,日本av网,小鲜肉男男GAY做受XXX网站

不同編程語言的程序可不可以通過接口相互調用?

夏志豪2年前15瀏覽0評論

我從兩個方面進行回答,一個是本地調用,一個是遠程調用。

一、本地調用

本地調用又兩個方面闡述,一是不同進程(不同進行語言可能不一樣)之間的通信;二是不同語言本地調用,這一點舉了幾種常用的語言調用,其他的不再累贅:

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等