2012-04-21 89 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