關晚我聽說用不同語言編寫的應用程序可以調用彼此的函數/子程序。現在,直到最近,我覺得這是非常自然的 - 因爲所有,是的 - 這就是我當時的想法,傻了我! - 語言被編譯成機器代碼,並且對於所有的語言都應該是相同的。只有一段時間我才意識到即使是用「更高機器代碼」--IL,字節代碼等編譯的語言也可以實際上相互交互。我試圖找到答案很多次,但失敗 - 沒有回答滿意我 - 要麼他們認爲我知道很多關於編譯器,或我完全不同意的東西,以及其他的東西......請解釋容易理解的方式如何運作。尤其是如何將語言編譯成「純粹的」機器代碼具有不同的稱爲「調用約定」的東西,這正是讓我抓住頭髮的原因。用不同語言編寫的不同應用程序如何交互?
0
A
回答
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
而另一個可能推以相反的順序的i
和j
的值,或將它們放置在寄存器中。如果foo
是由編譯器遵循另一個約定編譯的,它可能會嘗試從錯誤順序中將其參數從堆棧中取出,導致不可預知的行爲(如果它立即崩潰,請認爲自己很幸運)。
一些編譯器爲此支持各種調用約定。 Wikipedia article引入了調用約定;有關更多詳細信息,請參閱您的編譯器文檔。
最後,在同一地址空間中混合字節碼編譯或解釋語言和低級語言仍然更復雜。高級語言實現通常會有自己的一套約定來用較低級別(C或C++)代碼擴展它們。例如,Java有JNI和JNA。
相關問題
- 1. 用不同的語言編寫一個應用程序
- 2. 程序如何使用以不同語言編寫的文件?
- 3. 不同語言的Android應用程序
- 4. 不同語言的Ipad應用程序
- 5. 不同語言的iPhone應用程序
- 6. 不同語言的Rails應用程序?
- 7. 如何編寫和不同的語言
- 8. 應與不同語言編寫
- 9. 尋找使用不同語言編寫的程序示例
- 10. 使用不同編程語言的TCP
- 11. 管理用不同編程語言編寫的併發項目
- 12. 程序如何使用其他程序不使用相同的編程語言
- 13. 以區域語言/不同語言開發應用程序
- 14. 如何爲asp.NET應用程序設置不同的語言?
- 15. 如何使兩種不同語言的iphone應用程序?
- 16. 如何本地化iPhone應用程序的不同語言?
- 17. 用不同語言編寫的2個程序之間的通信 - 序列化?
- 18. 以不同語言編寫notepad ++插件
- 19. 用不同語言發言
- 20. 如何找到用特定語言編寫的應用程序?
- 21. 編程語言如何與腳本語言交互?
- 22. 連接不同的編程語言
- 23. 以不同的編程語言重載
- 24. 不同編程語言的隨機數
- 25. 以不同國家和不同語言發佈的應用程序
- 26. 使用Visual Studio以不同語言運行C#應用程序
- 27. 用於編寫GUI應用程序的編程語言
- 28. 以不同的語言運行我的C#應用程序
- 29. 使用用外語(口頭)語言編寫的應用程序
- 30. 如何使用C語言編寫多語言桌面應用程序#
thanx很多...我想我已經明白了,但我只是這麼想的......也許我會有其他的疑問... 和是的......我們所有的意思是'崩潰'一個程序 - 我的意思是在低層次的意義上...我多次看過這個短語,不能完全明白它的含義... – 2012-04-22 05:28:03
還有一件事...一臺計算機如何區分2個對象 - 就像我們使用更高層次的語言中的對象一樣,但是編譯語言中所有這些都歸結爲0和1 ......所以comp如何知道某個第n位是對象A的結尾?或者簡單地說,它甚至可以將2個整數分開?畢竟內存是按特定順序放置的比特流,對吧? – 2012-04-22 05:35:01
@ParthThakkar:崩潰意味着你的程序突然停止運作。至於你的第二個問題,這是幾乎不可能解釋的一般。你熟悉C++嗎? – 2012-04-22 11:15:12