Programming languages 为什么您使用或不使用polyglot解决方案实施?

Programming languages 为什么您使用或不使用polyglot解决方案实施?,programming-languages,polyglot,Programming Languages,Polyglot,多语言或多语言解决方案允许您将语言应用于最适合的问题。然而,至少在我的经验中,软件商店倾向于将一种“超级”语言应用于他们试图解决的问题的所有方面。即使有另一种语言可以简单自然地解决问题,坚持使用这种语言也会带来“地狱或高潮”。为什么要使用或不使用polyglot解决方案来实现?我遇到的一个问题是,Visual Studio不允许在单个项目中混合使用多种语言,迫使您将内容抽象为每种语言的单独DLL,这并不一定理想 然而,我怀疑主要原因是人们认为在许多不同语言之间来回切换会导致程序员效率低下。这是有

多语言或多语言解决方案允许您将语言应用于最适合的问题。然而,至少在我的经验中,软件商店倾向于将一种“超级”语言应用于他们试图解决的问题的所有方面。即使有另一种语言可以简单自然地解决问题,坚持使用这种语言也会带来“地狱或高潮”。为什么要使用或不使用polyglot解决方案来实现?

我遇到的一个问题是,Visual Studio不允许在单个项目中混合使用多种语言,迫使您将内容抽象为每种语言的单独DLL,这并不一定理想

然而,我怀疑主要原因是人们认为在许多不同语言之间来回切换会导致程序员效率低下。这是有道理的,我经常在JavaScript、C#、VBScript和VB.NET之间切换,从一种语言切换到另一种语言时会损失一些时间,因为我混合了一些语法


不过,肯定还有更多“多语言”解决方案的空间,特别是在使用JavaScript和任何后端编程语言之外。

我很幸运地参与了一些小项目,有可能为我的任务推荐一种合适的语言。例如,C作为一种低级语言,为高级/原型开发扩展Lua的效果非常好,在一个新的嵌入式平台上可以快速提高速度。对于任何更大的项目,我总是喜欢两种语言,一种特定于特定领域的语言适合该特定项目。它为快速尝试新功能增加了很多表现力


然而,这可能最适合敏捷开发方法,而对于一个更传统的项目来说,首先要克服的障碍是选择使用哪种语言,因为脚本语言往往会立即看起来像是“新来者”,市场推广力度或“严肃性”较低在他们的形象中。

我几乎总是主张在解决方案空间中使用一种以上的语言(实际上,由于SQL是如此多项目的一部分,所以使用两种以上的语言)。即使客户喜欢具有显式类型和大量人才的语言,我也主张在管理、测试、数据清理等方面使用脚本语言

许多语言的优点归结为“适合工作的工具”

但也有一些合理的缺点:

  • 更难拥有集体代码所有权(并非所有人都精通所有语言)
  • 集成问题(在托管平台中减少)
  • 基础结构库增加了运行时开销(这通常很重要)
  • 增加的工具成本(IDE、分析工具等)
  • 从一个切换到另一个时的认知“颠簸”。这是一把双刃剑:对于那些深谙此道的人来说,不同的范式是互补的,当一个范式出现问题时,通常会出现“但在X中,我会用Z来解决这个问题!”并且问题会很快得到解决。然而,对于那些不太了解范例的人来说,在试图理解“这是什么?”时,可能会有一个真正的慢下来


我还认为应该说,如果你打算使用多种语言,在我看来,你应该使用不同方法的语言。比如说,我认为在一个项目中同时使用C#和VB,在解决问题方面不会有多大收获。我认为除了你的主流语言之外,你还需要一种脚本语言(对于较小的一次性任务来说是高效的)和一种认知风格截然不同的语言(Haskell、Prolog、Lisp等)

多语言解决方案的最大问题是,涉及的语言越多,就越难找到具有适当技能的程序员。特别是如果其中任何一种语言甚至有点深奥,或者来自完全不同的设计流派(例如功能性语言、过程性语言和面向对象语言)。是的,任何一个好的程序员都应该能够学习他们需要的东西,但管理层通常希望有人能够“脚踏实地地运行”,不管这有多么不现实

其他原因包括代码重用、不同语言之间接口的复杂性增加,以及不可避免的争夺特定代码位应属于哪种语言

所有这些都说明,要意识到许多系统在设计上都是多语言的——任何使用数据库的系统都会有SQL和其他语言。而且通常还涉及到脚本编写,无论是针对实际代码还是针对构建系统


我几乎所有的专业编程经验都属于上述类别。通常有一种核心语言(C或C++)、不同程度的SQL、shell脚本,以及外围可能的一些perl或python代码。

我的雇主的态度一直是使用有效的东西

这意味着,当我们发现一些有用的
Perl
模块(比如实现“本福德定律”的模块,
Statistics::Benford
)时,我必须学习如何使用ActiveState的
PDK

当我们决定将区间数学添加到我们的项目中时,我必须学习Ada以及如何使用
GNAT
ObjectAda

当需要高速字符串库时,我必须重新学习汇编程序,并习惯于
MASM32
WinAsm

当我们想要一个
libiconv
(基于Delphi Inspiration的代码)的COM DLL时,我重新接触了
Delphi

当我们想使用Bill Poser博士的
libunium
时,我必须重新学习
C
,以及如何使用
Visual C++
6的IDE

我们仍然在
VB6
VBScript
中创建原型,因为他们擅长于此

也许以后的某个时候,我会在福斯,埃菲尔,D,或者上帝保佑我,哈斯克尔(我没有任何反对的理由)