我认为这取决于你在做什么。我通常会混合语言。我将在下面描述我的个人经历,也许这会帮助您决定您的应用程序。虽然我将在下面讨论我自己的工作方式,并且我选择的工具是 Mathematica,但我相信同样的优势也适用于其他高级语言。
我通常用低级 (C++) 语言编写某种类型的模拟。它有一些(数字)输入并产生一些可能复杂的数字输出。本来我是通过命令行参数和输入文件来传递输入的,然后把输出写成文本文件。
最终有必要为许多不同的输入参数运行程序,这是最好的自动化。我曾经使用一些混合或 shell 脚本和脚本语言 (Python) 使用各种参数/输入文件调用我的程序,并在 Mathematica 中处理/可视化输出。
最终我发现编写一个 Mathematica 接口来调用我的 C++ 代码比编写命令行接口和使用输入文件要好得多。现在这是我的标准工作流程。事实证明,Mathematica 界面更简单,更容易编写(一旦我学会了!),主要是因为无需先将其转换为文本就可以轻松传输结构化数值数据。考虑例如必须传递一个 3D 数组列表。人们需要发明一种特殊的存储格式来传输这些,或者使用 C++ 库来存储一些常见的数据格式,例如 HDF5,无论如何 Mathematica 已经有一个高级接口。
使用 Mathematica 界面还使许多事情变得非常容易,例如:
参数空间的更智能映射(例如应用各种自适应 采样算法,这些算法更容易在高级语言中实现和测试);
轻松保存模拟状态并稍后恢复(因为在 Mathematica 和 C 之间传输结构化数值数据很容易,我可以花时间来实现它)
使用我的模拟运行各种数值算法,例如多元优化、求根等(因为 Mathematica 已经内置了许多这些算法)
立即以交互方式可视化结果,无需经过几个步骤(将数据写入文件,处理以进行可视化,将其读入绘图程序)。假设一个简单的求根方法会失败,原因尚不清楚。如果我可以交互式地玩模拟,并立即将结果可视化,那么弄清楚发生了什么会容易得多。
使用 Mathematica 的并行工具轻松并行运行模拟,甚至在多台计算机上(感谢 Mma 的内置通信协议)。
如果模拟的输出非常大(数百 MB),我无法将所有参数值全部存储起来。我通常会对其进行一些分析(平均值、方差等),然后只存储结果。使用高级语言来驱动模拟允许我运行更多非平凡类型的分析,而无需自己在 C++ 中实现它们。
这里的重点是使用具有许多有用的内置功能的高级语言来轻松实现事物。所有这些也可以以不同的方式完成,但工作量会大得多,所以我可能不会这样做。
现在我通常在编写命令行界面之前编写 Mathematica 界面,并且仅在我确实需要它时才执行后者(例如,我必须与不使用 Mathematica 的人共享代码)。
这对我来说效果很好,因为我已经很了解 Mathematica,而且我已经用它来处理和可视化输出。我也熟悉 Mathematica 方便的 C 接口,这确实需要一些时间来学习。另外,我通常单独编写这些模拟,这并不限制我可以选择的工具。如果我在代码上与某人合作,我会选择使用我们都熟悉的工具。
当使用具有方便 C 接口的任何其他类似高级语言时,同样的优势也适用,例如Python/MATLAB/Julia/R/etc。我在这里提到 Mathematica 是因为这是我所熟悉的,并且我正在描述我自己的工作流程。
我还经常使用Mathematica 中的MATLAB和R函数(偶尔使用 Java)。我这样做是因为这些语言之间已经存在方便的高级接口。不然我就不打扰了。我相信Python是以这种方式使用的最方便的语言之一,它将各种包的功能粘合在一起。