【问题标题】:Picking a front-end/interpreter for a scientific code为科学代码选择前端/解释器
【发布时间】:2010-07-02 16:58:27
【问题描述】:

我在过去几年开发的模拟工具是用 C++ 编写的,目前有一个 tcl 解释的前端。它被编写成可以在交互式 shell 中运行,也可以通过传递输入文件来运行。无论哪种方式,输入文件都是用 tcl 编写的(我添加了许多其他特定于仿真的命令)。这允许非常强大的输入文件(例如,当运行 monte-carlo sims 时,可以直接在输入文件中将随机分布编程为 tcl 程序)。

不幸的是,我发现 tcl 解释器与更现代的解释语言所提供的相比变得有些受限,而且它的语法似乎有点神秘。由于计算引擎是作为具有 c 兼容 API 的库编写的,因此编写替代前端应该很简单,我正在考虑转向新的解释器,但是我有一点时间选择(主要是因为我对许多解释语言没有丰富的经验)。我已经开始探索的选项如下:

留在 tcl:
优点:
- 无需更改现有代码。
- 现有的输入文件保持不变。 (虽然我可能会保留 tcl 前端作为选项)
- 拥有大量社区支持的成熟语言。
缺点:
- 感觉受到语言语法的限制。
- 收到用户抱怨学习 tcl 的难度。

Python:
优点:
- 现代口译员,效率很高。
- 大型、活跃的社区。
- 著名的科学和数学模块,例如 scipy。
- 常用于学术科学/工程社区(我的代码的典型用户)
缺点:
- 我从未使用过它,因此需要时间来学习这门语言(这也是一个专业人士,因为我一直想学习 python)
- 输入文件的严格格式(缩进等)

Matlab:
优点:
- 非常强大且广泛使用的数学工具
- 强大的内置可视化/绘图。
- 可扩展,通过社区提交的代码以及商业工具箱。
- 科学/工程学术界的许多人都熟悉并熟悉 matlab。
缺点:
- 不能作为可执行文件分发 - 需要是附加组件/工具箱。
- 需要(?)matlab 编译器(价格昂贵)。
- 需要 Matlab,也很贵。

这些优点和缺点是我能够想出的,尽管我对一般解释语言的经验很少。我很想听听我在这里提出的解释器的任何想法,如果列出的这些优点/缺点是合法的,以及我没有想到的任何其他解释器(例如,php 是否适合这样的事情?lua ?)。在代码中嵌入解释器的第一手经验绝对是加分项!

【问题讨论】:

  • CoreMaster2?听起来就像我公司的另一个部门开发的代码。
  • 不,这是一个通过多孔介质模拟器的学术流程,主要由我所在研究小组的研究生和博士后使用。
  • 我不会将 Python 称为“高效”。 Python 代码效率相当低,数字运算通常由通过 Python API 访问的 C 代码完成 :) 不过我仍然使用它,因为它太简单了。
  • @Matthieu M.- 我想我应该澄清一下 - Python 似乎具有执行科学计算的高效模块(我认为这是一个公平的评估)。
  • @Juan:我最终选择了 Python。具体来说,我使用 boost::python 将 C++ 代码与 python 解释器集成。

标签: c++ python matlab tcl interpreter


【解决方案1】:

从预发布开始,我就是 Tcl/Tk 的坚定支持者,直到我用它做了一个大型项目并发现它是多么难以维护。不幸的是,由于原型在 Tcl 中非常简单,因此您最终会得到“一次性”的脚本来拥有自己的生命。

在过去几个月中采用了 Python,我发现它完全符合 Tcl 的承诺,而且还远不止于此。正如许多 Python 资深人士可以告诉你的那样,源代码缩进最多在第一个小时内是一件麻烦事,然后它似乎不是一个障碍,而是肯定有帮助的。顺便说一句,Tcl 的作者 John Ousterhout 因编写了一种强制 Tcl 编码器使用 One True Brace Style 的语言而受到赞扬和批评(我是 1TBS,所以对我来说没问题)。

唯一不能被 Python 很好地处理的 Tcl 构造是任意的 eval "${prefix}${command} arg" 构造,无论如何都不应该在 Tcl 中使用,但它们和 uplevel 类型语句(这是一个好主意,但有些毛茸茸代码)。确实,Python 对动态 eval 感觉有点反感,但我认为这是一件好事。不幸的是,我还没有开发出一种包含其 GUI 以及 Tcl/Tk 的语言。 Tkinter 在 Python 中完成这项工作,但它很痛苦。

我根本无法使用 Matlab。

在我掌握了几个月的 Python 之后,我几乎可以肯定地将任何正在开发中的 Tcl 程序移植到 Python 中以保持理智。

【讨论】:

  • “有了几个月的 Python 经验,我几乎可以肯定将任何正在开发的 Tcl 程序移植到 Python...” 这是一个提议吗? ;) 说真的,看起来 python 提供了很多东西,而且由于我们有一个新的博士后加入,对它非常熟悉,它看起来很有吸引力。感谢您分享您的观点 - 这绝对有帮助!
  • 作为对比,我曾与 Tcl 合作过大型商业项目,发现它具有极强的可维护性和可扩展性。根据我的经验,这两者更多是程序员或团队的一个因素,而不是语言。
  • 我已经在 Tcl 社区工作了 15 年,不记得每次听到 John Ousterhout 批评“编写一种强制 Tcl 编码器使用 One True Brace Style 的语言”,但也许我只是一直没有关注。当然,有些人不喜欢它,但任何其他风格都不会是 Tcl。这是一项功能,而不是错误。
【解决方案2】:

您考虑过使用 Octave 吗?据我所知,它几乎可以替代大部分 matlab。这可能使您可以为拥有 matlab 的人提供支持,并为没有的人提供免费的替代方案。由于您的程序的“肉”似乎是用另一种语言编写的,因此性能考虑似乎不如提供具有以下功能的环境重要:绘图和可视化功能,跨平台,拥有庞大的用户群,并且在几乎学术界和/或参与流体流动建模的每个人都可能已经知道的语言。 Matlab/Octave 可能拥有所有这些。

【讨论】:

  • 我在八度音程方面的经历非常糟糕(多年前),我什至没有想到。这么说来,它作为一种选择绝对是有意义的。我想知道扩展octive的API与Matlab的API有多相似?
  • HI Mark,我也好几年没用过了,刚开始用的时候也没什么印象。上周我和一位 EE 教授一起工作:他有一个完全用 Octave 编写的完整的电磁断层扫描代码,它运行得非常快,真的让我想再看看它。我不知道 Octave 在合并其他语言方面的立场,就像 matlab 与 Mex 一样,但一些谷歌搜索显示了该领域的一些希望。
  • 很高兴听到它在过去几年里取得了长足的进步。我一定要再试一次。
【解决方案3】:

好吧,除非有任何其他建议,否则我得出的最终答案是使用 Python。

我认真考虑过 matlab/octave,但是在阅读 octave API 和 matlab API 时,它们有很大的不同,我需要为每个接口构建单独的接口(或者使用宏获得非常有创意的接口)。使用 python,我最终得到了一个单一的、更易于维护的前端代码库,几乎我们认识的每个人都在使用它。感谢大家的提示/反馈!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-07
    • 2012-07-19
    • 2021-08-17
    • 1970-01-01
    • 1970-01-01
    • 2013-03-09
    • 2015-03-23
    • 2011-04-11
    相关资源
    最近更新 更多