10

我正在考虑构建一个混合了动态语言(python 或 ruby​​)和编译语言的应用程序,并且需要一些帮助来说服自己这是一个好主意。

我的想法是,我可以使用动态语言来快速编写大量代码,然后下降到像 c/c++ 这样的编译语言来实现性能关键代码。

我可以看到这种方法的很多好处:

  1. 通过主要使用动态语言进行编码来提高生产力
  2. 两种语言的库的可用性

但也有一些缺点:

  1. 维护两种语言之间的桥梁
  2. 依赖两种语言和语言/库错误而不是一种

这种方法的其他优点/缺点是什么?有人知道这方面的任何资源和/或最佳实践吗?

4

11 回答 11

12

我认为你的方法非常明智。解决缺点的方法是在决定是否将动态语言用于您的项目之前,提前了解将动态语言与 C 或 C++ 接口是多么容易。

此外,您需要考虑是否希望您的应用程序是跨平台的。与编译语言相比,动态语言可能对平台的依赖性要小得多。这可能是决定应用程序的哪些部分应该用 C 或 C++ 完成的一个因素。

于 2008-09-26T20:18:31.173 回答
6

我刚刚重新阅读了您的问题-您建议将 C 用于性能关键代码。任何称职的动态语言都有工具可以让您有效地访问本机代码。因此,首先用动态语言编写整个内容。你可能会发现你根本不需要 C。

但如果你这样做了,请拿出一个分析器,仔细选择要优化的东西,然后去做。

于 2008-09-26T20:54:53.490 回答
5

Ja, bien sur, mein freund。这确实是不可思议的奇迹。蟒蛇排序。

我当然是在开玩笑。Web 开发人员每天都会这样做,甚至没有注意到:Java、JSP、EL/OGNL、HTML、CSS、Javascript、ant、XML、XSLT...

我认为多语言编程是自然的、强大的、高效的,而且比其他任何东西都酷。当然,它必须以正确的方式使用,以发挥每种语言的最大力量,并且不要混淆团队中的其他人。

于 2008-09-26T20:29:38.870 回答
3

是的。许多程序是高级语言(如 Python 或 Ruby)和低级语言(如 C)的混合体。您可以从垃圾收集的 OO 语言中获得编码逻辑的好处,并且仍然可以在紧密的内部循环中手动管理寄存器.

于 2008-09-26T20:15:27.000 回答
2

您可能会发现直到以后才需要实现任何对性能至关重要的东西。所以,我会努力反对这些性能关键的重大变化之一的到来,直到你真的确定你需要这样做。

否则只需选择一种根语言,perl 和 ruby​​ 使用 c,因此它们的合并非常简单。您还可以在 Java VM 上运行 python (jython) 或 ruby​​ (jrunby),这将为您提供 java 作为后端。尽管它可能会带来一些其他问题,因为我不熟悉针对相应语言的这些版本进行开发。

不过,并非所有性能问题都需要您使用低级语言,因此请先尝试用一种语言解决它,然后再快速跳转到另一种语言。

祝你好运,

于 2008-09-26T20:31:50.877 回答
2

我赞成使用最好的工具来完成这项工作。在软件工程的情况下,这意味着是多语言的。你永远不会期望木匠只使用锤子,无论他/她正在建造什么。为什么对我们来说应该不同?

于 2008-09-26T20:35:23.897 回答
2

@佐克曼

我有使用 Jython 和 JRuby 的经验……更多的是使用 JRuby。

我必须说它们是很棒的平台,你会得到动态语言的巨大好处,加上对 Java 的丰富的 3rd 和 1st 方库支持,加上高度独立于平台的基础编译语言,加上两种语言的垃圾收集(理解这一点很重要)内存管理,但我的阵营是你最好避免它,除非你真的需要它,例如如果你正在做驱动程序或内核级别的东西,或者需要你可以召集的每一盎司性能的东西)。

我只想讲一个简短的轶事。我最近正在构建一个 ruby​​ 脚本来索引 Solr 实例,我需要访问一个 DB2 数据库(我们要索引的数据源)。直接 Ruby 惨遭失败……它具有糟糕的 DB2 支持,需要完整安装 DB2 express 版本……它仍然没有像宣传的那样工作(我在完成安装后无法编译 Ruby 驱动程序)。解决方案是切换到 JRuby 并从 Ruby 端使用 JDBC,使用几个易于安装的 jars(以及比 DB2 安装小得多的文件)。

我绝对强烈建议考虑使用 JRuby 或 Jython,而不是使用 C 作为后端...我发现算法和资源性能通常对应用程序性能的影响比您选择的语言大得多,而且 Java 平台有提供了很多东西(自从人们谴责它比 C/C++ 慢得多的早期以来,它已经走了很长一段路)。除非您正在执行无法通过算法重构的非常繁重的计算密集型事情,否则无论您选择什么,您很可能都不需要使用编译语言。


PS 在 JRuby 中与 Java 的集成是非常无缝的(无论如何从 JRuby 到 Java 端),所以维护一个桥不是问题。我认为 Jython 是一样的,但我对它的体验要少得多。

于 2008-09-26T20:51:47.193 回答
2

值得注意的是,Gambit Scheme 和 Chicken(以及其他一些实现)在解释模式下运行,然后可以编译成 C。

于 2008-09-27T00:28:06.487 回答
1

我认为这是个好主意。

由于大多数(几乎所有?)操作系统都是用 C 或 C++ 编写的,因此每种动态或解释语言都在某种程度上回退到针对低级内容的已编译、优化语言。

于 2008-09-26T20:24:41.393 回答
1

有些人认为我们程序员必须掌握太多的语言。他们认为添加一种语言是一件坏事。

SQL 中的整个数据访问,HTML/CSS 中的表示似乎是不可逆转的。

XML 有点令人厌烦:有些人试图用 XML 做所有事情,好像 XML 具有使软件变得更好的神奇力量。

此外,由于多种语言,存在相当多的冗余。所有的语言间绑定意味着事情被写了两次,每种语言一次。

于 2008-09-27T01:00:20.637 回答
0

这很常见,但请确保您知道为什么要以您的方式构建它。

一个例子是游戏编程。在许多游戏中,对性能至关重要的游戏引擎是用 C 编写的,而关卡脚本等事情是用 Python、Scheme、一种本土语言或其他语言完成的。

这意味着性能极客正在使用他们喜欢的语言工作,这为他们提供了所需的低级控制,而关卡设计人员可以使用更高级别的语言工作,而无需担心管理内存等等。

于 2008-09-26T20:38:03.063 回答