我正在阅读物理科学数值分析课程中的一些笔记,我的印象是,由于内存的隐式声明和对内存使用的控制,仍然有人更喜欢 Fortran 77 而不是新版本。但是我对 Fortran 不是很熟悉,我的问题是为什么看起来即使是年轻的科学家在编码数值线性代数方法时也更喜欢 Fortran 77 我的问题是为什么?与最新版本相比,使用 Fortran 77 有真正的优势吗?
为什么有些人仍然喜欢 fortran 77 而不是新版本?
我认为Fortran 77 与较新版本的 Fortran 或事实上在科学计算中广泛使用的任何其他编程语言相比没有任何优势,这通常是正确的。
仍然使用它的原因是因为有数百万行代码是用 Fortran 77 编写的。现在回想一下,一个优秀的程序员需要一年才能编写 20,000 行代码。因此,将现有代码转换为其他编程语言并不是一种选择。即使只是将 Fortran 77 重构为更新的 Fortran 样式也是不可行的。所以人们处理它。
一般来说,从语言中删除的特性要么是没有意义的,要么是危险的,所以我绝对建议你编写新代码以在以后的标准下编译,即使你使用的是旧标准支持的语法。然而,仍然有一些动机去编写“类似于 FORTRAN 77”的代码的一个关键领域是考虑与 C 的互操作性,因为它通常是用于数值方法的库代码。尽管 ISO C 绑定很好(我强烈建议任何人编写可互操作的 Fortran 代码来学习和使用它们,而不是使用一个编译器的技巧),但仍然经常需要从一侧显式传递数组的大小和形状的栅栏到另一个。
这样做的最终结果是大型、令人困惑的函数接口等,而不是后来更面向对象的语言标准所青睐的干净、易于理解(并且正确)的方法。我希望这会在未来得到改善,最新的关于传递数组描述符 C 的工作正在实施,但它似乎还没有。
最后,令人欣慰的是,FORTRAN 77 是有效 Fortran 90 的子集,因此该代码仅比新时尚落后四分之一个世纪,而不是三分之一。
1) 长期以来,显式编写循环比使用数组语法更有效,因为数组语法使用了很多数组的中间副本。今天,这不再是真的了,但是许多 Fortran 实践者(比如我!)由于性能问题已经养成了避免使用数组语法的习惯。
2)使用指针会使代码更难被编译器优化,F77中不存在指针。
3) 当所有数组维度在编译时已知时,编译器可以进行比数组可分配时更多的优化。因此,使用静态大小的数组也可以提高性能。例如,多维数组中的地址计算可以在编译时完成,避免大量的整数乘法。
4) 通常,F77 样式使得编译器对循环将执行多少个循环有更多提示,因为参数中给出了许多尺寸变量。当一切都是动态的时,这些信息就会丢失。
5) 一段时间以来,dot_product众所周知matmul,使用通常的编译器会产生低效的二进制代码。幸运的是,这不再是真的了。
总而言之,我想说 F77 是如此古老和简单,以至于编译器可以生成超快速的二进制文件。但是对于现代 Fortran,语言更复杂,因此更难优化,编译器需要一些时间才能赶上。