2012-04-21 3 views
0

遅くとも私は、異なる言語で書かれたアプリケーションがお互いの関数/サブルーチンを呼び出せると聞いていました。今まで、私はそれが非常に自然であると感じました - すべて、そう、すべて - それは私が考えていたことです、愚かな私! - 言語は機械コードにコンパイルされ、すべての言語で同じでなければなりません。私は、IL、バイトコードなど、互いに上位のマシンコードでコンパイルされた言語であっても、実際にはアプリケーションが相互に作用することを認識しました。私は何度も答えを見つけようとしましたが、失敗しました - 答えは私を満足させませんでした - 彼らは私がコンパイラや全く同意しなかったもの、そして他のものを知っていたと推測しました。これがどのように機能するかを理解しやすい。特に、「純粋な」マシンコードにコンパイルされた言語が「呼び出し規約」とは異なるものを持っていることが、私の髪をくすぐるものです。異なる言語で書かれたさまざまなアプリはどのように相互作用しますか?

答えて

0

これは実際には非常に広いトピックです。機械コードにコンパイルされた言語は、通常は労力を要することなく、お互いのルーチンを呼び出すことができます。例えば、C++正しく宣言時にCルーチンを呼び出すことができますコード:C++が明示的にCとの互換性のために設計されたため、

// declare the C function foo so it can be called by C++ code 
extern "C" { 
    void foo(int, char *); 
} 

これは、それを取得と同じくらい簡単ですが(それは同様にCからC++ルーチンを呼び出すためのサポートが含まれています) 。

共通の呼び出し規約を共有していない限り、1つのコンパイラでコンパイルされたCルーチンは別のコンパイラでコンパイルされたCから呼び出すことができないという点で、実際には複雑です。別の逆の順序でijの値を押すかもしれないが、例えば、あるコンパイラは、(擬似アセンブリ)

PUSH the value of i on the stack 
PUSH the value of j on the stack 
JUMP into foo 

foo(i, j); 

をコンパイルしたり、レジスタに置きます。 fooが別の規則に従ってコンパイラによってコンパイルされた場合、スタックから引数をフェッチして間違った順序で取得しようとすると、予期しない動作が発生する可能性があります。

一部のコンパイラでは、この目的でさまざまな呼び出し規約がサポートされています。 Wikipedia articleには呼び出し規約が導入されています。詳細については、コンパイラのドキュメントを参照してください。

最後に、同じアドレス空間でバイトコードでコンパイルされた言語と解釈された言語と低レベルのものを混在させることはさらに複雑です。高水準言語の実装には、通常、低レベル(CまたはC++)コードでそれらを拡張するための独自の規則が用意されています。たとえば、JavaはJNIJNAです。

+0

thanx多く...私はそれを理解していると思うが、私はちょうどそう思う...多分私は他の疑問を持っているだろう... とはい...正確に私たちはすべて 'プログラムの - 私は低レベルの意味で...私は何度もこのフレーズを見て、それが意味するものを正確に作ることができなかった... –

+0

もう一つのこと...どのようにコンピュータは2つのオブジェクト - 私たちはより高いレベルのオブジェクトでオブジェクトを使用するようになりますが、コンパイルされた言語では0と1になります... n番目のビットがオブジェクトAの終わりであることをコンパイラがどのように知っていますか?単純に2つの整数をどうやって分離することができますか?すべてのメモリが特定の順序で配置されたビットのストリームであるとしたら、右か? –

+0

@ParthThakkar:クラッシュすると、プログラムが突然機能しなくなります。あなたの2番目の質問については、それは一般的に説明することはかなり不可能です。あなたはC++に精通していますか? –

関連する問題