2012-04-21 84 views
0

關晚我聽說用不同語言編寫的應用程序可以調用彼此的函數/子程序。現在,直到最近,我覺得這是非常自然的 - 因爲所有,是的 - 這就是我當時的想法,傻了我! - 語言被編譯成機器代碼,並且對於所有的語言都應該是相同的。只有一段時間我才意識到即使是用「更高機器代碼」--IL,字節代碼等編譯的語言也可以實際上相互交互。我試圖找到答案很多次,但失敗 - 沒有回答滿意我 - 要麼他們認爲我知道很多關於編譯器,或我完全不同意的東西,以及其他的東西......請解釋容易理解的方式如何運作。尤其是如何將語言編譯成「純粹的」機器代碼具有不同的稱爲「調用約定」的東西,這正是讓我抓住頭髮的原因。用不同語言編寫的不同應用程序如何交互?

回答

0

這實際上是一個非常廣泛的話題。編譯成機器碼的語言通常可以調用彼此的例程,但通常不是毫不費力;例如,C++代碼可以調用C例程時正確聲明:

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

這是因爲它得到一樣簡單,因爲C++是明確設計與C兼容性(它包括在C中調用C++程序,以及支持) 。

調用約定的確使圖片複雜化,因爲由一個編譯器編譯的C例程可能不會從另一個編譯器編譯的C中調用,除非它們共享一個公共調用約定。例如,一個編譯器可能編譯

foo(i, j); 

至(僞彙編)

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

而另一個可能推以相反的順序的ij的值,或將它們放置在寄存器中。如果foo是由編譯器遵循另一個約定編譯的,它可能會嘗試從錯誤順序中將其參數從堆棧中取出,導致不可預知的行爲(如果它立即崩潰,請認爲自己很幸運)。

一些編譯器爲此支持各種調用約定。 Wikipedia article引入了調用約定;有關更多詳細信息,請參閱您的編譯器文檔。

最後,在同一地址空間中混合字節碼編譯或解釋語言和低級語言仍然更復雜。高級語言實現通常會有自己的一套約定來用較低級別(C或C++)代碼擴展它們。例如,Java有JNIJNA

+0

thanx很多...我想我已經明白了,但我只是這麼想的......也許我會有其他的疑問... 和是的......我們所有的意思是'崩潰'一個程序 - 我的意思是在低層次的意義上...我多次看過這個短語,不能完全明白它的含義... – 2012-04-22 05:28:03

+0

還有一件事...一臺計算機如何區分2個對象 - 就像我們使用更高層次的語言中的對象一樣,但是編譯語言中所有這些都歸結爲0和1 ......所以comp如何知道某個第n位是對象A的結尾?或者簡單地說,它甚至可以將2個整數分開?畢竟內存是按特定順序放置的比特流,對吧? – 2012-04-22 05:35:01

+0

@ParthThakkar:崩潰意味着你的程序突然停止運作。至於你的第二個問題,這是幾乎不可能解釋的一般。你熟悉C++嗎? – 2012-04-22 11:15:12