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


70

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

我的意思是没有像

myProgram.callCfunction(parameters);

永远不会发生,还是我错了?

Answers:


32

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

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

如果语言/编译器使用其他类型的系统,则会变得更加困难。可以有很多不同的方式,基本数据类型(例如整数,浮点和双精度)在内部表示,并且还有更多方式表示字符串。在不同语言之间传递类型时,必须确保双方将类型解释为相同,或者-如果不是,则将类型正确映射。这种类型映射也称为编组

不同程序语言之间互操作性的经典示例如下(大部分来自Windows世界):

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

1
请问是什么Native COM components
Dan

在大型项目中从c#代码调用python脚本是一种好习惯吗?
阿姆利特(Amrit)

@amrit:这完全取决于。当然,项目中的混合技术总会带来一定的成本,但是(重新)实现现有功能的成本可能会轻易抵消这一成本。因此,将现有的Python库集成到C#代码库中可能是完全合理的。
德克·沃尔玛

16

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

(当然,这是关于HTML和CSS是否可以算作编程语言的争论,这是我的手笔。我是“他们是,但不是图灵完备的语言”阵营,但这是另一个主题。 )

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

如果要采用最佳实践路线,则网页的结构应使用HTML,而如何显示网页的说明应使用CSS(可以在同一文件中,但不一定要在同一文件中)。CSS包含一堆类,HTML引用了这些类,由浏览器决定如何一起单击它们。

更进一步,该页面上的所有JavaScript脚本都可以更改存在的任何HTML / CSS(更改HTML实体的内容,将一个CSS类换成另一个CSS类,更改CSS的行为,等等。 )通过称为“文档对象模型”的东西来完成,该对象本质上是一种语言和平台无关的API,以类似对象的方式操作HTML页面(这时我会慢慢退后,仅提供指向相关对象的链接维基文章。)

但是,所有的HTML / CSS / Javascript都来自哪里呢?这就是服务器端语言的功能。在最简单的形式中,serer端语言是一个程序,该程序返回包含HTML页面的巨型字符串作为其输出。显然,这可能变得更加复杂:HTML表单和查询字符串参数可以用作我们服务器端程序的输入,然后您就拥有了整个AJAX,JavaScript也可以直接将数据发送到服务器语言。您还可以从服务器语言可以自定义的HTML,CSS和Javascript中获得灵感-本质上,您有使用一种语言编写的程序,并用另一种语言编写了程序。

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

因此,要总结一下,在这种情况下,不同的语言要么通过实际相互编写程序进行通信,要么通过以每个人都可以理解的非常简单且易于解析的格式来传递数据。(主要是字符串)。


除非您在宝石(GLASS)Smalltalk上使用Seaside。它通过使用服务器端语言来完成所有工作,从而提高了生产率。
2009年

10

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

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

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

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

举个例子:

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

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

我可以从Python(IronPython)调用它

 Hello()

并获得预期的输出。

一般而言,某些语言互操作性要好于其他语言,尤其是在语言作者专门使互操作成为语言功能的情况下。


7

多种语言可以与以下语言进行交互:

  1. 管道输入/输出(任何语言都可以这样做,因为必须以每种非玩具语言实现输入和输出)
  2. 将一种语言的代码编译为本机库,而另一种则支持调用本机代码。
  3. 通过环回网络连接进行通信。这样您会遇到防火墙干扰的麻烦。
  4. 数据库。可以将它们视为“通用”数据存储格式,因此大多数具有数据库扩展名的语言都可以访问它们。通常,这需要一个程序来完成操作,然后下一个程序才能访问数据库。此外,通常将所有“通信”都写入磁盘。
  5. 如果所涉及的语言在相同的运行时(即.NET,JVM)上运行,则通常可以将对象数据从一种语言直接传递到另一种语言,而不会产生任何阻碍。

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


3

我正在一个大型企业项目中工作,该项目由(最新统计)约8种语言组成。大部分通信是通过企业级消息总线进行的,该总线包含用于多种语言的绑定,以接入和来回传递数据。叫做tibco


2

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


好的。这是一种语言可以交互的方式。但是:Python程序何时知道要解析的内容……而主应用程序何时知道解析器刚刚完成?
n00ki3,2009年

好的,这是一个例子。我工作的一家公司在网络上发布了一个解析器应用程序,该应用程序侦听传入的请求以解析数据。解析器只是侦听来自另一个应用程序的请求,然后解析并推回数据。解析器是用C编写的,而应用是用C#编写的。
卡特

2

在一个项目中可以使用多种不同的语言来使用多种不同的方法。我想到了两种主要的类别

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

2

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

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

2

不好 如果没有紧急需要,请使用一种语言。您正在增加依赖性和复杂性。但是,当您已有提供有趣功能的代码时,将其粘合在一起比重新创建要容易得多。


1

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


1

语言代码可以通过两种方式直接交互。只要在代码之间传递的数据是正确的格式(在位和字节级别),那么就没有理由不使用其他语言进行互操作。此方法用于传统的Windows DLL开发中。即使在不同的平台上,如果您可以正确设置格式(如果感兴趣,请查看大/小尾数),只要您的链接器(而非编译器)知道如何将代码连接在一起,它就可以工作。

除此之外,语言之间还有许多其他的交流方式。在.Net世界中,代码被编译为IL代码,每种语言都相同,因此C#,VB.Net完全相同,并且可以无缝地相互调用/工作。


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.