87

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

我的意思是没有像这样的Java方法

myProgram.callCfunction(parameters);

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

4

12 回答 12

42

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

在简单的情况下,不同的语言被编译成相同的代码。例如,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 服务和其他面向服务的架构,可能是最现代的方法
于 2009-03-12T00:07:44.567 回答
21

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

(当然,这是对 HTML 和 CSS 是否算作编程语言的争论——我是“它们是,但不是图灵完备的语言”阵营,但那是另一个话题。 )

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

如果你走的是最佳实践路线,网页的结构是 HTML,如何显示它的说明是 CSS——可以在同一个文件中,但不一定要在同一个文件中。CSS 包含一堆类,HTML 引用这些类,由浏览器决定如何将它们一起单击。

更进一步,该页面上的任何 javascript 脚本都可以更改存在的任何 HTML/CSS(更改 HTML 实体的内容,将一个 CSS 类替换为另一个,更改 CSS 的行为,等等。 )它通过称为文档对象模型的东西来实现这一点,它本质上是一种语言和平台独立的 API,用于以类似对象的方式操作 HTML 页面(此时我将慢慢后退,只提供相关的链接维基文章。)

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

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

所以总结一下,在这种情况下,不同的语言要么通过彼此实际编写程序来进行通信,要么通过以每个人都能理解的非常简单、易于解析的格式传递数据。(主要是弦乐。)

于 2009-03-12T01:50:41.027 回答
16

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

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

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

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

举个例子:

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

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

我可以从 Python (IronPython) 调用它

 Hello()

并得到预期的输出。

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

于 2009-03-12T00:03:57.273 回答
11

多种语言可以交互:

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

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

于 2009-03-12T04:51:21.750 回答
5

我从事一个大型企业项目,该项目由(最后一次统计)大约 8 种语言组成。大部分通信是通过企业级消息总线进行的,该总线包含多种语言的绑定,以接入和来回传递数据。它被称为tibco

于 2009-03-12T01:51:32.990 回答
4

在一个项目中使用不同的语言有很多不同的方法。我想到了两个主要类别:

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

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

于 2009-03-12T00:08:46.873 回答
3

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

于 2009-03-12T00:06:32.917 回答
3

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

  • 您可以用 C 语言编写一个 DLL,然后从 VB 程序中使用该库。
  • 你可以用 C++ 编写一个服务器程序,并且有很多不同的客户端语言实现。
  • 一个 Web 项目经常使用多种语言;例如,一个用 Java(一种编程语言)编写的服务器程序,它使用 SQL(一种查询语言)从数据库中获取数据,然后以 HTML(一种标记语言)将结果发送到浏览器,用户可以使用 Javascript(一种脚本语言)进行交互...
于 2009-03-12T00:13:16.800 回答
3

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

于 2009-03-12T00:14:28.623 回答
2

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

于 2009-03-12T00:02:18.137 回答
2

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

除此之外,还有许多其他语言可以相互交谈的方式。在 .Net 世界中,代码被编译为 IL 代码,这对于每种语言都是相同的,这样 C#、VB.Net 在底层都是相同的,并且可以无缝地相互调用/工作。

于 2009-03-12T00:09:09.273 回答
2

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

于 2009-03-12T01:07:47.217 回答