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

时间:2009-03-11 23:57:30

标签: interop multiple-languages language-interoperability

我在一个项目中听到一些人用多种语言编程。我无法想象语言如何相互作用。

我的意思是没有类似

的Java方法
myProgram.callCfunction(parameters);

永远不会发生或我错了吗?

12 个答案:

答案 0 :(得分:26)

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

在简单的情况下,不同的语言被编译为相同的代码。例如,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服务和其他面向服务的体系结构,可能是最现代的方法

答案 1 :(得分:14)

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

(当然,这是关于HTML和CSS是否算作编程语言的争论 - 我是“他们是,但只是不是图灵完整的语言”阵营,但这是一个整体其他线程。)

所有这些如何协同工作的一些例子:

如果您要使用最佳实践路线,则网页的结构采用HTML格式,并且有关如何显示网页的说明在CSS中 - 可能位于同一文件中,但不必是。 CSS包含一堆HTML所引用的类,由浏览器决定如何一起点击它们。

更进一步,该页面上的任何javascript脚本都可以改变任何存在的HTML / CSS(更改HTML实体的内容,将一个CSS类替换为另一个,更改CSS的行为,以及通过称为文档对象模型的东西来实现这一点,文档对象模型本质上是一种语言和平台无关的API,以类似对象的方式操作HTML页面(此时我会慢慢退回并提供一个链接到relevant wiki article。)

但是,那么所有的HTML / CSS / Javascript都来自哪里?这就是服务器端语言的作用。在最简单的形式中,serer端语言是一个程序,它返回一个包含HTML页面作为输出的巨型字符串。显然,这可以变得更加复杂:HTML表单和查询字符串参数可以用作我们服务器端程序的输入,然后你就可以获得整个AJAX,javascript也可以将数据直接发送到服务器语言。您还可以看到服务器语言可以自定义吐出的HTML,CSS和Javascript的位置 - 实际上,您可以使用一种语言编写另一种语言的程序。

SQL连接的服务器端语言大致相同。有很多方法可以使它更复杂和更安全,但最简单的方法是让您的服务器语言动态构建一个带有SQL命令的字符串,通过某种连接器将其传递给数据库,然后返回结果集。 (这种情况下你确实有一个归结为someValue = database.executeThisSQLCommand(SQLString)的函数。)

因此,为了将其包装起来,在这种情况下,不同的语言通过实际相互编写程序进行通信,或者通过以非常简单易于解析的格式处理数据,这是每个人都能理解的。 (主要是弦乐。)

答案 2 :(得分:8)

使用的多种语言简称为“互操作性”或“互操作性”。

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

该语言提供了互操作性的机制。

对于.NET,语言作为CLI的一部分编译到IL中。因此,任何.NET语言都可以互换(调用由其他任何.NET语言定义的模块)。

举个例子:

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

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

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

 Hello()

获得预期的输出。

一般来说,某些语言的互操作性比其他语言更好,特别是如果语言作者专门制作互操作语言的特征。

答案 3 :(得分:5)

多种语言可与以下内容互动:

  1. 管道输入/输出(任何语言都可以这样做 因为必须在每个非玩具中实施输入和输出 语言)
  2. 将一种语言的代码编译为本机库 而另一个则支持调用本机代码。
  3. 通过环回网络连接进行通信。您可以 这种方式遇到了防火墙干扰的困难。
  4. 数据库。这些可以被认为是“通用”数据 存储格式,因此可以被大多数语言访问 与数据库扩展。这一般 需要一个程序在下一个程序之前完成操作 可以访问数据库。此外,所有'通信'都是 通常写入磁盘。
  5. 如果涉及的语言在同一运行时运行(即.NET, JVM),那么你通常可以从一种语言传递对象数据 直接对方,几乎没有阻碍。
  6. 几乎在所有情况下,您都必须将任何通信转换为通用 格式可以交换之前(例外是语言) 相同的运行时)。这就是为什么很少使用多种语言的原因 项目

答案 4 :(得分:2)

我在一个大型企业项目上工作,该项目由(最后一次)大约8种语言组成。大多数通信是通过企业级消息总线实现的,该消息总线包含多种语言的绑定,可以来回接入和传递数据。它被称为tibco

答案 5 :(得分:1)

你可以拥有一个应用程序,其中大部分工作都是用Java完成的,但可能有一些部分,比如数据解析器或用Python编写的东西或者你有什么东西。实际上几乎是两个独立的应用程序,也许解析器只是在文件上做一些工作,然后你在Java中的主应用程序正在使用它们。如果有人问我在这个项目中使用了什么,我会说“Java和Python。”

答案 6 :(得分:1)

在一个项目中,有许多不同的方法可以使用不同的语言 想到两个主要类别

  1. 一起使用不同的语言来构建一个应用程序。例如,使用Java构建GUI并使用JNI访问C API(因此回答您的问题,您可以从Java调用C函数;))
  2. 在一个项目中一起使用不同的语言,但它们不属于同一个应用程序。例如。我目前正在开发一个使用大量文本的iPhone应用程序。我目前正在使用三种语言Python(用于处理文本的原始资源),SQL(将python应用程序的结果以易于从iphone sqlite3 api访问的格式)和Objectiv C来构建实际应用程序。即使最终产品只是目标C,我还使用了其他两种语言来获得最终产品

答案 7 :(得分:1)

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

  • 您可以在C语言中编写DLL,然后从VB程序中使用该库。
  • 您可以编写一个服务器程序,比如说C ++,并且有很多不同的客户端语言实现。
  • 网络项目经常使用大量语言;例如,用Java(一种编程语言)编写的服务器程序,使用SQL(查询语言)从数据库中提取数据,以HTML(标记语言)将结果发送到浏览器,用户可以使用Javascript(脚本语言)进行交互......

答案 8 :(得分:0)

这取决于项目的类型。如果要进行实验,可以在.NET中设置Web项目,并逐页更改语言。它在您的伪代码中显示不起作用,但它是多种语言。当然,实际的代码目录必须是单一语言。

答案 9 :(得分:0)

语言中的代码可以通过多种方式直接进行交互。只要代码之间传递的数据格式正确,位和字节级别,就没有理由不同的语言不能互操作。这种方法用于传统的Windows DLL开发。即使在不同的平台上,如果你可以得到正确的格式(如果感兴趣的话可以查看大/小端),只要你的链接器(不是编译器)知道如何将代码连接在一起,它就会起作用。

除此之外,还有许多其他语言可以互相交流的方式。在.Net世界中,代码被编译成IL代码,对于每种语言都是相同的,这样C#,VB.Net在引擎盖下都是相同的,可以无缝地相互调用/协作。

答案 10 :(得分:0)

严重。如果没有迫切需要,坚持使用单一语言。您正在增加依赖性和复杂性。但是当你有现有的代码提供有趣的功能时,将它粘合在一起比重新创建它更容易。

答案 11 :(得分:0)

只是添加到示例列表中,在C或C ++中优化Python代码或编写C库以将另一个库绑定到Python是相当常见的。