我听说有些人在一个项目中用多种语言编程.我无法想象语言如何相互作用.
我的意思是没有类似的Java方法
myProgram.callCfunction(parameters);
永远不会发生或我错了吗?
在一个项目中使用多种语言实际上很常见,但其背后的原理并不总是很简单.
在简单的情况下,不同的语言被编译为相同的代码.例如,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服务和其他面向服务的体系结构,可能是最现代的方法
通常,任何体面大小的Web项目都将使用大约五种语言:HTML,CSS,Javascript,某种服务器端"完成任务"语言(使用Perl,PHP等的ASP,JSP,CGI脚本)和一些变体用于数据库连接的SQL.
(当然,这是在挥舞着关于HTML和CSS是否算作编程语言的争论 - 我是"他们是,但只是不是图灵完整的语言"阵营,但这是另一个线索. )
所有这些如何协同工作的一些例子:
如果您要使用最佳实践路线,则网页的结构是HTML格式,并且有关如何显示它的说明是在CSS中 - 可以在同一个文件中,但不一定是.CSS包含一堆HTML所引用的类,由浏览器决定如何一起点击它们.
更进一步,该页面上的任何javascript脚本都可以改变任何存在的HTML/CSS(更改HTML实体的内容,将一个CSS类替换为另一个,改变CSS的行为,等等.它通过一种称为文档对象模型的方式实现这一点,文档对象模型本质上是一种语言和平台无关的API,以类似对象的方式操作HTML页面(此时我将慢慢退回并提供相关链接维基文章.)
但是,所有HTML/CSS/Javascript都来自哪里?这就是服务器端语言的作用.在最简单的形式中,serer端语言是一个程序,它返回一个包含HTML页面作为输出的巨型字符串.显然,这可以变得更加复杂:HTML表单和查询字符串参数可以用作我们的服务器端程序的输入,然后你有整个AJAX的东西,javascript也可以将数据直接发送到服务器语言.你也可以看到服务器语言可以自定义吐出的HTML,CSS和Javascript的地方 - 实质上,你有一种语言用另一种语言编写程序.
SQL连接的服务器端语言大致相同.有很多方法可以使它更复杂和更安全,但最简单的方法是让您的服务器语言动态构建一个带有SQL命令的字符串,通过某种连接器将其传递给数据库,然后返回结果集.(在这种情况下,您确实拥有一个归结为someValue = database.executeThisSQLCommand(SQLString)的函数.)
因此,在这种情况下,不同语言可以通过实际相互编写程序进行通信,也可以通过非常简单易于解析的格式处理数据,以便每个人都能理解.(主要是弦乐.)
使用的多种语言简称为"互操作性"或"互操作性".
你的例子是错的.Java可以调用C函数.
该语言提供了互操作性机制.
在.NET的情况下,语言作为CLI的一部分被编译为IL.因此,任何.NET语言都可以互换(由其定义的调用方法)在任何其他.NET语言中定义的模块.
举个例子:
我可以在C#中定义一个方法
static void Hello(){ Console.WriteLine("Hello World");}
我可以用Python调用它(IronPython)
Hello()
并获得预期的输出.
一般来说,某些语言比其他语言更好地互操作,特别是如果语言作者专门制作互操作语言的一个特征.
多种语言可以与:
管道输入/输出(任何语言都可以这样做,因为必须在每种非玩具语言中实现输入和输出)
使用一种语言的代码编译到本机库,而另一种语言支持调用本机代码.
通过环回网络连接进行通信.您可以通过这种方式遇到防火墙干扰问题.
数据库.这些可以被认为是"通用"数据存储格式,因此可以通过数据库扩展来访问大多数语言.这通常需要一个程序在下一个程序可以访问数据库之前完成操作.此外,所有"通信"通常都写入磁盘.
如果涉及的语言在同一运行时(即.NET,JVM)上运行,那么通常可以将对象数据从一种语言直接传递到另一种语言,而几乎没有任何阻碍.
几乎在所有情况下,您必须在交换之前将任何通信转换为通用格式(例外是同一运行时的语言).这就是为什么在一个项目中很少使用多种语言的原因.