4

从我对语言设计的讨论来看,似乎很多人认为不存在也永远不会是“一种真正的语言”。根据这些人的说法,另一种选择是熟悉几种语言并为工作选择合适的工具。 这在整个项目或大型子项目的级别上非常有意义,只需通过非常狭窄、定义明确的界面与项目的其余部分进行交互。

另一方面,当试图优雅地解决许多小子问题时,使用许多不同的语言似乎是一件非常尴尬的事情。换句话说,恕我直言,在所有方面都不错的通用语言仍然很重要。作为一个简单的示例,假设您需要执行以下操作:

  1. 从文件中读取一些任意格式的数据。检查它是否有错误等(最好在 Perl 之类的东西中完成)。
  2. 将此数据加载到矩阵中,对其执行一堆核心矩阵操作(最好在 Matlab 之类的东西中完成)。
  3. 在其上运行自定义的计算密集型例程,该例程必须快速且节省空间(最好在 C 或 C++ 中完成)。

这是一个相当简单的项目,除了编写计算密集型的自定义矩阵处理例程之外,但关于使用什么语言的唯一好答案似乎是一个通用的,在所有方面都不错。

我在这里想念什么?一个人如何有效地使用多种语言来充分利用它们的每一种优势?

4

6 回答 6

3

我参与过许多项目,其中包含相当多样化的语言组合。除非它是一个 .NET 项目,否则您通常会在不同的层级或不同的进程中使用这些不同的语言。也许您的 webapp 在 PHP 中,而您的应用程序服务器在 java 中。因此,您并没有在方法级别真正“混合和匹配”。

在 .NET 和一些 java vm 语言中,规则会发生一些变化,因为您可以更自由地混合使用。但是这些语言的特性主要是由类库定义的——它们很常见。因此,在 .net 中切换语言的动机通常是由其他因素驱动的,例如开发人员知道哪种语言。F# 实际上提供了很多特定于该语言的语言功能,因此在 .NET 中似乎有点例外。一些 java VM 语言还向标准 java 库添加方法,添加 java 中不可用的功能。

实际上,只要所有语言都具有良好的 IDE 支持,您就会非常习惯使用多种语言。没有那个,我真的认为我会迷路。

于 2009-01-27T20:41:07.213 回答
1

Lua 等嵌入式语言使这变得非常容易。Lua 是一种类似于 Ruby 或 Python 的优秀动态语言,可让您快速开发高质量的代码。它还与 C 紧密集成,这意味着您可以利用 C/C++ 库并通过用 C 或 C++ 编写它们来优化性能关键部分。

在科学计算中,有一个脚本也很常见,例如将在 Matlab 中进行一些数据处理,使用 Perl 重新格式化输出,然后将其传递到另一个用 Matlab、C 或其他语言编写的应用程序中。不过,在集成由不同人编写的应用程序时,这种情况往往比从头开始开发时更为常见。

于 2009-01-27T20:58:31.313 回答
1

您是说选择是 a) 用一种语言编写所有内容并降低效率,或者 b) 将一堆不同的可执行文件拼凑在一起,以便为工作的每个部分使用最好的语言。

大多数在职程序员选择选项 c:尽其所能使用其 IT 部门在生产中支持的语言。通常,程序员在特定框架(例如 JVM 或 CLR)中的语言选择有限——因此它既不是工具箱乌托邦,也不是单一语言的贫民区。

甚至 LAMP 和 Rails 也支持(实际上是需求)不同级别的不同语言——在 Rails 的情况下,HTML、Javascript、Ruby、C。如果您正在编写软件服务(这是当今最有趣的工作发生的地方),那么您几乎不会只用一种语言编写。但你的选择也不是无限的。

于 2009-02-16T05:48:18.487 回答
0

考虑你的任务中最困难的部分。解析文件是最复杂的部分吗?阅读文件然后操作它们的好语言可能是最相关的选择。

数学转换是最困难的部分吗?您可能想吸收它并使用 matlab,用脚本或其他自制工具输入它。

性能是最重要的部分吗?与转换和解析相比,将进行多少计算?如果完成的工作的 90% 将在计算上,而其他部分只是暂时的,那么请考虑使用 C/C++ 解决方案。

在一个简单的解决方案中发挥多种语言的优势并没有本质上的错误,特别是如果您不介意将它与脚本粘合在一起。但是,您集成的语言和模块越多,您的依赖项就越多,您拥有的依赖项越多,分发和维护您的应用程序就越困难。这就是真正的权衡所在:运行应用程序所需的技术、库和软件位越少,它就会变得越简单。应用程序越简单,它就越可维护、可分发、可调试和可用。

如果您不介意集成多项技术的额外开销,或者该开销将为您节省相同或更多的开发时间,请继续。

于 2009-01-27T20:59:11.373 回答
0

我认为这很好。如果您将其设置为 n 层设置,其中每一层都以相同的方式访问其下方的内容(SOAP/XML/COM 等),我发现它最终是不可见的。

对于您的示例,我会为前端选择一种简单、快速、灵活的语言,并且可以对不同的接口(例如 com、corba、xml、.net)进行许多、许多、许多、许多类型的调用,自定义 dll 库、ftp 和自定义事件网关。这确保您可以轻松调用或与任何其他语言进行交互。

为此我选择的工具是使用 ASP/PHP/Java 和一点 Ruby 的 Coldfusion。它似乎将所有内容都集中在一个地方,并且非常简单。对于您的特定情况,COldfusion 将允许您编译您自己的库标签,您可以在您的网络代码中调用这些标签。在标签内,您可以放置​​您喜欢的所有 c 代码,并使其随心所欲。

有可用的免费和开源版本的 Coldfusion,它非常适合从一个代码库天真地进行 Java 和 .NET 调用。看看吧,我真的觉得它可能是最适合这类企业解决方案的。

我知道根据您的情况,PHP 也可以很好地解决这个问题,而且我相信 Asp.net 也不会落后太多。

于 2009-01-27T21:03:48.230 回答
0

我在多种语言方面的工作只涉及 C# 和 C++/CLI 的简单混合(如果你没有听说过,这就像 C++ 和 .NET)。我确实认为值得一提的是,.NET 和 Visual Studio 允许您将许多不同的语言组合在一起的方式意味着您在组合两种语言时不会像通常期望的那样高昂的开销 - Visual Studio 保留了这一切一起。鉴于有许多不同语言的 .NET 克隆——例如 F#、IronPython、IronRuby、JScript.NET——Visual Studio 是一种很好的组合各种语言的方法。

到听起来像您感兴趣的技术级别,它在 Visual Studio 中完成的方式是您必须为每种单独的语言创建一个项目,并且每个项目都被编译成一个程序集 - 基本上意味着它成为一个库其他项目使用。您将拥有一个主项目,它驱动一切并调用其他库。每种不同语言必须是不同的项目的要求意味着您不会在方法级别更改语言,但是如果您正在做一个足够大的应用程序,您可以在逻辑上将其分成多个项目,它实际上会非常有用。特别是,分离和抽象可以使事情变得更容易。

于 2009-01-27T21:18:49.947 回答