2010-05-17 36 views
10

我最近听说在一个(大)项目中使用了几种不同的语言,我还阅读了一些着名的服务,例如使用Rails作为前端的Twitter,与其他一些语言混合使用,以及Scala我认为它是后端。在一个项目中使用不同的语言

  • 这是常见的做法吗?谁做的?

  • 我敢肯定,这有缺点。我认为你会对不同的解释器/编译器产生问题,并且无缝地连接不同的语言。这是真的?

  • 这实际上是为什么?为了表现?

+0

+1非常有趣的问题,很好问。 – 2010-05-17 15:18:40

+1

很多傻瓜,包括http://stackoverflow.com/questions/2172219/is-polyglot-programming-important – 2010-05-17 15:41:31

回答

0

我相信,在Twitter的情况下,它是性能相关; Scala比Ruby更快,他们使用它来为队列系统提供动力。

除了维护问题,一起使用多种语言可以帮助弥补每种语言的缺点。通过Twitter,Ruby(on Rails)非常适合运行他们网站的前端,但使用更快的语言处理恶劣的后台任务更有意义。在排队系统时,语言之间的集成并不困难,因为它们可以完全独立于应用程序本身,并仍能正确执行其任务。

2

这个问题基本上归结为域特定语言(DSL)。有时候一种语言更适合于程序的一部分,另一种语言适合于另一种程序。好处(执行速度或易于开发)常常超过混合多种语言的缺点。

  • 这是常见的做法吗?谁做的?

很常见;我会说几乎每个大型应用程序都是用多种语言编写的。

考虑一个游戏的例子。核心引擎通常使用C或C++语言编写,以实现速度和低级别硬件访问,但对象和字符的行为以Lua等更高级语言编写。

  • 我相信这样做有缺点。我认为你会对不同的解释器/编译器产生问题,并且无缝地连接不同的语言。这是真的?

是的,有一定量的开销使脚本能够访问游戏对象等。

  • 为什么实际上这样做?为了表现?

是的,没有。如果性能不是问题,整个游戏可以用脚本语言编写。其他一些原因是:

  • 发展速度;想象一下,如果像魔兽世界这样的游戏中的所有小物件和角色都是用C++编写的话,那么就可以开销了。该程序必须进行编译并重新启动,以便进行每次小改动。

  • 模块性;新的对象可以在运行时轻松下载和添加/删除,精明的用户甚至可以对它们进行修改。

  • 便携性;相同的脚本将在不同的平台上运行。

+1

'我说几乎每个大型应用程序都是用多种语言编写的 - 我不会去那个*远,但不错的答案,否则 – 2010-05-17 15:24:05

+0

你能想到任何反例吗? – Thomas 2010-05-17 16:43:38

0

我有混合语言

在一种情况下,我已经用C#,因为F#允许我代码中的问题容易多了(是一个挑战),一些F#混合

其他情况下,一些项目会混合silverlight和.net在同一个项目 - 他们使用不同的CLR

在其他情况下,我有vb.net和c#当公司有程序员使用多种语言 - 我工作的大多数人不能阅读c ..任何代码都可能不是我ñ雇主的最大利益。

主要的缺点是每个工作在代码上的人都需要知道所有的语言。

这不是我经常做的事情,而是真正的关于工作的工具。

我不愿意这样做是为了表现通常......虽然我已经链接到C++ dll的时候,我需要做的事情非常快速(图形算法,我可以做任何cuda之前)......决定周围的表现大于计算时间。他平时的开销像sdcalability,易于阅读仍然进入它。 即我想你可以说,它的有关性能,只要你不限制性能意味着速度O fthe程序的执行

0

