现代语言中带有FORTRAN的优点?

12

我最近一直在使用FORTRAN 77,虽然一开始有所保留,但现在我看到了这门语言的一些优点。它是:

  • 简单易学(没有面向对象或函数式编程的复杂性)
  • 易于阅读
  • 在数值计算方面运行速度飞快

这些特点自然吸引那些只想让电脑迅速给出答案的非程序员工程师和科学家。但由于其年代久远和一些基本假设的限制,它也有很多局限性。我对后续版本Fortran中一些增加的功能非程序员是否能轻松理解持怀疑态度。

是否有一种现代化的语言,像FORTRAN一样简单明了、在数学应用方面同样快速,但更不受限制?还是说答案是Fortran 90、95、2003……等等?


1
不要完全相信我的话,但我认为F#的目标受众包括工程师/科学家。 - ChaosPandion
1
德鲁斯博士的风格简单易懂,但是一旦你开始阅读更长的文本,你可能会发现不同的风格更为合适。用德鲁斯博士的风格写成的《罗密欧与朱丽叶》将无法阅读,一个庞大而复杂的代码库也是如此。另一方面,我现在正在考虑重新编写《罗密欧与朱丽叶》——也许我对那个故事的看法是错误的... - Bill K
你可能是有道理的,@S.Lott;把它提交为答案,至少会得到投票。 - JasonFruit
顺便问一下,你在“基于一些基本假设的限制”下是什么意思? - Rook
1
@JasonFruit - 也许吧。但请注意,字符串处理并不是Fortran用户的重中之重。从来都不是。曾经有一些压力要在这个领域引入一些东西...但其他功能被投票为更相关。然而,大多数这样的操作人们会找到一种方式来完成...只是与其他编程语言略有不同。 - Rook
显示剩余6条评论
12个回答

17

那么答案是Fortran 90、95、2003吗?

是的,大多数编译器支持的Fortran 95是您要寻找的语言。但是,除了不必要的面向对象编程支持(从您的角度来看),Fortran 2003还具有一些重大改进,这可能会很有用。Fortran 2003标准的编译器支持情况


我相信gfortran和英特尔在它们的新版本中“修正”了一些列表中的问题。 - Rook

10

我对于这里的共识,即选择现代化的Fortran,感到惊讶,但我勉强同意。

尽管存在缺陷,但Fortran是唯一一个专门为科学编程而设计的语言。科学编程相比于例如Web服务器来说更加微妙(每行代码)且结构不那么复杂,因此需要不同的工具。例如,垃圾回收几乎从来不适用于解决2D / 3D PDE等大规模问题,因为我们的主要数据结构都是固定的。

任何没有将多维数组作为一流对象的编程语言都可以立即被排除在科学编程之外,这包括所有基于C的语言。任何本质上极其慢速的编程语言,如Java,也可以立即被排除。任何专有且需要数千美元授权费用的编程语言,如Matlab,也可立即被排除。

Python及相关语言适合原型设计,绘图简单,并且一旦程序能够运行,就可以使用编译语言编写数值核心以提高速度。但它仍然存在真正数组的缺乏(Numpy不错但不够好),并且运行速度较慢。

顺便说一句 - 永远不要购买《Numerical Recipes》系列书籍。它们是垃圾,它们推荐的算法已经过时,而且代码从糟糕到错误不等。最好参加真正的数值算法课程(在线上有很好的课程),或购买真正的数值算法书籍,并且千万不要从书中输入代码以执行线性代数或其他操作;使用业界优秀的库。


10

嗯,我是一名非程序员工程师(不管这意味着什么; 我明白它意味着与计算机科学的接触不多),...

在一定程度上延续了JasonFruit对S. Lott答案的评论:

是的,标准从F90到2003年增加了许多功能。但“问题”(如果可以这样称呼)是,许多使用Fortran的人并不知道它,只知道他们需要的基本功能。这在某种方式上既是福音也是诅咒。他们从未学过它,也没有读过有关它的书籍 - 他们只是边学边用。这种方法当然可以工作一段时间(如果你将程序结构简单化,像许多人已经做了数个世纪,并具有某种心理纪律,这种方法可以持续一生/整个职业生涯),但过一段时间后,它开始显示出它的劣势。例如,尝试遵循在comp.lang.fortran最近的讨论中的一些功能测试你的知识。

所以,拿一本好书(许多人推荐三本书中的一本作为初学者:a) Chapman J. Stephen's b) Maine或c) Metcalf,Reid和Cohen(称为“M.R.C.书”) - 在阅读后,“更晦涩难懂”的特性不仅变得更清晰,而且“显而易见”(以一种方式; 这确实是更好的方式 - 为什么我之前没想到呢?)。

