一个项目中多种语言如何相互交互?

101

我听说有些人在同一个项目中使用多种编程语言。我无法想象这些语言是如何相互交互的。

我的意思是,Java没有像

myProgram.callCfunction(parameters);

从来没有发生过,或者我错了吗?

13个回答

45

在一个项目中使用多种语言实际上是很常见的,但这背后的原则并不总是简单的。

在简单情况下,不同的语言被编译成相同的代码。例如,C和C++代码通常被编译成机器汇编语言或C#和VB.Net被编译成IL(.NET运行时能够理解的语言)。

如果语言/编译器使用不同的类型系统,则会更加困难。基本数据类型(如整数、浮点数和双精度)可以有许多不同的表示方式,并且表示字符串的方式也有很多种。在不同语言之间传递类型时,必须确保双方将类型解释为相同的内容,否则就要正确地将类型映射到对应位置。这种类型映射也被称为marshalling

不同程序语言之间互操作的经典例子有(主要来自Windows世界):

  • .NET平台可用的各种语言,包括C#、VB.Net、J#、IronRuby、F#、XSLT等许多不太流行的语言。
  • 用C++或VB编写的本机COM组件可以与许多语言一起使用:VBScript、VB、所有.NET语言、Java
  • 可以从.NET或VB调用Win32 api函数
  • IPC(进程间通信)
  • Corba,可能是最综合(也是最复杂)的方法
  • Web服务和其他面向服务的体系结构,可能是最现代化的方法

2
我可以问一下什么是“本机COM组件”吗? - Dan
在大型项目中,从C#代码调用Python脚本是一个好的实践吗? - Amrit
@amrit:这完全取决于情况。当然,在一个项目中混合使用技术总是会带来一定的成本,但这个成本很容易被(重新)实现现有功能的成本所抵消。因此,将现有的Python库集成到C#代码库中可能是非常合理的。 - Dirk Vollmar
链接应该是 https://en.wikipedia.org/wiki/Common_Object_Request_Broker_Architecture,而不是 http://en.wikipedia.org/wiki/Corba(尽管第二个链接中的 Corba 看起来很美味)。 - Jasha
@Jasha:哈哈...谢谢你发现了这个问题! - Dirk Vollmar

23

一般来说,任何规模较大的Web项目都会使用五种语言:HTML、CSS、Javascript、某种服务器端“完成任务”的语言(如ASP、JSP、带有Perl的CGI脚本、PHP等),以及某种SQL变体用于数据库连接。

当然,这里并没有讨论HTML和CSS是否算作编程语言的争议——我认为它们是编程语言,但不是图灵完备的语言。这是另一个话题了。

以下是它们如何协同工作的一些示例:

如果你想要遵循最佳实践,网页的结构应该由HTML定义,而如何显示它则由CSS定义——这两者可以在同一个文件中,但也可以分开。CSS包含了一堆类,HTML引用这些类,浏览器负责将它们组合起来。

更进一步,页面上的任何javascript脚本都可以修改任何已经存在的HTML/CSS(更改HTML实体的内容,将一个CSS类替换为另一个,更改CSS的行为等)。它通过一种称为文档对象模型(Document Object Model)的东西来实现,这实际上是一种独立于语言和平台的API,以对象方式操纵HTML页面(此时我会慢慢地后退,并提供一个链接到相关维基百科文章的链接)。

那么,所有的HTML/CSS/Javascript都是从哪里来的呢?这就是服务器端语言所做的事情。在最简单的形式中,服务器端语言是一个返回一个包含HTML页面的巨大字符串的程序。显然,这可以变得更加复杂:HTML表单和查询字符串参数可以用作服务器端程序的输入,然后你还有整个AJAX的事情,其中javascript可以直接将数据发送到服务器端语言。你还可以变得更加高级,使服务器端语言可以自定义输出的HTML、CSS和Javascript——实际上,你有一个语言编写另一个语言的程序。

服务器端语言与SQL的连接方式基本相同。有很多方法可以使它更加复杂和安全,但最简单的方法是让你的服务器端语言动态构建一个包含SQL命令的字符串,通过某种类型的连接器将其传递给数据库,并获取返回的结果集。这是一个真正意义上的函数,可简化为 someValue = database.executeThisSQLCommand(SQLString)。

因此,不同的语言在这种情况下要么通过互相编写程序交流,要么通过以非常简单易于解析的格式(主要是字符串)来传递数据。


除非你在Gemstone(GLASS)Smalltalk上使用Seaside,否则它通过在服务器端语言中完成所有操作来实现更高效的生产力水平。 - Stephan Eggermont