在一个典型的嵌入式应用程序,我写的8051,我已经涉及多国语言:

  • C - 应用程序的大部分是C语言,因为它的写入速度要快得多,但它很容易生成适合64k(或更少)代码空间的紧密代码。
  • 汇编语言 - 有时你不能通过编译器生成的代码。每个字节计数时,汇编语言规则。
  • Perl - 我的几个构建工具都是用Perl编写的。像Perl这样强大灵活的动态语言可以轻松处理ROM映像,并处理构建过程的许多方面。
  • GNU make - 嗯?是的,make是一种语言。它是一种声明性语言(这是与“面向对象”,“功能性”和“势在必行”相同的另一类语言)。 Make是我构建系统的基础。

我这样做是因为我喜欢为每项工作使用正确的工具。我必须使用C和汇编器来处理微小的8位微。我尽可能多地使用C,因为我完成了更多的工作。我使用Perl来处理复杂的与构建相关的任务,因为它比C更高效,比bash更强大,更便携。我使用GNU make作为构建的基础,因为它非常适合处理依赖关系,并且可以很容易地创建和维护这个元数据并将其应用到我的项目构建过程 - 换句话说就是生产力。

这种方法最大的缺点是显而易见的:理解我的应用需要工程师理解C,汇编语言,Perl和make。

0

很多的项目是混合语言。最常见的混合语言之一是SQL,它显示了混合语言项目的一个关键特征:每种语言都侧重于它擅长的部分问题,并弥补其他问题的弱点( S)。在SQL的情况下,它处理关系数据库访问,将其他事物(无论是GUI还是Web服务或......)留给其他更擅长的语言。我甚至会说使用单一语言就像用锤子做房子一样;是的,你需要一把锤子,但你也需要一堆其他工具。

我知道在一个项目中混合使用jQuery,Tcl,C,Fortran和SQL的项目。 (这是一个Web应用程序,通过Tcl编写的web服务器驱动,在C和Fortran,并通过SQL访问的数据库的计算组件)。

1

考虑平均web项目,它多少种语言包括:

HTML,CSS,JavaScript/JQuery,Java,SQL/HSQL。

当每一种语言是远远更适合比你已经在使用语言的域名,抛在另一种语言。

我也有与web前端数据重程序结束用Java编写的,而是用C编写的托管在不同服务器上的后端(用于实际处理数字)等等。我不得不说,不要模仿Twitter的模式。你不可能有这样的想法,即大量人需要这么多,没有建立在盈利能力之上,投资者为了钱而洗钱。他们在场地的合身和完成方面也非常糟糕;如果你曾经使用过Gmail密码,那么它很可能是以明文形式传输的,并且至少两年后,你可以通过短信界面在没有他们许可的情况下与朋友通话。 (Gah。)

0

这是常见的做法吗?为什么这个实际上完成了?为了表现?

是。做这件事的人通常试图重复使用现有的软件(你会注意到它是用多种语言编写的),或者试图使用几种不同的语言,每种语言都有其优点。

表现有时可能是相关的;例如,我可能希望使用Lua其快速原型的能力,但它连接到用C编写的

一套高性能的电子邮件分析器我认为你将有不同的解释/编译器和连接无缝的问题不同的语言。这是真的?

有时。多语言实践的状态大致上是,如果一种语言与其他任何事物都不会谈话,它就会与C通话。所以通常可以通过某种类似C的界面来协同工作。

否则,第一个问题通常在内存管理或VM层中出现,我们可能会考虑“托管代码”的示例。例如,让一个Haskell程序很难与JVM交换堆分配的对象。一个典型的解决方法是像远程过程调用一样处理这些类型的调用,就好像程序运行在不同的进程或甚至不同的机器上一样。这样的调用可能涉及大量开销,例如,通常使得两种不同语言共享可变对象的开销过于昂贵。但是,如果你不需要改变事物,管理费用就不会那么糟糕。

摘要:有使用不同的语言来解决不同的问题有充分的理由,如果一个大型软件系统没有使用多国语言(可能除了在单一语言孤岛状佳乐的Smalltalk这将是令人惊讶的,这根本不会与世界其他地方交谈)。互操作性确实存在困难,但问题在于旧的问题,并且已知解决方法。

相关问题