在一个项目中使用不同的语言

时间:2010-05-17 15:10:24

标签: programming-languages

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

  • 这是常见做法吗?谁做到了?

  • 我确信这有弊端。我认为您将遇到不同的解释器/编译器问题并无缝连接不同的语言。这是真的吗?

  • 为什么这样做呢?为了表现?

7 个答案:

答案 0 :(得分:2)

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

  
      
  • 这是常见做法吗?谁做到了?
  •   

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

考虑游戏的例子。核心引擎通常用C或C ++编写,用于速度和低级硬件访问,但对象和字符的行为是用Lua这样的高级语言编写的。

  
      
  • 我确信这有缺点。我认为您将遇到不同的解释器/编译器问题并无缝连接不同的语言。这是真的吗?
  •   

是的,允许脚本访问游戏对象等有一定的开销。

  
      
  • 为什么这样做呢?为了表现?
  •   

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

  • 发展速度;想象一下,如果像“魔兽世界”这样的游戏中的所有小物体和角色都是用C ++编写的话。对于每一个小小的改动,都必须编译并重新启动该程序。

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

  • 可移植性;相同的脚本将在不同平台上不加修改地运行。

答案 1 :(得分:1)

考虑平均网络项目及其涉及的语言数量:

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

当每种语言比你已经使用的语言更适合于域名时,可​​以使用另一种语言。

我还有一个数据量很大的程序,其中一个用Java编写的Web前端,但是用C语言编写的后端(实际上是紧缩数字),托管在不同的服务器上,等等。

而且我必须说,不要模仿Twitter。你不太可能知道很多人都想要这么多,没有内置的盈利能力,投资者会为你付钱。他们在适合和完成的地方也非常糟糕;如果你曾经输入过你的Gmail密码,那么它很可能是以明确的方式传输的,例如,至少两年,你可以通过短信界面未经他们许可的方式与朋友联系。 (尔加。)

答案 2 :(得分:0)

我相信在Twitter的情况下它与性能有关; Scala比Ruby快得多,他们用它来为队列系统供电。

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

答案 3 :(得分:0)

我有几个混合语言的项目

在一个案例中,我有一些F#与c#混合,因为f#允许我更容易编码问题(并且是一个挑战)

其他情况是在同一个项目中混合使用silverlight和.net - 它们使用不同的CLR

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

主要的缺点是每个参与代码的人都需要了解所有语言。

这不是我经常做的事情,但实际上它是关于工作的工具。

我不会说它通常是为性能而做的...虽然我已经链接到c ++ dll,但是当我需要快速完成某些事情时(我可以做任何cuda之前的图形算法)...周围的决定性能大于计算时间。他通常的开销,如可靠性,易读性仍然存在。 即我认为你可以说它的性能只要你不限制性能来表示程序执行的速度

答案 4 :(得分:0)

在我为8051编写的典型嵌入式应用程序中,我涉及多种语言:

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

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

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

答案 5 :(得分:0)

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

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

答案 6 :(得分:0)

  

这是常见做法吗?为什么这样做呢?为了表现?

是。执行此操作的人通常会尝试重用现有软件(您会注意到这些软件是用多种语言编写的),或者尝试使用多种不同的语言,每种语言都适合它。

表演有时可能是相关的;例如,我可能希望将Lua用于其快速原型设计功能,但将其连接到用C编写的高性能电子邮件解析器。

  

我认为您将遇到不同的口译员/编译器以及无缝连接不同语言的问题。这是真的吗?

有时。多语言的实践状态大致是如果一种语言与其他任何语言交谈,它将与C对话。因此,通常可以通过某种类似C的界面来使事物协同工作。

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

摘要:有充分的理由使用不同的语言来解决不同的问题,如果大型软件系统使用多种语言,那将会令人惊讶(除了在像Squeak Smalltalk这样的单语言孤岛中,它根本就不与世界其他地方交谈。互操作性当然存在困难,但问题是旧的,并且已知变通方法。