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
}
4

1 回答 1

1

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

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

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

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

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

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

所以我的答案是对于任意的语言集:这取决于语言,但答案大多是否定的。如果您编写绑定来支持您的库 [记住编译语言]:是的。

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

编辑:HTTP 用法:

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

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

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

于 2012-10-14T23:43:21.803 回答