Language agnostic 在多种编程语言的源文件之间共享函数

Language agnostic 在多种编程语言的源文件之间共享函数,language-agnostic,rpc,language-binding,Language Agnostic,Rpc,Language Binding,当源文件用几种不同的编程语言编写时,我试图找出如何在源文件之间共享函数。有没有办法在三个不同的源文件中共享用三种语言编写的函数,如下所示?我希望用每种语言编写的函数可以从其他语言访问 (为了澄清,所有源文件都在同一文件夹中。) Java文件: public class JavaFile{ public static String generateStringFromRegex(String theRegex){ //native Java function, implem

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

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

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
}
#包括
int main(){
}
字符串生成器字符串(字符串的字符串){
//调用相应的Javascript函数并返回值
}
字符串生成器StringFromRegex(字符串Theregx){
//调用相应的Java函数并返回其值
}
字符串getFileText(字符串文件名){
//本机C++函数:获取文本文件的文本
}

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

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

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

对于每种语言,上面的细节都是不同的,不兼容的。这就是需要跨语言显式地进行绑定的地方,这些绑定可以从一种语言转换到另一种语言。此绑定跨库包装[对象代码]。所以,例如,C程序不直接调用Java函数。它只是有一个未解析的符号,绑定包装器以兼容的方式解析该符号。这反过来调用java代码

不能从C调用java函数,除非中间有一个JNI接口,用于上面提到的目的。 在编译C++库时,甚至不能在C代码中调用C++代码,而不显式添加支持。 此外,如果您已经解释了类似javascript的语言,我不确定您是否可以调用编译语言

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

如果上述内容不合理,请在评论中提问

编辑:HTTP用法:

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

用一种语言编写的程序能否与用另一种语言编写的程序进行通信?当然,我们一直都在这样做。你的整个互联网都是基于不同的语言。您的操作系统和其中的软件有大量语言,它们都可以无缝地相互工作,因为它们都尊重彼此的界面


但作为一名开发人员,您需要了解,要跨各种语言使用函数,双方可能都必须使用节俭,并且使用RPC抽象通过套接字进行通信与通过函数调用调用函数之间存在差异。希望您能理解。

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

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

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

对于每种语言,上面的细节都是不同的,不兼容的。这就是需要跨语言显式地进行绑定的地方,这些绑定可以从一种语言转换到另一种语言。此绑定跨库包装[对象代码]。所以,例如,C程序不直接调用Java函数。它只是有一个未解析的符号,绑定包装器以兼容的方式解析该符号。这反过来调用java代码

不能从C调用java函数,除非中间有一个JNI接口,用于上面提到的目的。 在编译C++库时,甚至不能在C代码中调用C++代码,而不显式添加支持。 此外,如果您已经解释了类似javascript的语言,我不确定您是否可以将编译后的语言称为