2012-10-12 54 views
1

我想知道如何在源文件以多種不同編程語言編寫時如何在源文件之間共享函數。有什麼辦法可以在三個不同的源文件中共享用三種語言編寫的函數,如下所示?我希望用各種語言編寫的函數可以從其他語言訪問。以多種編程語言在源文件之間共享函數

(爲了澄清,所有的源文件都在同一個文件夾。)

的Java文件:

public class JavaFile{ 
    public static String generateStringFromRegex(String theRegex){ 
     //native Java function, implement this using xeger 
    } 
    public static String generateRandomString(String theString){ 
     //return the result from the corresponding Javascript function 
    } 
    public static int getFileText(String filename){ 
     //return the result from the corresponding C++ function 
    } 
} 

JavaScript文件:

function getFileText(fileName){ 
    //call the corresponding C++ function and return the value 
} 

function generateRandomString(theString){ 
    //native Javascript function 
} 
function generateStringFromRegex(int1, int2){ 
    //call the corresponding Java function and return the value 
} 

C++文件:

#include<string> 

int main(){ 

} 

string generateRandomString(string theString){ 
    //call the corresponding Javascript function and return the value 
} 
string generateStringFromRegex(string theRegex){ 
    //call the corresponding Java function and return its value 
} 

string getFileText(string fileName){ 
    //native C++ function: get the text of a text file 
} 
+0

Apache節儉? protobuf的?網頁服務? –

+0

@AbhinavSarkar我不知道他們哪一個最適合這個目的:這就是我問這個問題的原因。 –

+0

根據您的需求進行評估並選擇最合適的一款。 –

回答

1

讓我解釋一下如何函數調用機制起作用,然後你將能夠更清楚地瞭解什麼是可能的,哪些不是。

當你調用一個函數時會發生什麼? [在最頂層] 您可以使用參數調用一個函數,並且它可能會返回一個值。參數可以通過引用或按值傳遞。返回地址必須存儲在某個地方,以便被調用函數知道跳回的位置。

必須準備參數:要麼傳遞引用,以便重用地址,要麼通過值表示在堆棧上創建副本。雖然返回值必須存儲在某個地方供調用函數訪問。這也通常在堆棧上[不一定是,根據CPU架構或編譯器優化,可以是CPU上的寄存器]。最後在返回返回地址時也被返回。

對於每種語言,以上的細節都不同且不兼容。這是您需要明確地綁定跨語言的語言,從一種語言翻譯到另一種語言。這個綁定被封裝在庫[對象代碼]中。所以,例如。 C程序不直接調用Java函數。它只是有一個未解決的符號,綁定包裝以兼容的方式解析。這又會調用java代碼。

不能從C調用Java函數,除非在上面提到的目的中有一個JNI接口在中間。 編譯C++庫時,如果沒有顯式地添加支持,甚至無法從C代碼調用C++代碼。

此外,如果您已經解釋了javascript這樣的語言,我不確定您是否可以調用編譯語言。

所以我的答案是 對於任意一種語言:它取決於語言,但答案大多不是。 如果你編寫綁定來支持你的庫[記住編譯語言]:是的。

如果上述內容沒有意義,請隨時在評論中提問。

編輯:HTTP用法:

程序可以彼此通過套接字通信時跨機器或相同的機器上使用時的文件/管/共享內存。最終基於HTTP的通信不過是套接字。像apache節儉也是一樣的。它將使用套接字(跨機器)或管道(在同一臺機器中)將數據發送到另一個程序。然後Apache節儉爲另一方提供另一種語言的綁定。所以你必須有多個程序通過套接字進行通信。這與在相同語言中調用函數或使用綁定到「鏈接」到正在運行的可執行文件的對象庫不同。希望你瞭解差異。

用一種語言編寫的程序能否與用另一種語言編寫的程序通信?我們絕對會一直這樣做。您的整個互聯網都基於不同的語言。您的操作系統和軟件都有大量的語言,它們都可以無縫地互相工作,因爲它們都尊重彼此的界面。

作爲一名開發人員,雖然您需要明白,要使用跨各種語言的函數,雙方可能不得不使用節儉,並且使用RPC抽象通過套接字進行通信並通過函數調用調用函數是有區別的。希望你得到的照片。

+0

是否有可能使用RPC框架(如Apache Thrift)(而不是使用語言綁定)?我認爲使用語言綁定對於我的目的來說太不靈活了 - 我想用一種語言寫成一種可用於其他幾種語言的函數,而不僅僅是一種其他語言。 –

+0

我想也可以使用REST(代表性狀態轉移)來完成此操作,以便每種編程語言都可以使用HTTP與其他編程語言進行通信 - 這是否可行? –

+0

@AndersonGreen,是的使用節儉(這是爲你做的語言綁定..所以沒有逃脫綁定等),你可以調用不同的語言模塊。節儉內部將使用套接字。 REST是HTTP接口的體系結構。您可以使用HTTP在程序之間進行通信。在我上面的編輯中解釋。所有這些都是通過互聯網每天完成的(您的瀏覽器和堆棧溢出服務器使用不同的語言,不是?)。只是它和函數調用不一樣。 – av501