当我用几种不同的编程语言编写源文件时,我正在试图弄清楚如何在源文件之间共享函数。有没有办法在三个不同的源文件中共享用三种语言编写的函数,如下所示?我希望可以从其他语言访问用每种语言编写的函数。
(澄清一下,所有源文件都在同一个文件夹中。)
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 :(得分:1)
让我解释一下函数调用机制是如何工作的,然后你就可以更清楚地了解什么是可能的,什么不是。
调用函数时会发生什么? [在最顶层] 您使用参数调用函数,它可能返回一个值。参数可以通过引用或值传递。返回地址必须存储在某处,以便被调用的函数知道要跳回的位置。
必须准备参数:传递引用以便重用地址或按值表示正在堆栈上创建副本。返回时,返回值必须存储在调用函数访问的某处。这通常也在堆栈上[不一定,可以是CPU上的寄存器,具体取决于CPU架构或编译器优化]。最后返回时也返回了返回地址。
对于每种语言,上述细节都不同且不兼容。在这里,您需要明确地跨语言绑定,从一种语言转换为另一种语言。此绑定包含在库[目标代码]中。所以,例如。 C程序不直接调用Java函数。它只是一个未解析的符号,绑定包装器以兼容的方式解析。这反过来调用java代码。
除非上面提到的目的在中间有一个JNI接口,否则不能从C调用Java函数。 在编译C ++库时,如果没有显式添加支持,就无法从C代码调用C ++代码。
此外,如果您已经解释了类似javascript的语言,我不确定您是否可以调用编译语言。
所以我的回答是 对于一组任意语言:它取决于语言,但答案主要是否定的。 如果你编写绑定来支持你的库[记住编译语言]:是的。
如果上述内容没有意义,请随意在评论中提问。
编辑:HTTP使用:
程序可以跨机器通过套接字相互通信,也可以在同一台机器上使用文件/管道/共享内存。最终,基于HTTP的通信只不过是套接字。像apache thrift这样的东西也是一样的。它将使用套接字(跨机器)或管道(在同一台机器中)将数据发送到另一个程序。然后,Apache thrift在另一端提供另一种语言的绑定。所以你必须让多个程序通过套接字进行通信。这与同一语言中的函数调用或使用绑定到“链接”到正在运行的可执行文件的对象库不同。希望你能理解其中的差异。
用一种语言编写的程序可以与用另一种语言编写的程序进行通信吗?我们绝对会一直这样做。您的整个互联网都基于不同的语言。您的操作系统和软件数量众多,并且它们彼此无缝协作,因为它们都尊重彼此的界面。
作为开发人员,虽然您需要了解要使用各种语言的函数,双方可能必须使用thrift,并且使用RPC抽象通过套接字进行通信和通过函数调用调用函数之间存在差异。希望你能得到这张照片。