Can*_*son 1 c performance fortran pointers fortran77
我的理解是Fortran(90之前)非常快,部分原因是它不允许指针别名(因此允许更好的编译器优化).但是,我也知道C语言语言中的指针允许程序员编写极其快速的代码.
我不明白为什么这两种语言因为相反的原因而快速.任何人都可以了解正在发生的事情吗?
提前致谢.
讨论语言速度,特别是优化效率,实际上是误导性的.
让我们开始说每种语言都是为了简化编程场景的某些特定方面而创建的,正因为如此,程序员的第一个目标是正在编写的应用程序的正确语言选择.
这是第一点,在此之后考虑到现在编译器编程使用标准化工具和定义良好的流程,这些流程从源代码转换为中间表示,其中包含优化器的编译链的其余部分.对于几乎所有语言,后者恰好相同,因此期望相同的结果是现实的.
实际的例子可以看出考虑看看漫编译器家庭作为GCC的MOS https://gcc.gnu.org/,LLVM https://llvm.org/,甚至是.NET 的https://en.wikipedia. org/wiki/.NET_Framework.
因此,可以产生影响的起点是语言如何以中间形式翻译,从而允许更好地呈现编译器链的优化阶段.这不仅取决于翻译阶段的质量,还取决于语言的抽象级别.
我们通常认为降低语言的抽象,即机器汇编程序,优化越好.那是绝对错误的!除非你是一个优秀的汇编程序员,否则无法对一个非常糟糕的汇编代码编写工作.
相反,正是高抽象级别同意编译器以更有效的方式转换代码并以最可行的形式将其呈现给优化器.
Fortran和C处于非常不同的抽象层次,第一个足够严格意味着标准,并且由于这个原因,众所周知和预先优化的代码,第二个是广泛传播的语言,可以触及非常低的级别,使用指针甚至内联汇编程序,或使用时的高级别,不会滥用任何副作用.
无论如何,最后的C99-C11标准引入了更多的语言限定符,允许使用限定符来对齐一些众所周知的缺陷,例如不透明指针(https://en.wikipedia.org/wiki/Opaque_pointer)restrict
.在当前的编译器中,现代CPU(SIMD,SSE2等)上可用的流指令的矢量化,使用也大大扩散.即对于X86-64平台,英特尔C/C++编译器是最有效的编译器/优化器.
那么我们对未来的期望呢?随着编译器技术的进步,我们应该期望任何差异的渐近归零.
为了进一步阅读,您还可以在计算机科学堆栈交换中找到一个很好的答案:https://scicomp.stackexchange.com/questions/203/what-makes-fortran-fast