多语言或多语言解决方案允许您将语言应用于最适合的问题。然而,至少根据我的经验,软件商店倾向于将“超级”语言应用到他们试图解决的问题的各个方面。即使有另一种语言可以简单自然地解决问题,坚持使用这种语言也会带来“地狱或高水位”。为什么您使用或不使用多语言解决方案来实施?
6 回答
我几乎总是提倡在解决方案空间中使用超过 1 种语言(实际上,超过 2 种,因为 SQL 是众多项目的一部分)。即使客户喜欢具有明确类型和大量人才的语言,我也提倡使用脚本语言进行管理、测试、数据清理等。
多语言的优势归结为“适合工作的工具”。
但是,有一些合理的缺点:
- 更难拥有集体代码所有权(不是每个人都精通所有语言)
- 集成问题(在托管平台中减少)
- 基础设施库的运行时开销增加(这通常很重要)
- 工具成本增加(IDE、分析工具等)
- 从一个切换到另一个时认知“颠簸”。这是一把双刃剑:对于那些精通的人来说,不同的范式是相辅相成的,当其中一个出现问题时,通常会出现“但在 XI 中会用 Z 解决这个问题!” 并且问题很快得到解决。然而,对于那些不太了解范式的人来说,在试图理解“这是什么?”时可能会真正放慢速度。
我还认为应该说,如果您要使用多种语言,我认为您应该使用具有明显不同方法的语言。我认为通过在一个项目中同时使用 C# 和 VB,您在解决问题方面并没有什么收获。我认为除了您的主流语言之外,您还希望拥有一种脚本语言(小型和一次性任务的高生产力)和一种具有截然不同的认知风格的语言(Haskell、Prolog、Lisp 等)。
我的雇主的态度一直是使用有效的方法。
这意味着当我们找到一些有用Perl
的模块(比如实现“本福德定律”的模块Statistics::Benford
)时,我必须学习如何使用 ActiveState 的PDK
.
当我们决定在我们的项目中添加区间数学时,我必须学习 Ada 以及如何同时使用GNAT
和ObjectAda
.
当需要一个高速字符串库时,我不得不重新学习汇编程序并MASM32
习惯WinAsm
.
当我们想要一个 COM DLL libiconv
(基于 Delphi Inspiration 的代码)时,我重新熟悉了Delphi
.
当我们想使用 Dr. Bill Poser 的libuninum
时,我不得不重新学习C
,以及如何使用Visual C++
6 的 IDE。
我们仍然在VB6
and中做原型VBScript
,因为他们很擅长。
也许在某个时候,我最终会在 Forth、Eiffel 或 D 中做一些事情,或者,上帝保佑我,Haskell(我对语言本身没有任何反对意见,它只是一个非常不同的范式。)
我很幸运能够在小型项目中工作,并有可能为我的任务建议一种合适的语言。例如,C 作为一种低级语言,将 Lua 扩展为高级/原型设计非常好,在新的嵌入式平台上快速上手。对于任何更大的项目,我总是更喜欢两种语言,一种特定领域的语言适合该特定项目。它为快速尝试新功能增加了很多表现力。
然而,这可能最适合您的敏捷开发方法,而对于更传统的项目,要克服的第一个障碍是选择使用哪种语言,当脚本语言往往立即看起来是“新手”,营销推动力或“严肃性”较少时图片。
多语言解决方案的最大问题是涉及的语言越多,就越难找到具有适当技能的程序员。特别是如果任何一种语言甚至有点深奥,或者来自完全不同的设计学校(例如 - 功能与过程与面向对象)。是的,任何优秀的程序员都应该能够学习他们需要的东西,但是管理层通常希望有人能够“一举两得”,无论这多么不切实际。
其他原因包括代码重用、不同语言之间接口的复杂性增加,以及关于特定代码应该属于哪种语言的不可避免的地盘之争。
综上所述,要意识到许多系统在设计上都是多语言的——任何使用数据库的东西都会有 SQL 和其他一些语言。而且通常还涉及到脚本,无论是针对实际代码还是针对构建系统。
我几乎所有的专业编程经验都属于上述类别。通常有一种核心语言(C 或 C++)、不同程度的 SQL、shell 脚本,可能还有一些外围的 perl 或 python 代码。
我遇到的一个问题是 Visual Studio 不允许在单个项目中混合多种语言,这迫使您将事物抽象为每种语言的单独 DLL,这不一定是理想的。
然而,我怀疑主要原因是认为在许多不同语言之间来回切换会导致程序员效率低下。这是有道理的,我经常在 JavaScript、C#、VBScript 和 VB.NET 之间切换,当我从一种语言切换到另一种语言时,会浪费一些时间,因为我会稍微混合一下我的语法。
尽管如此,肯定还有更多“多语言”解决方案的空间,尤其是超越使用 JavaScript 和任何后端编程语言的解决方案。
好吧,现在所有的网络都是多语言的,后面是 Java/PHP/Ruby,前面是 JavaScript……我想到的其他例子——一个用低级语言(C 或 C++)编写的灵活复杂系统,带有嵌入式高级语言(Python、Lua、Scheme)提供定制和脚本接口。Microsoft Office 和 VBA、Blender 和 Python。
一个可以用脚本语言(如 Python)完成的项目,其性能关键或依赖于操作系统的部分用 C 完成。
JVM 和 CLR 都获得了许多新的有趣的脚本语言兼容。Java + Groovy、C# + IRonPython 等。