我目前正在大学上一门名为“科学计算”的数学课,教授告诉我们,C 是最常用的语言,嗯,科学计算,我只是想知道这位教授有多准确?
10 回答
在我的业务(粒子物理学)中,我们几乎从 fortran 77 直接转移到了 c++ 和 python。我们这些关心编程的人都知道 c,但它只是为小众应用程序(嵌入式 DAQ 板、专用驱动程序......)编写的。
但是学c会给你编程打下坚实的基础,和教授争论也很少能赚到钱。
我不认为你教授的答案对你有好处,即使它是正确的。
根据我作为科学计算和数据系统顾问的经验,C 的使用肯定很多,但 Fortran 和 C++ 也是如此。Python 是迄今为止最常用的脚本语言。
我认为这将会改变。现在最重要的是并行计算,这在我提到的传统语言中是痛苦的(有人说是 MPI 吗?)。我的猜测是,很多并行化将(并且应该)转移到虚拟机:Java 或 .NET;即,我认为并行化应该是 JIT 的工作。我不知道是否会使用Fortress或其中一种传统语言来启用它。英特尔正在推动C/C++ 的并行工具,但我想知道从长远来看,像 Terracotta 之类的东西是否会更好(我还没有听说科学界有任何人尝试过它——大型金融机构有,但他们不是打开)。
如果问题是你应该学什么才能找到一份科学计算的工作,那么我要说的第一件事是你更有可能因为你的科学技能而不是你的编程技能而被录用(这部分解释了很多科学代码,有关更多信息,请参阅此 SO 主题)。如果你要被聘用是因为你的编程技能(可能是 HPC),那么请考虑一下,在这位教授看来,在不远的将来,那些新项目可能已经过时了。不过,了解一些 Python 并没有什么坏处,包括NumPy。
据我所知,Fortran 对于科学目的来说非常普遍,但 C 语言足够通用,对于某些人来说,它是大多数任何类型编程的好解决方案。
对于生物信息学和计算生物学,C 非常流行。
很多“科学计算”都是在 Mathematica、Matlab 和其他类似工具中处理的。
嗯......在幕后,我认为 Matlab 是用 C 或 C++ 编写的,但 Mathematica 的许多部分都是用 Mathematica 本身编写的。可以肯定的是,由于历史原因,也因为 C 的内在特性,许多科学和高科技计算软件库等都是用 C/C++ 编写的。
我怀疑 C/C++ 将继续为许多实时和高性能应用程序提供有利的优势,对于原始计算本身(不能用高级语言表示)可能不是那么多,而是对于紧密循环的局部优化,以及与各种组件的接口,无论是设备的物理部件,还是软件元素,例如并行计算框架。
正如 dmckee 所指出的,对 c 的研究为整个编程提供了良好的基础,至少是过程编程。它也有实际应用,所以你教授的观点在这个时候有一些强有力的支持。但是,做!继续恭敬地挑战从您的教授和长辈那里获得的智慧,了解有时就像好的禅宗大师一样,他们将您带上一条道路,与其说是为了目的地,不如说是为了旅行/过程。
C 真的用于很多科学计算吗?
科学计算包含许多不同的事物,因此,许多不同的编程语言用于科学计算。
传统上,科学计算意味着高性能计算,其范围仅限于大多数线性代数和一些谱方法(例如 FFT),并且主要在 Fortran 中完成。从那时起,科学计算的广度得到了极大的扩展,许多人现在考虑将技术计算(如海量数据、图形绘制、原型制作)归于同一主题,而其他人则开始采用新形式的高性能计算,如符号计算。
Python、R、Mathematica 和 MATLAB 等语言通常用于技术计算。C、C++ 和 Fortran 等语言仍用于数字运算。像 OCaml 这样的语言用于大规模符号计算。
C在编程中被广泛使用。我们大多数程序员都曾经用 C 编写过代码,尤其是在我们上大学的时候。我猜这只是你的教授偏好:-)
作为为科学家和工程师构建软件的专业程序员,我可以说几乎我们所有的数值方法都是用 C 编写的。所以在我们的例子中,这当然是正确的。我们有大量的 C++ 和 Fortran。就性能而言,很难击败编码良好的 C 和良好的编译器。非常非常偶尔我们可能会参与组装。
但是世界已经发生了很大的变化。Python 是一门美妙的语言 - 恕我直言,最好的语言并且可以调用本机库。然后,R 又是一种源解释语言,但具有大量的数值方法库,全部编译为 C 或 C++。然后添加所有新的硬件加速方法,例如 openCL 和许多绑定...... C 或 Fortran 不再是唯一的答案。但是对于传统的 CPU 数字运算来说,C 和 ASM 是同类中最好的。
根据我在不同实验室和研究机构工作的经验,我想说学习一门计算机语言只会给你一个编程的基础和介绍。C 或 Java 将是一种适合作为介绍的语言,因此您的教授在一定程度上是正确的。
能够将您的知识以一种语言应用到另一种语言是在计算/开发工作环境中取得成功的关键。当您穿过不同的公司/研究所/实验室组时,您会发现他们每个人在语言/软件方面都有自己的偏好。能够快速学习新事物比试图记住一种特定语言的语法更重要。
当然,如果您要为项目选择一种语言,请选择具有您需要的库的 1。
是的,带有 MPI 的 ANSI C。
有时人们想使用“objective C”,这意味着他们将函数放入大类的方法中,并且它的每个示例都将在单独的核心上运行。请注意,这不是 C++,而是“带有对象的 C”。除了方法-对象模型外,没有使用任何 C++ 功能。这只是将相同的旧 C 包装到“理性对象模型”中,允许使用中间层等等。
上面的好例子:LAMMPS。
Charm++ 是另一种获得“现代方式的好旧 C”的好方法。
在其他科学语言的山上还有 LISP、Haskell 和其他元语言组。这是科学编程的另一个“软”世界,时间不是问题,而是答案的存在。