-
1 # 碼農老楊
-
2 # 浪跡天涯adc
看你從哪裡調了,如果從本地調的話要有相應的執行環境,否則無法執行,如果都配置執行環境,會使伺服器記憶體被大量佔用,導致伺服器響應速度變慢。如果從網路上或者其他伺服器調的話,會受網路速度影響,會出現呼叫失敗的情況。這東西不好說,謹慎使用,有好有壞,最好是精簡下,儘量使用一種程式語言開發,只有特特殊的功能才會去呼叫現成的模組(比如支付等)。
-
3 # 散居獵人
當然可以。
以windows執行環境為例。
1.一種語言如 Vc++,編譯成DLL庫,被VB Delphi 等需要寫的程式直接呼叫;
2,exe檔案帶引數執行,如Delphi中shellexecute函式可以啟動Word等;
3,兩個exe都執行,用訊息傳遞資料和指令,本地程序協作。
程序協作最方便,兩個程序各自執行,功能相互分享。
-
4 # 逆著書本的光
很明確的告訴你,是可以的。首先C++裡面可以呼叫C,JAVA同樣可以透過jni方式呼叫底層的C程式碼,JAVA關鍵字native,著名的JAVA領域netty網路框架底層就大量呼叫了C程式碼,你可以找資料研究研究。再者最典型的就是目前ionic,react native這種混合APP開發框架就是透過JavaScript大量呼叫原生Android介面或者iOS介面完成跨平臺開發的。但是谷歌的flutter框架似乎成為了跨平臺的青睞。
-
5 # 工控電子愛好者
只要各個程式都留有介面模組一般都可以相互呼叫的,現在大部分軟體都有二次開發的功能,這個所謂的二次開發就是指不同的軟體可以直接的相互呼叫,完成各自的功能。
-
6 # IT達人說
我從兩個方面進行回答,一個是本地呼叫,一個是遠端呼叫。
一、本地呼叫
本地呼叫又兩個方面闡述,一是不同程序(不同進行語言可能不一樣)之間的通訊;二是不同語言本地呼叫,這一點舉了 幾種常用的語言呼叫,其他的不再累贅:
1、不同程序之間主要透過以下方式進行通訊(IPC呼叫)
程序間通訊(IPC,InterProcess Communication)是指在不同程序之間傳播或交換資訊。IPC的方式通常有管道(包括無名管道和命名管道)、訊息佇列、訊號量、共享儲存、Socket、Streams等。其中 Socket和Streams支援不同主機上的兩個程序IPC。
2、C++ 跨語言呼叫 Java
Java JDK 提供了 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直譯器,若初始化失敗,繼續呼叫會出現各種錯誤void Py_Initialize(void)
檢查Python直譯器是否初始化,返回0表示沒有經過初始化
int Py_IsInitialized(void)
反初始化直譯器,包括子直譯器,同時釋放Python直譯器佔用的資源
void Py_Finalize()
實際上是一個宏,執行Python程式碼
int PyRun_SimpleString(const char *command)
匯入一個模組,name是Python檔案的檔名,不帶.py,類似於Python內建的import
PyObject* PyImport_ImportModule(char *name)
相當於Python模組物件的dict屬性,得到模組名稱空間下的字典物件
PyObject* PyModule_GetDict( PyObject *module)
執行一段Python程式碼
PyObject* PyRun_String(const char* str, int start,PyObject* globals, PyObject* locals)
把Python資料型別轉換為C的型別
int PyArg_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 __stdcall Add(int n1, int n2);
__stdcall表示呼叫約定:引數都是從右向左透過堆疊傳遞, 函式呼叫在返回前要由被呼叫者清理堆疊。
在C#中,呼叫如下:
[DllImport(“SampleCppWrapper.dll”)] private static extern int Add(int n1, int n2);
注意引數的型別,之後,可直接在C#程式設計中使用這個方法。
(2)呼叫C++類庫中的類的方法
C#不能直接呼叫C++類庫中的類,需要一種變通的解決方式,透過再做一個C++類庫把要呼叫的類成員方法暴露出來
(3)使用C++類庫中的回撥函式
C++的回撥函式是一種事件響應機制,和C#的委託相似,比如一個C++類中的回撥函式:個人感覺與方法二大同小異,沒有深入去探究,所以也就不太清楚功能上的優劣
二、遠端呼叫
就是各種RPC了,RPC(Remote Procedure Call)—遠端過程呼叫,它是一種透過網路從遠端計算機程式上請求服務,而不需要了解底層網路技術的協議。RPC協議假定某些傳輸協議的存在,如TCP或UDP,為通訊程式之間攜帶資訊資料。在OSI網路通訊模型中,RPC跨越了傳輸層和應用層。RPC使得開發包括網路分散式多程式在內的應用程式更加容易。
RPC採用客戶機/伺服器模式。請求程式就是一個客戶機,而服務提供程式就是一個伺服器。首先,客戶機呼叫程序傳送一個有程序引數的呼叫資訊到服務程序,然後等待應答資訊。在伺服器端,程序保持睡眠狀態直到呼叫資訊到達為止。當一個呼叫資訊到達,伺服器獲得程序引數,計算結果,傳送答覆資訊,然後等待下一個呼叫資訊,最後,客戶端呼叫程序接收答覆資訊,獲得程序結果,然後呼叫執行繼續進行。
其中客戶機,伺服器都可能是不同的語言,也有可能相同。他們透過RPC實現了互通
目前常用的RPC協議有哪些呢?主要有CORBA,Java RMI,Web Service,Hessian,Thrift,XML-RPC,SOAP,HTTP等
-
7 # 光明右使8787
C基本上能被一切高階語言呼叫,比如php,可以寫成擴充套件模組。高階語言之間就難了,封裝的越高階,靈活性越低,被呼叫的可能性越小。最終極的辦法是透過命令管道直接呼叫程序,指令碼型語言就常幹這事。
-
8 # 大學生程式設計指南
作為一個寫了多年程式碼的程式設計師來嘗試回答這個問題,在真正搞明白這個事情之前首先要想明白一件事情,目前所有的程式語言都要遵守馮諾依曼的架構,也就是所有程式語言都要轉化成二進位制的檔案機器語言,這樣子計算機才能真正識別認識,全球存有的程式語言數量已經達到500多種,真正主流的程式語言差不多有十幾種,而且在前幾名的程式語言隨著時代的發展也是一直在發生變化,因為科技在進步任何一種程式語言不可能永遠處於一個高點。
不同程式語言呼叫原理要講清楚這件事,就要對計算機的原理有所瞭解,按照馮諾依曼的計算機架構記憶體,硬碟,cpu這三者需要需要協調工作起來才能正常工作,把所有的程式設計程式碼轉化成二進位制檔案,這個機器才能識別執行,所以至於上面有多少層的呼叫,從計算機的角度來講都是一視同仁,計算機本身不知道程式設計用的什麼語言。
現在就以C語言C++之間的互相呼叫作為例子來講述,由於各個語言都有自己的編譯結構,很難直接全方面混合呼叫,一般採用中間蠕道的方式打通一個通道然後進行資料融合,C語言和C++資料互相呼叫主要透過一個extern關鍵字通道來完成的,而且透過這種關鍵字還能完成互相呼叫的過程,因為本質上C語言屬於面向過程的語言,C++是面向物件的操作,所以在記憶體結構擺列方式就不太一樣,C語言融入到C++裡面主要是透過設定C語言的函式成為全域性變數的方式納入到C++體系的,而C語言呼叫C++的類介面,其實也是講自己轉化成全域性方式來呼叫,如果真的呼叫C++中的類變數這種其實在語法上存在問題。
安卓核心框架主要是C++和C語言,Java三種程式語言融合在一起的,C++和C語言之間的互相呼叫其實上面已經講述過了java和C語言的之間互相呼叫,也是類似於蠕洞方式,所以我們在看到很多安卓的app內部包含著一個動態so庫,就是透過動態dlopen的方式動態把庫載入進去,然後透過在java打通的底層蠕洞完成java呼叫底層語言的過程,因為這種蠕洞的存在直接能夠提升程式設計的靈活性,幾乎所有主流的程式語言之間都可以透過這種方式來完成真正意義上的互相呼叫。
不同程式語言呼叫產生多少開銷前段時間吵得非常熱的方舟編譯器,在本質上講和不同的程式語言之間的呼叫有一定關聯,其實不同程式語言之間融合對於編譯器的設計是一種極大的挑戰,華為方舟編譯器最大的挑戰是把java虛擬機器給拿掉了,然後透過演算法或者推斷的方式把動態執行過程中的行為都歸納出來,因為java執行的原理是把java語言翻譯成中間檔案,中間檔案在虛擬機器中轉化成計算機能夠識別的二進位制檔案,java也是透過虛擬機器的方式完成跨平臺使用。
一般來講不同程式語言之間互相呼叫在編譯器裡面如果設計不是很妥當很可能造成效能的損失,原則上在設計的時候儘量不要交叉呼叫,但在實際開發過程中也很難避免掉,方舟編譯同時也對java直接呼叫C++的進行重點的最佳化,這塊頁數損失效能很重要的一塊,對於這塊的最佳化一般的企業很難有這種精力去做,因為這種基礎性的研究很難短時間內有突破還需要持續性的支出,所以在平時設計模組程式碼的時候儘量減少不同程式語言之間的混合使用。
-
9 # 枝枝葉葉
不同程式語言寫的程式,相互協作,共同完成一個任務,一般是 透過程式間 交換資料來完成的,比如 透過微服務構架,透過 程序間 通訊。一些程式語言,比如python 有用 c語言擴充套件的 介面,可以用 c語言實現函式,提高執行速度。不同語言編寫的程式,每個都編譯成可執行程式或用直譯器執行。另一種 程式語言,可以啟動 新程序 來 呼叫可執行程式 或直譯器 是可以的。 如果想將 不同程式語言 寫的 程式,編譯成一個單一的可執行程式或可執行指令碼,除非這門語言 有專門的 擴充套件介面支援另一種程式語言,比如python 和 java 都有c擴充套件介面,一般情況下 是不方便的。 不同語言程式間,透過交換資料協作,採用微服務構架或程序間 通訊 是 常用的方法。
回覆列表
是個好問題,Google的gRPC就是幹這事的。類似的還有facebook的thrift。
gRPC是一個高效能、開源和通用的RPC框架,面向移動和HTTP/2設計。
目前提供C、Java和Go語言版本,分別是grpc、grpc-java、grpc-go。
gRPC基於HTTP/2標準設計,帶來諸如雙向流、流控、頭部壓縮、單TCP連線上的多複用請求等特性。
這些特性使得其在移動裝置上表現更好,更省電和節省空間佔用。
gRPC由google開發,是一款語言中立、平臺中立、開源的遠端過程呼叫系統。