那个问题已经得到解决。现在,另一个问题肯定会出现,即Fortran现在是否值得学习?(相信我,这总是会发生的 :)。这个问题已经被讨论了很多次,所以我将直接引用我的帖子我早期的帖子(你需要向下滚动一点)来比较其他语言中的一些问题。
最后一个问题,在大多数情况下,这是所有这些问题的原因,人们对Fortran的看法,重点在于个人观点!一般来说(我们可以把这个论坛作为我们分析的一个很好的样本),Fortran并不是那么好。少数人喜欢它[跟随在这个论坛上标记为fortran的问题一个月,你会很快知道他们是谁。顺便说一下,从你的名字频繁出现的频率来看,你很快就成为这个俱乐部的成员了:) ],大多数人要么漠不关心,要么憎恨它,出于纯粹的无知(通常是将F66与今天的语言进行比较),或者出于自己的原因。现在,如果我们将这些人和一般人进行比较,通过简单的计算,结果肯定会很糟糕。如果你只采访传统工程师,结果会有很大不同。
那就是全部内容了。
哦,还有一件事——Fortran始终主要面向工程师,而不是数学家。它更适合解决大型系统的问题,而不是计算pi到ka-zi-llionth小数位。我不知道这是你问题中的一个打字错误,还是有意为之。对于纯粹的数学应用(在数学家的经典意义上),如果我是该领域的一员,我可能会选择Mathematica吧?或者Pascal(我不知道为什么总是Pascal;但这似乎在那些家伙中非常流行)。

好的观点;当我说“数学应用程序”时,我应该写成“计算密集型应用程序”。 - JasonFruit
4
Fortran的好处不就在这里吗?你完全不需要在comp.lang.xx上花费大量时间来学习最新的偏特化模板细节,也不用为了完成实际的工作而使用非虚拟lambda函数! - Martin Beckett

6
对于你的问题,我认为kemiisto的答案是正确的,但需要注意Idigas所指出的限制。
话虽如此,我发现我的一些数值代码越来越多地涉及FTP、Web和更接近图形的东西。虽然另一个答案中提到了MATLAB,但我写的越来越多的是Python(带有NumPy),需要速度时再调用Fortran。我几乎肯定不会用这种方式编写整个系统(例如整个数值天气预报模型),但在许多方面它确实可以让我拥有最好的两个世界。

5

那答案是Fortran 90,95,2003……吗? 是的。对于科学计算而言,Fortran >=90消除了FORTRAN 77的限制。学习如何使用可分配数组以获得动态大小的数组。学习如何使用模块来组织您的过程和变量,并轻松提供实参和虚参之间的自动一致性检查。从FORTRAN 77开始,您可以逐渐学习Fortran 90/95/2003,并使用您认为有用的任何功能。您不必学习OO功能,并且可以忽略该语言部分,直到它可能对您提供帮助。

我推荐Metcalf,Reid和Cohen的书。


4
你可能正在看MATLAB。许多工程本科生学习它,所以我认为非程序员也可以理解。
如果你想变得更加专业,请看J

5
J是一个可怕的建议。他的一个标准是“易于阅读”。我想不出有哪种语言更难阅读了。 - Turtle
2
@Turtle:你说得对。我那时候说话有点糊涂。我也很惊讶它被点赞了三次 :P - kizzx2
Matlab确实是本科生和许多人的不错选择;它有很多好的特性,而且它的图形能力在许多情况下都非常实用。但是,就像每个“优点”都有一个“缺点”一样,它也存在一些历史发展问题。对我来说,在使用它时(某些方面仍然如此),较大程序的组织、有时不良的文档(在某些问题上不正确)以及向后不兼容性(再加上它是一种/单一公司语言/ -> 担心)是问题所在。 - Rook
只是为了避免误解,我仍然认为它在某些领域(例如快速原型设计)非常出色。 - Rook

