C 和 Fortran 中指针在确定程序速度方面的作用

Role of pointers in C and Fortran in determining program speed

我的理解是 Fortran(90 之前)非常快,部分原因是它不允许指针别名(因此允许更好的编译器优化)。但是,我也知道 C 系列语言中的指针可以让程序员编写出极其快速的代码。

我不明白为什么这两种语言速度快的原因相反。任何人都可以阐明正在发生的事情吗?

提前致谢。

讨论语言速度,特别是优化效率,确实具有误导性。

让我们开始说,每一种语言都是为了简化编程场景的某些特定方面而创建的,正因为如此,程序员的首要目标是根据正在编写的应用程序的功能选择正确的语言。

这是第一点,考虑到现在编译器编程使用标准化工具和定义明确的流程,从源代码到中间表示的转换开始,中间表示将作用于编译链的其余部分包括优化器。后者恰好对几乎所有语言都是相同的,因此期望相同的结果是现实的。

实际例子可以看一看作为 GCC 的 mos 扩散编译器家族 https://gcc.gnu.org/, LLVM https://llvm.org/, or even the .net https://en.wikipedia.org/wiki/.NET_Framework

因此,可能有所不同的起点是语言如何以中间形式翻译,以便更好地呈现给编译器链的优化阶段。这不仅取决于翻译阶段的质量,还取决于语言的抽象级别。

我们通常会认为语言的抽象程度越低,即机器汇编程序,优化就越好。 那是绝对错误的!除非你是一个优秀的汇编程序员,否则对一个非常糟糕的汇编代码编写没有任何帮助。

恰恰相反,高抽象级别同意编译器以更有效的方式翻译代码,并以最可行的形式将其呈现给优化器。

Fortran 和 C 处于非常不同的抽象级别,第一个足够紧密以暗示标准,因此是众所周知的和预先优化的代码,第二个是广泛传播的语言,可以触及非常低的级别,使用指针甚至内联汇编器,或者在不滥用任何副作用的情况下使用高级。

无论如何,最新的 C99-C11 标准引入了更多的语言限定符,这些限定符也允许对一些众所周知的缺陷进行对齐,例如 不透明指针 (https://en.wikipedia.org/wiki/Opaque_pointer) 使用 restrict限定词。在当前的编译器中,现代 CPU(SIMD、SSE2 等)上可用的流指令的矢量化和使用也得到了广泛传播。 IE。对于 X86-64 平台,Intel C/C++ 编译器是最高效的 compiler/optimizator.

那我们对未来有什么期待呢?随着编译器技术的进步,我们应该期待任何差异的渐近归零。

要进一步阅读,您还可以在计算机科学堆栈交换中找到一个很好的答案:https://scicomp.stackexchange.com/questions/203/what-makes-fortran-fast