1

ソースファイルがいくつかの異なるプログラミング言語で書かれているときに、ソースファイル間で関数を共有する方法を理解しようとしています。以下に示すように、3つの異なるソースファイル間で3つの言語で記述された関数を共有する方法はありますか?各言語で書かれた関数に他の言語からアクセスできるようにしたい。

(明確にするために、すべてのソースファイルは同じフォルダーにあります。)

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 は、反対側で他の言語のバインディングを提供します。したがって、ソケットを介して通信する複数のプログラムを実行する必要があります。これは、同じ言語内での関数呼び出しや、実行中の実行可能ファイルに "リンク" されたオブジェクト ライブラリへのバインドを使用する関数呼び出しとは異なります。違いを理解していただければ幸いです。

ある言語で書かれたプログラムは、別の言語で書かれたプログラムと通信できますか? 絶対に私たちはいつもそれをしています。インターネット全体は、さまざまな言語に基づいています。オペレーティング システムとその中のソフトウェアは、さまざまな言語で構成されており、相互のインターフェイスを尊重しているため、すべてシームレスに連携します。

ただし、開発者として、さまざまな言語で関数を使用するには両側で倹約を使用する必要があること、および RPC 抽象化を使用してソケットを介して通信することと、関数呼び出しを介して関数を呼び出すことには違いがあることを理解する必要があります。あなたが絵を手に入れることを願っています。

于 2012-10-14T23:43:21.803 に答える