桌面软件的不同组件可以用不同的语言编程吗?例如,一个名为MultiProg的软件包括组件Comp1,Comp2,Comp3等。 除1,2,3之外的所有组件都在java中,1在C中,2在Python中,3在Scala中等。是否可以这样做?何时需要这样做?
这在软件行业中常见吗?当用不同语言编写组件时,我们如何使组件进行通信?
答案 0 :(得分:2)
肯定可以完成。通常你会使用某种粘合层(例如管道,套接字,文件监视,共享内存,protocol buffers)来允许不同的进程相互通信/调用。
答案 1 :(得分:2)
这当然不常见。
python标准库的许多部分都是用C语言编写的,许多流行的第三方库(如numpy)都有部分用C语言编写,你可以使用ctypes创建自己的C库绑定。 Python的默认GUI库Tkinter的一部分是用Tcl / Tk编写的。
Java具有Java本机接口(JNI),可用于集成针对物理机而不是Java虚拟机编写的模块。 Scala可以使用为JVM编写的库(包括那些用Java编写的库),它也可以使用JNI。
大多数大型软件都是用多种语言编写的。通常使用两种语言,一种是用于性能关键部分的快速编译语言(通常是C或C ++),另一种是编写复杂但不是性能关键部分的脚本语言(例如Python,Lisp,Lua)。 / p>
任何语言都有两个要求可以互动的要求。一个是他们必须能够以相互理解的格式共享内存中的数据,第二个是他们必须能够使用共同的#34;调用约定来调用彼此的函数。本机接口库解决了这些问题。
答案 2 :(得分:2)
有两种方法可以做到。
第一种方法是将不同的部分(使用不同的语言)编译成目标文件并链接它们。这仅适用于某些语言而不适用于其他语言,并且取决于适用工具的可用性。例如,如果一种语言进行垃圾收集,则不能指望其他语言突然支持它。
另一种方法是将应用程序构建为通信/协作的单独进程。这避免了链接问题,但意味着您有单独的进程(可能“不太干净”)和序列化/反序列化等。
注意:还有第三种方法,即在应用程序中构建解释器或其他东西来运行脚本。我不确定这是否重要(这取决于您是否将脚本视为应用程序代码的一部分或应用程序在运行时使用的部分数据)。
通常情况下,没有充分理由没有人混合语言,因为这对程序员来说是一个痛苦的问题。大多数程序员都知道很多语言,但只是少数语言中的专家,而且使用的语言越多,一个或多个程序员就无法理解应用程序源代码的一个或多个部分。
答案 3 :(得分:1)
不确定。不同的组件做不同的工作。他们使用IPC(进程间通信)来交换数据。它在Linux上很常见。关于IPC的更多细节可以在这里找到(http://en.wikipedia.org/wiki/Inter-process_communication)。
答案 4 :(得分:0)