关晚我听说用不同语言编写的应用程序可以调用彼此的函数/子程序。现在,直到最近,我觉得这是非常自然的 - 因为所有,是的 - 这就是我当时的想法,傻了我! - 语言被编译成机器代码,并且对于所有的语言都应该是相同的。只有一段时间我才意识到即使是用“更高机器代码”--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. 不同语言的Rails应用程序?
- 4. 不同语言的Android应用程序
- 5. 不同语言的iPhone应用程序
- 6. 如何编写和不同的语言
- 7. 寻找使用不同语言编写的程序示例
- 8. 管理用不同编程语言编写的并发项目
- 9. 如何使两种不同语言的iphone应用程序?
- 10. 用不同语言编写的2个程序之间的通信 - 序列化?
- 11. 用不同语言发言
- 12. 如何找到用特定语言编写的应用程序?
- 13. 不同编程语言的随机数
- 14. 以不同的编程语言重载
- 15. 以不同国家和不同语言发布的应用程序
- 16. 使用Visual Studio以不同语言运行C#应用程序
- 17. 用于编写GUI应用程序的编程语言
- 18. 不同语言的用户
- 19. 使用用外语(口头)语言编写的应用程序
- 20. 什么是多语言JavaScript应用程序的不同方法
- 21. 如何编写wstring行包含不同语言的文件?
- 22. 如何暴露以不同语言编写的对象/函数?
- 23. 合并不同语言的程序
- 24. 针对不同语言的不同应用徽标
- 25. 不同语言
- 26. 如何使我的.NET应用程序支持不同的语言
- 27. 避免使用多种不同的语言编写相同的算法
- 28. 你如何处理不同的语言Web应用程序和Selenium IDE?
- 29. 他们如何为同一个库编写不同的语言包装?
- 30. 不同的语言
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