16

使用多种语言的技术称为“互操作性”或缩写为“interop”。

你的例子是错误的。Java 可以调用 C 函数。

这种语言提供了一种互操作的机制。

在 .NET 的情况下,语言被编译成 CLI 的一部分 IL。因此,任何 .NET 语言都可以与任何其他 .NET 语言定义的模块进行互操作(调用方法)。

举个例子:

我可以在 C# 中定义一个方法

static void Hello(){ Console.WriteLine("Hello World");}

而且我可以从Python(IronPython)中调用它。

 Hello()

并获得预期输出。

一般来说,有些编程语言之间的互操作性比其他编程语言更好,尤其是如果语言作者专门将互操作性作为语言的一个特性。


16

多种编程语言可以进行交互:

  1. 通过管道输入/输出(任何一种语言都可以做到这一点,因为输入和输出必须在每种成熟的语言中被实现)
  2. 使用一种语言编写代码并编译成本地库,而另一种语言支持调用本地代码。
  3. 通过回环网络连接进行通信。但是,这种方式可能会因防火墙干扰而遇到困难。
  4. 数据库。它们可以被认为是“通用”的数据存储格式,因此大多数带有数据库扩展的语言都可以访问。通常需要一个程序完成操作后,下一个程序才能访问数据库。此外,所有“通信”通常都被写入磁盘。
  5. 如果涉及的语言在相同的运行时(即.NET、JVM)上运行,则通常可以直接将对象数据从一种语言传递到另一种语言。

几乎在每种情况下,您必须将任何通信转换为通用格式,然后才能交换(例外情况是在相同运行时的语言之间)。这就是为什么在一个项目中很少使用多种编程语言的原因。


5

我在一项大型企业项目上工作,该项目包含(最后统计)约8种语言。大部分通信是通过企业级消息总线进行的,其中包含多种语言的绑定,以便进行数据传输。它被称为 tibco


4

在一个项目中,您可以使用不同的语言进行开发。这里有两个主要的分类:

  1. 将不同的语言一起使用来构建一个应用程序。例如,使用Java构建GUI并使用JNI访问C API(所以回答您的问题,您可以从Java调用C函数;)

  2. 如果它们不是同一个应用程序的一部分,则在一个项目中一起使用不同的语言。例如,我目前正在开发一个iPhone应用程序,其中使用了大量的文本。我目前正在使用三种语言:Python(处理文本的原始来源),SQL(将Python应用程序的结果放入易于从iPhone sqlite3 API访问的格式中)和Objective C来构建实际的应用程序。即使最终产品只是Objective C,我也使用了其他两种语言来获得最终产品。


3

您可能会拥有一个应用程序,其中大部分工作都是由Java完成的,但可能还有一些部分,例如数据解析器或其他部分是用Python编写的。实际上就像是两个不同的应用程序,也许解析器只是在文件上做一些工作,然后您的Java主应用程序将它们用于某些操作。如果有人问我在这个项目中使用了什么,我会说“Java和Python”。


好的,明白了。这是语言交互的一种方式。 但是:Python程序何时知道有东西需要解析...以及主应用程序何时知道解析器刚刚完成? - n00ki3
好的,这里有一个例子。我曾经为一家公司工作,他们在网络上发布了一个解析器应用程序,用于监听传入的数据解析请求。该解析器只是监听来自另一个应用程序的请求,然后解析并将数据推送出去。解析器是用C语言编写的,应用程序是用C#编写的。 - Carter

3

在一个项目中使用多种语言的方法有很多种。以下是一些例子:

  • 你可以用C语言编写一个DLL,然后从VB程序中使用该库。
  • 你可以用C++编写一个服务器程序,并拥有许多不同语言实现的客户端。
  • Web项目通常使用多种语言;例如,一个服务器程序,用Java(一种编程语言)编写,使用SQL(一种查询语言)从数据库中获取数据,将结果以HTML(一种标记语言)发送到浏览器,用户可以使用Javascript(一种脚本语言)与之交互……

3

如果没有紧急需求,最好只使用一种语言。这样可以减少依赖和复杂性。但是当你已经有了提供有趣功能的现有代码时,将它们粘合在一起可能比重新创建更容易。


2

这取决于项目的类型。如果你想要尝试,可以设置一个 .NET 的 Web 项目,并在页面基础上逐页更改语言。它的运行方式不像你的伪代码那样,但可以实现多种语言。当然,实际的代码目录必须是单一语言。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接