2
我认为Fortran 95应该是您的首选,它看起来更加现代化,并且大大扩展了Fortran 77。大多数编译器并不完全支持Fortran 2003标准。Fortran的巨大优势在于每个数学问题(如寻找根、矩阵乘法、特征值问题等)都有一个优化的子程序。其他人提到了遗留库,lapack只是其中一个非常强大的例子。Fortran的一个主要缺点是没有人在现实世界中使用它。
我认为最好的书是 "Fortran90/95 for Scientists and Engineers"。
当然,所有其他建议也是有效的,但Matlab不是免费的,而Fortran是免费的。 Python是免费的,并且通过额外的包(例如Numpy和Scipy)支持许多科学应用程序。然而,当涉及到数字性能时,Python相对较慢。它可能是适用于不需要大量计算能力的小项目的良好选择。语法非常易于理解。
当然,C也是免费的选择,并且有很多(不断更新的)科学库可用。然而,就可读性而言,无法与Fortran相媲美。Fortran很好地设置了向量和数组。 C++是C的超集,因此它肯定也是一种可能的选择。然而,对于您要解决的问题,这可能是一种过于复杂的语言。科学C ++库的数量相当有限。有一些库,但它们无法击败Fortran版本(或者仅仅是那些的包装器)。对于非常大的项目来说,这可能是一个非常好的选择,但世界上最快的计算机上运行的一些非常大的程序是用Fortran编写的。 C ++绝对值得学习,因为它用于广泛的现实世界应用程序。
当然还有其他语言或工具,但我认为这些是跨科学领域中最常用的。

1

如果你真的对使用Fortran感到兴奋,那么你可以考虑使用Fortran for Microsoft.NET。这个项目的理念是,它允许你在利用公共语言运行时(CLR)的托管代码环境的同时,使用Fortran语言


4
或许我的问题有些愚蠢,但是CLR如何帮助非程序员科学家呢?(注:CLR是公共语言运行时,Common Language Runtime的缩写) - Federico klez Culloca
2
我猜测,但垃圾回收会非常有帮助。 - Turtle
1
@klez 如果你曾经在一个受限制的库中工作过,你可能会知道这一点。CLR和Java的运行时支持数千种Fortran编译器无法想象的操作。当需要创建GUI、进行简单的图形绘制、进行任意精度计算以及实现真实世界数据收集能力时,这些都将极大地有益于非程序员开发软件来解决真实世界的“科学”问题。 - Bill K
你不必成为CLR专家就能使用CLR并获得其好处。F#在学术/研究界已经广受欢迎,它编译成与C#和VB.NET相同的IL代码运行在CLR上。如果OP喜欢Fortran的好处,但想要在现代环境中运行它,那么针对.NET的Fortran似乎是一个很好的选择。如果你愿意,你甚至可以用Fortran编写自己的“数值计算”库,并在诸如WinForms或控制台应用程序等易于使用的GUI框架中使用它们。这个想法只是众多选项之一。 - Ben McCormack

0

我最近使用了很多Matlab,我可以看到它的好处。是的,它因为是一个解释性语言而慢,但它的矩阵算法很快。我喜欢它就是因为这种行为。for循环的缓慢和矩阵操作的高效鼓励你更数学化地思考,而不是坚持循环导向的编程。但我同意Matlab可能被忽略,因为它不开源。

目前,我期待Julia语言。它深受Matlab的启发,只是它希望更快。此外,它具有静态类型,也是一个非常大的优势。但是Julia还很年轻,所以不要指望它已经满足了所有您的需求。


0

@S.Lott:无法想象像科学家这样的Fortran用户,不得不转换并且放弃他们所有的Fortran工作... :S OP正在寻找有关新内容的输入...

给OP:

你是否阅读了维基百科上有关Fortran的更改,针对2003版本,允许与C进行互操作性,所以也许S.Lott是有道理的,或许可以逐步地将一些东西移植过来,或者编写一个C包装器来调用Fortran模块?我会从维基百科页面中引用以下内容...

与C编程语言的互操作性。


5
现代Fortran比C要好得多。因此,建议将某些代码转移到C是至少不好的建议。 - Wildcat
1
是的,我已经阅读了自1990年以来的更新内容,并对其中一些适合非程序员的内容持怀疑态度 --- 对象导向?递归?指针? - JasonFruit
1
@S.Lott:我是从金钱的角度来谈论的。科学家们能否承担得起放弃他们所有的代码库并经历一些密集课程来学习另一种语言...而不是用你的话来说是你无法想象或者不可能...明智点! - t0mm13b
2
@S.Lott:好的,让我们把问题放在你身上——你怎么知道现有的代码(无论是否缺乏发布指标等)可以重写成C语言——你是如何知道的?OP没有给出任何明确的指示——但是我能理解你的观点,就像我希望你也能理解我的观点一样!在将代码库重写为C之前,这些需要首先考虑到……为什么每个人都那么急于跳进来说“用C语言重写可能是改进的最佳方式”,而不看其他角度呢? - t0mm13b
2
@S.Lott - 我看到你在讨论中很明智,将实际方面放在一边(直到变得纯理论化,唯一的目标是赢得争论)。不幸的是,我几十年前就放弃了那种挑衅游戏。 - Rook
显示剩余12条评论

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