我听说有些人在同一个项目中使用多种编程语言。我无法想象这些语言是如何相互交互的。
我的意思是,Java没有像
myProgram.callCfunction(parameters);
从来没有发生过,或者我错了吗?
我听说有些人在同一个项目中使用多种编程语言。我无法想象这些语言是如何相互交互的。
我的意思是,Java没有像
myProgram.callCfunction(parameters);
从来没有发生过,或者我错了吗?
在一个项目中使用多种语言实际上是很常见的,但这背后的原则并不总是简单的。
在简单情况下,不同的语言被编译成相同的代码。例如,C和C++代码通常被编译成机器汇编语言或C#和VB.Net被编译成IL(.NET运行时能够理解的语言)。
如果语言/编译器使用不同的类型系统,则会更加困难。基本数据类型(如整数、浮点数和双精度)可以有许多不同的表示方式,并且表示字符串的方式也有很多种。在不同语言之间传递类型时,必须确保双方将类型解释为相同的内容,否则就要正确地将类型映射到对应位置。这种类型映射也被称为marshalling。
不同程序语言之间互操作的经典例子有(主要来自Windows世界):
一般来说,任何规模较大的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)。
因此,不同的语言在这种情况下要么通过互相编写程序交流,要么通过以非常简单易于解析的格式(主要是字符串)来传递数据。
使用多种语言的技术称为“互操作性”或缩写为“interop”。
你的例子是错误的。Java 可以调用 C 函数。
这种语言提供了一种互操作的机制。
在 .NET 的情况下,语言被编译成 CLI 的一部分 IL。因此,任何 .NET 语言都可以与任何其他 .NET 语言定义的模块进行互操作(调用方法)。
举个例子:
我可以在 C# 中定义一个方法
static void Hello(){ Console.WriteLine("Hello World");}
而且我可以从Python(IronPython)中调用它。
Hello()
并获得预期输出。
一般来说,有些编程语言之间的互操作性比其他编程语言更好,尤其是如果语言作者专门将互操作性作为语言的一个特性。
多种编程语言可以进行交互:
几乎在每种情况下,您必须将任何通信转换为通用格式,然后才能交换(例外情况是在相同运行时的语言之间)。这就是为什么在一个项目中很少使用多种编程语言的原因。
在一个项目中,您可以使用不同的语言进行开发。这里有两个主要的分类:
将不同的语言一起使用来构建一个应用程序。例如,使用Java构建GUI并使用JNI访问C API(所以回答您的问题,您可以从Java调用C函数;)
如果它们不是同一个应用程序的一部分,则在一个项目中一起使用不同的语言。例如,我目前正在开发一个iPhone应用程序,其中使用了大量的文本。我目前正在使用三种语言:Python(处理文本的原始来源),SQL(将Python应用程序的结果放入易于从iPhone sqlite3 API访问的格式中)和Objective C来构建实际的应用程序。即使最终产品只是Objective C,我也使用了其他两种语言来获得最终产品。
您可能会拥有一个应用程序,其中大部分工作都是由Java完成的,但可能还有一些部分,例如数据解析器或其他部分是用Python编写的。实际上就像是两个不同的应用程序,也许解析器只是在文件上做一些工作,然后您的Java主应用程序将它们用于某些操作。如果有人问我在这个项目中使用了什么,我会说“Java和Python”。
在一个项目中使用多种语言的方法有很多种。以下是一些例子:
如果没有紧急需求,最好只使用一种语言。这样可以减少依赖和复杂性。但是当你已经有了提供有趣功能的现有代码时,将它们粘合在一起可能比重新创建更容易。
这取决于项目的类型。如果你想要尝试,可以设置一个 .NET 的 Web 项目,并在页面基础上逐页更改语言。它的运行方式不像你的伪代码那样,但可以实现多种语言。当然,实际的代码目录必须是单一语言。