多种语言如何在一个项目中进行交互?
我是一个年轻人,所以我有很多要学习:)
一个困在我脑海的问题是:我听说有人在一个项目中使用多种语言编程。我无法想象这些语言是如何相互影响的。
我的意思是没有Java的方法
myProgram.callCfunction(parameters);
从来没有发生..或者我错了吗? 🙂
在一个项目中使用多种语言实际上是相当普遍的,但是后面的原理并不总是那么简单。
在简单的情况下,不同的语言被编译成相同的代码。 例如,C和C ++代码通常被编译为机器汇编程序或C#,VB.Net被编译为IL(.NET运行时所理解的语言)。
如果语言/编译器使用不同types的系统,则会变得更加困难。 可以有很多种不同的方式,像integer,float和double这样的基本数据types在内部被表示出来,甚至有更多的方式来表示string。 在不同语言之间传递types时,必须确保双方都将types解释为相同,否则types将正确映射。 这种types映射也被称为编组(marshalling) 。
不同程序语言之间互操作性的典型例子(主要来自Windows世界):
- .NET平台提供的各种语言。 这包括C#,VB.Net,J#,IronRuby,F#,XSLT和许多其他不太stream行的语言。
- 使用C ++或VB编写的本地COM组件可以使用各种语言:VBScript,VB,所有.NET语言,Java
- Win32 API函数可以从.NET或VB调用
- IPC(进程间通信)
- Corba ,可能是最全面的(也是最复杂的)方法
- Web服务和其他面向服务的体系结构,可能是最现代的方法
一般来说,任何大小合适的Web项目都将使用大约5种语言:HTML,CSS,Javascript,某种服务器端“完成任务”的语言(ASP,JSP,CGI脚本和Perl,PHP等)用于数据库连接的SQL。
(当然,这是挥之不去的关于HTML和CSS是否算作编程语言的争论 – 我是“他们是,但不是图灵完全语言”的阵营,但这是一个完整的另一个线索。 )
所有这些工作如何的一些例子:
如果你正在进行最佳实践路线,网页的结构是HTML,并且如何显示它的说明是在CSS中 – 可以在同一个文件中,但不一定是。 CSS包含了一大堆HTML所引用的类,由浏览器决定如何一起点击它们。
更进一步,该页面上的任何JavaScript脚本都可以更改任何HTML / CSS(改变HTML实体的内容,换一个CSS类replace另一个CSS类,改变CSS的行为等等)。 )它通过称为文档对象模型(Document Object Model)的东西来实现这一点,它本质上是一种语言和平台无关的API,以类似于对象的方式处理HTML页面(在这一点上,我将慢慢退出,并提供相关链接维基文章 。)
但是,所有的HTML / CSS / Javascript从哪里来? 这就是服务器端语言所做的。 最简单的forms,serer端语言是一个程序,返回一个巨大的string作为其输出的HTML页面。 这显然可以变得更复杂:HTML表单和查询string参数可以用作我们的服务器端程序的input,然后您可以获得整个AJAX的东西,javascript也可以将数据直接发送到服务器语言。 你也可以很喜欢服务器语言可以自定义HTML,CSS和JavaScript的东西 – 从本质上讲,你有一种语言的程序用另一种语言编写程序。
服务器端语言与SQL连接的工作方式大致相同。 有很多方法可以使它更加复杂和安全,但是最简单的方法是让你的服务器语言dynamicbuild立一个带有SQL命令的string,通过某种连接器把它交给数据库,然后取回一个结果集。 (这是你确实有一个函数,归结为someValue = database.executeThisSQLCommand(SQLString))。
因此,为了包装起来,在这种情况下,不同的语言要么通过实际上相互编写程序来进行通信,要么通过以非常简单易懂的,每个人都能理解的简单parsing格式来传递数据。 (主要是弦乐)
使用中的多种语言被称为“互操作性”或“互操作性”。
你的例子是错误的。 Java可以调用C函数。
该语言提供了互操作性的机制。
在.NET的情况下,语言被编译成IL作为CLI的一部分。 因此,任何.NET语言都可以互操作(调用由其他.NET语言定义的)模块。
举个例子:
我可以在C#中定义一个方法
static void Hello(){ Console.WriteLine("Hello World");}
我可以从Python(IronPython)
Hello()
并获得预期的产出。
一般来说,某些语言比其他语言更好,特别是如果语言作者特意制作了语言的特征。
多种语言可以交互:
- pipe道input/输出(ANY语言可以这样做,因为input和输出必须在每个非玩具语言中实现)
- 让一种语言的代码编译到本地库,而另一种语言则支持调用本地代码。
- 通过回送networking连接进行通信。 这种方式可能会遇到防火墙干扰的困难。
- 数据库。 这些可以被认为是“通用”的数据存储格式,因此可以通过数据库扩展的大多数语言访问。 这通常需要一个程序在下一个程序访问数据库之前完成操作。 另外,所有的“通信”通常写入磁盘。
- 如果所涉及的语言运行在相同的运行时(即.NET,JVM)上,那么通常可以将对象数据从一种语言直接传递到另一种,而几乎没有任何阻碍。
几乎在任何情况下,在交换之前,必须将任何通信转换为通用格式(例外情况是在相同的运行时)。 这就是为什么在一个项目中很less使用多种语言的原因。
你可以有一个应用程序,其中大部分的工作是用Java完成的,但也可能有一部分,比如可能是一个数据parsing器,或者是用Python编写的东西,或者你有什么东西。 几乎两个单独的应用程序真的,也许parsing器只是在文件上做一些工作,然后你在Java中的主要应用程序正在使用它们的东西。 如果有人问我在这个项目中使用了什么,我会说“Java和Python”。
在一个项目中可以使用多种语言。 一些例子:
- 你可以用C编写一个DLL,然后从VB程序中使用这个库。
- 你可以用C ++编写一个服务器程序,并且有很多不同的客户端语言实现。
- 一个网站项目经常使用很多语言; 例如用Java(一种编程语言)编写的服务器程序,它使用SQL(查询语言)从数据库中提取数据,将结果以HTML(标记语言)发送到浏览器,用户可以使用Javascript(一种脚本语言)进行交互…
这取决于项目的types。 如果你想实验,你可以在.NET中build立一个Web项目,并逐页改变语言。 它不工作,因为你显示在你的伪代码,但它是多种语言。 当然,实际的代码目录必须是单一的语言。
在一个项目中可以使用不同的语言有很多不同的方法。有两个主要类别可以想到
- 一起使用不同的语言构build一个应用程序。 例如使用Java构buildGUI并使用JNI访问C API(所以回答你的问题,你可以从Java调用C函数)
- 在一个项目中使用不同的语言,但不属于同一个应用程序。 例如。 我目前正在使用一个iphone应用程序,它使用了大量的文本。 我目前使用三种语言Python(用于处理文本的原始来源),SQL(将python应用程序的结果以易于从iPhone sqlite3 API访问的格式)和Objectiv C构build实际的应用程序。 即使最终产品只会是Objective C,我已经使用其他两种语言来获得最终产品
语言中的代码可以直接交互的方法有两种。 只要在代码之间传递的数据是正确的格式,在位和字节级别,那么没有理由说不同的语言不能互操作。 这种方法被用在传统的Windows DLL开发中。 即使在不同的平台上,如果你能得到正确的格式(如果感兴趣的话可以看看big / little endian),只要链接器(不是编译器)知道如何将代码连接在一起,它就会工作。
除此之外,还有许多其他语言可以相互交stream的方式。 在.Net世界中,代码被编译成IL代码,这对于每种语言都是一样的,这样C#,VB.Net都是一样的,可以无缝调用/互相工作。
厉害。 如果没有迫切的需要,坚持一种语言。 你越来越依赖和复杂。 但是,当你有现成的代码提供有趣的function时,将它粘在一起比重新创build它更容易。
只要添加到示例列表中,在C或C ++中优化Python代码或者编写一个C库来将另一个库绑定到Python是相当常见的。
我在一个大型的企业项目上工作,这个项目由(最后一个)大约8种语言组成。 大部分的通信是通过企业级的消息总线,其中包含多种语言的绑定来进入和传递数据。 这叫做tibco 。