2009-12-11 104 views
4

一个程序可以用多种编程语言编写吗?我在The Daily WTF上阅读的内容似乎意味着大型公司/组织在构建大型应用程序时使用几种不同的语言。这是如何运作的?我知道从与Django一起工作时,动态网页经常与许多不同的语言(Python的控制器,HTML + Django的模板语言的视图和SQL的模型)放在一起,但怎么样,即编译时会变成.exe的东西?用2种语言编写程序?

+0

亚马逊的体系结构 - http://highscalability.com/amazon-architecture - 是C++,Java和Perl的良好混搭。 – 2009-12-11 06:17:51

回答

3

这是相当普遍建立使用不同的汉语语言和技术的大型应用程序。混合语言有不同的方式。

首先,从不同语言的编译器可产生可连接在一起兼容输出。这可以是C,C++,Pascal等编译为本地代码的.obj文件。或者可以是.NET程序集 - 您可以毫不费力地使用任何其他.NET家族语言程序集编写的任何.NET族语言编写的程序集。

然后,还有就是各种互联互通技术。您可以将一些代码封装为COM对象,并以不同语言的应用程序使用。或者你可以将不同语言的代码放入不同的程序中,并通过RPC等进程间通信技术进行通信。在后一种情况下,他们完全不关心另一个进程是如何工作的 - 他们只发送和接收消息 - 就像你不关心你从浏览器中读取页面的浏览器和Web服务器很可能是用不同的语言编写的一样。

3

如果不同语言的编译器可以生成相同格式的目标文件,链接器不关心他们编译的语言

此外,您可以从任何语言编译.dll,它的工作原理是相同的。

2

这是可能的,虽然不是很常见。所有语言最终都被编译为汇编语言,因此只要每种语言使用相同的ABI(调用约定等),用不同语言编译的模块就可以链接在一起。不过这并不常见。

另外,许多程序使用扩展语言。例如,魔兽世界中的大部分用户界面都是用Lua扩展语言编写的,尽管核心WoW程序可能是C++。

+10

交互语言实际上是非常常见的。 – Randolpho 2009-12-11 06:04:40

+0

我会同意它很常见。大多数程序都是以一种核心语言开始开发的。然而,随着时间的推移,随着计划的发展,会引入更多的语言。 – 2009-12-11 06:08:14

+0

并非所有语言都被编译为程序集。许多仍然被解释。它们被汇编代码解释,并且它们可以被编译成汇编,但它们仍然被解释。 – 2009-12-11 06:46:17

1

简短的回答是肯定的,长的回答是:

是,通过执行以下的一种或多种:

  1. 大厦库和编译时他们连接起来。
  2. 构建动态库并在运行时链接到它们,这样你就可以拥有一个exe和一些dll。
  3. 对于像.net这样的框架,只要框架支持,语言并不重要,因为它可以用相同类型的代码编译,或者框架知道如何运行它。
3

是的,您当然可以使用多种语言编写程序。你需要做的是模块化程序。例如将模块写入为DLL。如果只要DLL之间的接口很常见,就可以为每个DLL使用不同的语言。

我在一个已经开发了8年以上的程序上工作。该程序是在C++年前开发的。今天,它的.NET。模块化是通过构建COM对象来执行的。这使我们能够为相同的应用程序使用各种语言和技术。我拥有的最古老的代码是基本香草C,最新的代码是C#3.5。

+0

确实。我公司的主要产品使用PowerBuilder,C,C#和VBA。我们使用ODBC,COM和OLE进行各种进程间通信。再也无法用一种语言去做任何真正有用的东西了。 – DaveE 2009-12-11 07:13:10

0

是的,当然。在.NET中你可以使用C#,VB和C++,因为它们都生成IL对象代码。

在Windows或其他平台(Unix,Linux)上编译为本机时,许多编译器会以标准/共享格式生成目标文件。在这种情况下,链接器可以很容易地将它们组合成一个共享库,静态库或最终运行库(Unix中的a.out或ELF二进制)。

这通常是因为不同的程序员有不同的偏好,也因为某些语言结构可以更好地描述特定类型的解决方案。当一个应用程序从多个不同的语言放在一起

0

大多数编程语言具有用于与C.接口连接的装置,它可以通过为每个不同的部件的创建I2C接口和连接I2C接口,或不同的组件来实现可能实际上被编译成单独的应用程序,这些应用程序使用套接字或其他形式的进程间通信相互通信。

0

近编程,当一切都用汇编语言编写的石器时代,编译语言走过来。在经历了一些痛苦,悲伤和多年之后,人们犹豫地承认用FORTRAN这样的“高级语言”编写至少一部分应用程序是件好事。但是许多模块仍然在组装中,包含了FORTRAN做得不好的东西,比如CPU技巧,微小的代码空间要求等等。

在1980年代我开发的一个应用程序中,我们开发了FORTRAN,PL/M,8086程序集和C语言的选择是由历史的动力加上不断改进的编译器和构建工具所驱动的。

0

今天,你不可能只用一种语言逃脱。

看看Adobe。所有流行的Adobe产品现在都包含越来越多的Lua脚本。他们从Lightroom开始,现在技术上的商业策略是用C/C++/Assember编写基本的例程(你需要这个用于快速SSE图形),所有的GUI都和Lua粘在一起。

1

上面的答案(我迄今见过的)都是正确的。其他未提及的东西是公司/组织定义“大型应用程序”,而不是程序员有时做的不同。

医院医疗信息系统对于医疗服务来说是一个“大型应用程序”,即使它实际上涉及到一些不同的Web服务器,数据库,用于集成各种第三方产品的各种定制脚本,特别是客户端用于放射诊断的程序,用于医生和护士的不同网页界面以及用于在结果上传时用于寻呼医生的SMS系统等。

换句话说,在你可能认为“大应用= 1大二进制”可能会认为“大型应用程序=一大型IT合同的名词,无论涉及多少二进制文件”。

0

是的,可以做到。更常见的情况是,没有这样做,因为目标语言没有特定的功能,或者所述功能更容易在另一种语言中执行。

0

性能的另一个原因是在一个单一的应用程序混合语言。在解释型语言中,速度可能比C/C++慢几个数量级。应用程序可以使用C/C++编写CPU密集型部分,同时留出更高级语言中的大部分程序逻辑,以充分发挥性能和编程的便利性。