如何使两种不同的程序与两种不同的语言交互?


26

我不知道这是否太广泛了,但是我还是一个年轻的程序员,还在上大学,那是我的大三。我觉得我对各种语言都有很好的掌握,并且有很好的基础。但是我绊脚想想如果例如,如果我尝试创建一个程序并说我用python编写了一个部件,只是因为它很容易并且可以完成工作,但是该程序需要从我编写的另一个程序中获取输出在C中,由于速度原因,我使用C。我不确定如何使两种不同的程序和语言相互交互以创建一个整体的程序。我在想肯定要写一个文件,但是如果python和C程序都访问一个文件,那我该怎么想锁了。

多数情况下,我是通过将文件导入程序来完成此操作的,但在那种情况下,它们是相同的语言,因此我只需要使用导入功能即可,但是在两种语言/程序交互以创建一个内聚输出时,我遇到了麻烦。

我当时在考虑这个问题,因为我想潜入创建一些基本的Web应用程序只是为了学习,但我不知道如何说javascript文件与我用python编写的内容交互,反之亦然。

我觉得我在这里缺少一些真正容易的事情,只是不了解。抱歉,如果这个问题太笼统,但是我在网上找不到一个明确的答案,我正试图浏览一个开放源Web应用程序,但无法真正抓住它的答案,如果这个问题看起来很愚蠢,请再次宽恕我这是一个问我喜欢在stackexchange上阅读的好地方。

感谢您的答复。


我知道有Swig,它似乎可以完成您想要的事情,但是我还没有使用过。因此,您可以尝试一下:)。
user712092 2011年

1
请注意,您的问题包含两个完全不相关的主题,一个是在同一主机上的两个进程/应用程序之间的常规通信,另一个是通常的Web服务器/客户端体系结构,在客户端上使用JS,在服务器上使用python。
若奥·平托

您是否回顾了LAMP概念?您可以通过数据库进行很多通信。
SDsolar

Answers:


28

用不同语言编写的代码可以通过多种方式进行交互。

在源代码级别,可以对某些语言组合进行从一种语言到另一种语言的交叉编译(例如,Google的GWT包括Java到javascript编译器; Glasgow Haskell编译器可以编译为C; C ++的早期版本)编译为C)。在大多数情况下,这实际上并不可行。

共享虚拟平台的语言(例如JVM或.NET运行时)通常可以通过平台公开的机制进行交互-例如,所有JVM语言都可以访问Java库并使用它们彼此进行通信,并且可以调用方法并使用以任何其他JVM语言创建的类。

许多编程语言(包括Python)提供了一种与本机库(通常用C语言编写)交互的机制。使用这种机制,可以从另一种更高级的语言中调用本机函数。流行的库通常具有随时可用的绑定。该技术通常被称为“外部功能接口”。Python-into-C接口是CFFI

另一种选择是构建两个完全独立的程序,并使它们在运行时进行交互。有多种机制可以实现这一目标。最简单的方法是通过管道(查看subprocesspython模块):基本上,一个程序调用另一个程序,将输入发送到其stdin并从其stdout读取结果。这使一个程序成为另一个程序的子过程。如果您既需要长期使用又需要独立启动,则可以通过命名管道,(本地)网络套接字,共享文件和(取决于平台)其他方式来回传递数据。哪一个最好取决于。


好答案。另一种可能性是将解释器嵌入到主程序中,通常是在说C ++和Lua之间进行游戏开发。或者,请参阅Greenspun的第十条规则:en.wikipedia.org/wiki/Greenspun%27s_tenth_rule
Andrew

11

两个程序相互通信有几种不同的公认方法。您已经通过共享文件确定了一个明显的问题,并且发现了一个明显的困难。但是还有其他方法。

大多数现代操作系统都包含一种称为管道的机制,该机制基本上是一种数据流,其输入端在一个程序中,而输出端在另一个程序中。如果需要将数据从一个程序发送到同一台计算机上运行的另一个程序,则可以使用该方法。

如果您需要为一个程序设置API以使用它来调用另一个程序,则可能需要研究RPC(远程过程调用),这通常在OS级别也受支持。

如果要在两台不同计算机上的两个程序之间进行通信,事情会变得更加复杂。然后,您需要使用网络和协议。您需要一个程序才能打开套接字并侦听传入的消息,将其解码为内部方法调用,对其进行处理并返回响应。有很多库可用于以各种不同的语言(包括C和Python)提供此功能。

基本上,您应该使用哪种方法取决于您要执行的操作的细节。对各种形式的进程间通信和网络消息传递进行一些研究,您应该能够找出最适合您的需求的东西。


2

消息传递似乎是这里的通用概念,因为有许多示例可以交互使用不同的语言,例如,可以将经典的ASP与COM组件一起使用,而某些JavaScript可以混合使用同一应用程序中的3种不同语言。

在您声明的示例中,锁不是操作系统要在文件系统上处理的东西吗?每个程序都不了解其他程序,所以一定要记住。


0

大多数软件组件不应按照指令进行通信,而应发送和接收数据:与数据库进行交互,发送/接收JSON / XML请求等。


0

根据您的问题类型,管道的标准外壳使用可能就足够了(在外壳中键入):

程序1 | 程序2

这样,程序1的输出直接进入程序2的输入。当然,这并不适用于所有问题,但是使用这种方法可以很好地解决很多(非交互式)问题。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.