桌面软件的不同组件可以用不同的语言编程吗?例如,一个名为MultiProg的软件由Comp1,Comp2,Comp3等组件组成。除了1,2,3之外的所有组件都是用java编写的,1是用C编写的,2是用Python编写的,3是用Scala编写的。什么时候需要这样做呢?
这在软件行业中很常见吗?当组件用不同的语言编写时,我们如何使它们相互通信?
发布于 2013-03-31 11:38:58
这当然不是不寻常的事情。
python标准库的许多部分都是用C编写的,许多流行的第三方库(如numpy )都有一部分是用C编写的,您可以使用ctype创建到自己的C库的绑定。Python的默认GUI库Tkinter的一部分是用Tcl/Tk编写的。
Java具有Java本机接口( java Native Interface,JNI),该接口可用于集成针对物理机而不是java虚拟机编写的模块。Scala可以使用为JVM编写的库(显然包括用Java编写的库),也可以使用JNI。
大多数大型软件都是用多种语言编写的。通常使用两种语言,一种是用于性能关键部分的快速编译语言(通常是C或C++),另一种是脚本语言(例如Python、Lisp、Lua),用于编写复杂但不是性能关键的部分。
任何语言要能够交互,都有两个要求。一个是它们必须能够以相互理解的格式共享内存中的数据,第二个是它们必须能够使用共同的“调用约定”调用彼此的函数。本机接口库解决了这些问题。
发布于 2013-03-31 11:22:33
这当然是可以做到的。通常,您会使用某种粘合层(例如管道、套接字、文件监视、共享内存、protocol buffers)来允许不同的进程相互通信/调用。
发布于 2013-03-31 11:47:28
有两种方法可以做到这一点。
第一种方法是将不同的片段(使用不同的语言)编译成目标文件,并将它们链接起来。这只适用于某些语言,而不适用于其他语言,并且取决于是否有合适的工具可用。例如,如果一种语言做了垃圾收集,你就不能期望其他语言突然支持它。
另一种方法是将应用程序构建为通信/协作的单独进程。这避免了链接问题,但意味着您有单独的进程(可能“不那么干净”)和序列化/反序列化等。
注意:还有第三种方法,那就是在应用程序中构建一个解释器或其他东西来运行脚本。我不确定这是否算数(这取决于您是否认为脚本是应用程序代码的一部分,还是应用程序在运行时使用的数据的一部分)。
通常情况下,没有人会在没有充分理由的情况下混合使用语言,因为这对程序员来说是一个令人头疼的问题。大多数程序员知道很多种语言,但只精通几种语言,而且您使用的语言越多,一个或多个程序员就越有可能无法理解应用程序的一个或多个源代码。
https://stackoverflow.com/questions/15725990
复制相似问题