为什么Matlab使用C语言而不是Fortran语言编写?

8

你可能知道,Fortran是一种科学计算语言。然而,大多数著名的高级科学计算语言的核心都是用C语言编写的,而不是Fortran。为什么呢?


1
不想挑剔,但FORTRAN不是在科学计算中最著名的语言吗?还是我被困在20世纪70年代和80年代了?我确信所有现代Fortran编译器都是用C或C++编写的,并且已经使用了很多年。 - Fortyrunner
1
我甚至不想尝试解决这些评论所造成的问题。我认为他的意思是为什么MATLAB使用C编写,而不是Fortran。因为简单地说,Fortran不是这项工作的最佳工具。C更好。现在,Fortran编译器也是用C和一些较低级别的语言来进行高度优化编写。编译器是用什么语言编写的与该语言无关-重要的是使用该语言编写的程序解决问题所需的问题解决时间和运行时。 - Rook
对于科学问题,Fortran是低级语言的绝佳例子。Matlab则稍微高级一些,但往往速度较慢(免责声明:请谨慎阅读最后一部分)。 - Rook
我还没有足够的声望来标记这个问题为主观的,所以有其他人可以帮忙吗? - user447688
3
我强烈反对“主观”标签。在这个特定的主题中,Matlab选择C而不是Fortran并不是一个主观/个人的选择!如果其他人同意,我建议编辑标签以删除“主观”标签。 - Trevor Boyd Smith
显示剩余5条评论
6个回答

21

回答你最初的问题:Matlab最初是用Fortran写的。但Matlab的创始人Cleve Moler和他的伙伴在1983年做的第一件事情之一就是用C重新编写了整个Matlab应用程序:

