以多种编程语言共享源文件之间的功能

时间:2012-10-12 18:10:20

标签: language-agnostic rpc language-binding

当我用几种不同的编程语言编写源文件时,我正在试图弄清楚如何在源文件之间共享函数。有没有办法在三个不同的源文件中共享用三种语言编写的函数,如下所示?我希望可以从其他语言访问用每种语言编写的函数。

(澄清一下,所有源文件都在同一个文件夹中。)

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
}

1 个答案:

答案 0 :(得分:1)

让我解释一下函数调用机制是如何工作的,然后你就可以更清楚地了解什么是可能的,什么不是。

调用函数时会发生什么? [在最顶层] 您使用参数调用函数,它可能返回一个值。参数可以通过引用或值传递。返回地址必须存储在某处,以便被调用的函数知道要跳回的位置。

必须准备参数:传递引用以便重用地址或按值表示正在堆栈上创建副本。返回时,返回值必须存储在调用函数访问的某处。这通常也在堆栈上[不一定,可以是CPU上的寄存器,具体取决于CPU架构或编译器优化]。最后返回时也返回了返回地址。

对于每种语言,上述细节都不同且不兼容。在这里,您需要明确地跨语言绑定,从一种语言转换为另一种语言。此绑定包含在库[目标代码]中。所以,例如。 C程序不直接调用Java函数。它只是一个未解析的符号,绑定包装器以兼容的方式解析。这反过来调用java代码。

除非上面提到的目的在中间有一个JNI接口,否则不能从C调用Java函数。 在编译C ++库时,如果没有显式添加支持,就无法从C代码调用C ++代码。

此外,如果您已经解释了类似javascript的语言,我不确定您是否可以调用编译语言。

所以我的回答是 对于一组任意语言:它取决于语言,但答案主要是否定的。 如果你编写绑定来支持你的库[记住编译语言]:是的。

如果上述内容没有意义,请随意在评论中提问。

编辑:HTTP使用:

程序可以跨机器通过套接字相互通信,也可以在同一台机器上使用文件/管道/共享内存。最终,基于HTTP的通信只不过是套接字。像apache thrift这样的东西也是一样的。它将使用套接字(跨机器)或管道(在同一台机器中)将数据发送到另一个程序。然后,Apache thrift在另一端提供另一种语言的绑定。所以你必须让多个程序通过套接字进行通信。这与同一语言中的函数调用或使用绑定到“链接”到正在运行的可执行文件的对象库不同。希望你能理解其中的差异。

用一种语言编写的程序可以与用另一种语言编写的程序进行通信吗?我们绝对会一直这样做。您的整个互联网都基于不同的语言。您的操作系统和软件数量众多,并且它们彼此无缝协作,因为它们都尊重彼此的界面。

作为开发人员,虽然您需要了解要使用各种语言的函数,双方可能必须使用thrift,并且使用RPC抽象通过套接字进行通信和通过函数调用调用函数之间存在差异。希望你能得到这张照片。