Jack Little离开了咨询公司的工作,去Sears购买了一台新的COMPAQ便携式电脑。这台机器只有256 KB的内存和没有硬盘。Jack必须交换5-1/4英寸软盘来编译程序。Jack和Steve花了一年半的时间用C重新编写了MATLAB,并添加了他们构想中的新功能。(MATLAB和MathWorks二十年来的发展

我认为今天更相关的一个问题是:为什么他们在1983年转向使用C?

我猜测C可能有某些Fortran没有的特性,因此转换更多出于必要性和代码可维护性的考虑。

Fortran77缺少的一个杀手级特性是动态内存分配(动态内存分配仅在Fortran90中添加)。在我看来,克服这种唯一的限制将是一个可怕的交易破坏者。

编辑:

dmckee的答案对于为什么使用Fortran77会很痛苦有一个很好的解释。


2
@Trevor Boyd Smith,Cleve Moler或Steve Moler?你的回答的第一段提到了Cleve Moler和他的合作伙伴重写了MatLab,但在引用中却说是Jack和Steve。 - Geoffrey

18

基于经验的猜测:

内存管理。

Fortran(即当Matlab编写时存在的Fortran版本)不支持动态内存管理。这使得处理大型工作变得困难(例如,参见CERNLIB)。

CERNLIB通过在公共块中分配一个大数组,并为数组单元格实现类似malloc的(de)分配器来解决了该问题。虽然笨拙但有效:数组偏移量相当于指针,您可以继续使用...


2
那么CERNLIB基本上是将malloc()/free()的相同功能嵌入到Fortran77中了吗?为什么他们不使用C语言呢? - Trevor Boyd Smith
4
CERNLIB的部分代码可以追溯到20世纪60年代初。到了C语言时代,他们已经有了很多代码。我认为许多部分已经被重写了几次,但最大的问题是:物理学家。即使到了80年代,大多数物理学家仍然只会使用FORTRAN。 - dmckee --- ex-moderator kitten
3
@Trevor Boyd Smith - 我并不会说那是一个陨石。如今,大多数工程师和物理学家都很熟悉Fortran语言。在我的大学(航海建筑专业),我们学习了Fortran语言,有些人学习了Python和Matlab,但没有人学习C语言。C语言是计算机科学专业学生的语言,大多数工程师不使用它,除非他们对编程感兴趣(但这是他们个人的事情)。而且,坦率地说,就科学目的而言,Fortran仍然比C、Python或其他大多数语言更适合(Matlab也很好,但在性能方面存在一些缺点)——只是... - Rook
7
我讨厌恐龙。 你有一个由专家编写的Fortran库,总代码量为KLocs,已经存在40年了——你只是要将它转换为C语言。你能理解所有这些方程吗?所有舍入误差?所有边缘案例? 而且,你要在一种还没有矩阵或复数作为标准的语言中完成这个任务。 - Martin Beckett
2
@ldigas:在我的业务领域(粒子物理学)中,许多学生不再了解或学习Fortran。C++占主导地位,可能是因为它是ROOT语言。他们也不编写张量操作代码,只需引入一个强大的库即可。 - dmckee --- ex-moderator kitten
显示剩余7条评论

12

据我了解,Matlab是用一些混合语言编写的,包括但不限于C、FORTRAN、Java和Matlab本身。

我认为它在幕后使用最好的库,包括LAPACK(FORTRAN)、FFTW(C)等等,可能还有许多其他库。

我认为原始版本纯粹是由FORTRAN编写的,但随着它变得更加完善和商业化,他们毫不犹豫地选择适合每个部分的正确语言。我不怪他们-我很讨厌用FORTRAN编写解析器或GUI!


1
我甚至不愿意用C语言编写一个解析器。不过,你是正确的——早期版本是用Fortran编写的,后来它们在某个时候切换到了C语言(完全重写了整个程序)。 - Rook
Matlab运行在Java JRE之上。据推测,其中大部分要么是.m文件,要么是Java代码,除了那些被证明在本地代码实现时更快的时间关键性内容。我记得当他们转向Java版本时,速度变慢了,但现在JRE已经变得更快了,使用Java对象在MATLAB中绝对值得。 - Jason S
总有一天我会学会如何在Matlab中使用Java对象...总有一天。 - Trevor Boyd Smith

10
我希望在回答中加上以下声明 - 我对Fortran和Matlab一无所知。
然而,我认为您在问题中几乎已经回答了自己的问题。
为什么不使用科学语言编写内核。您应该使用最适合当前任务的语言。内核最好用C语言编写,因为它更适合处理底层任务,如内核(处理内存管理等)。
内核不是科学应用程序,因此您不会使用科学语言。
再次声明,我可能完全错误,但我认为这是一个高度逻辑的答案。

7
快速注释:计算软件包的内核不等同于操作系统的内核。在第一种情况下,内核是底层的计算引擎,用户通过更高级别的用户界面(例如MATLAB命令窗口或Mathematica笔记本界面)与其交互。 - las3rjock

3

Matlab最初是用Fortran编写的,它更像是一堆Fortran例程的包装器。那么问题来了,为什么要用C重写它呢?事实上,为什么Fortran输给了C和其他不太适合数值计算的语言?答案是Fortran在政治方面受到了严重打击。由于各种原因,标准委员会无法决定Fortran 77的替代品。所以,等到Fortran 90最终推出时,Fortran已经在很多方面输给了其他语言。现在这种情况已经得到了纠正。Fortran 2003是一种很好的语言,它非常适合数值计算,并且具有动态分配、快速io和面向对象式的构造、多态性、派生类型等特性。(Fortran 2008将更加出色)

现代Fortran并不是设计用来编写GUI界面的,但它被设计用来调用和被其他语言调用。因此,如果今天重复Matlab的练习,很可能数值部分会用Fortran编写,而用户界面则使用其他语言。


这是一个笔误吗?“由于各种原因,标准委员会可能决定” -> “不能决定”? - 463035818_is_not_a_number

3
您可以在Matlab的网站上观看视频,了解一些有关其起源的信息,具体位于首席科学家Cleve Moler的页面上。请参考链接

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接