正确使用PURE关键字Fortran

时间:2015-05-15 16:46:54

标签: fortran keyword fortran90 fortran95

我正在深入研究Fortran,我遇到了pure关键字,指定了没有副作用的函数/子例程。

我有一本书,由Chapman撰写的 Fortran 90/95 ,它引入了pure关键字,但奇怪的是没有提供“良好的编码实践”用途。

我想知道在他们的程序中应该如何使用这个关键字。只是环顾四周,对我来说很明显,大多数没有副作用的程序都没有必要包含pure关键字。

那么它最好用在哪里?只有在程序中,人们想完全保证没有副作用?或者也许在程序中,计划稍后转换为elemental程序? (由于elemental程序必须首先为pure。)

3 个答案:

答案 0 :(得分:12)

在某些情况下需要

PURE - 例如,在规范表达式中调用的过程或来自FORALLDO CONCURRENT构造的过程。在这些情况下,PURE需要使Fortran处理器在过程调用的顺序中具有灵活性,同时仍然具有来自特定代码段的合理确定性结果。

除了这些必要的案例之外,是否使用PURE基本上是一种风格问题,这有点主观。

使用PURE(无法在过程中执行IO,无法调用非PURE的过程)和好处(可以从上下文调用今天编写的纯过程)明天写的,需要一个纯粹的程序,因为PURE程序没有副作用,调用这样的程序的含义可能对代码的读者更清楚),两者之间的权衡取决于细节。

该标准可能会让Fortran处理器在评估表达式中的表达式和函数引用时有相当大的方法。它肯定会在某些方面限制程序围绕函数执行的副作用和函数参数的修改。对纯函数的要求与那些约束和那些约束一致,因此有些人使用大多数函数都是纯粹的样式。同样,它可能仍然依赖于细节,并且可能必须存在例外情况,例如C互操作性或与外部API的交互。

答案 1 :(得分:6)

正如chw21所建议的,PURE的主要动机是允许编译器更好地进行优化。特别是,函数缺少PURE将阻止由于未知副作用导致的并行化。请注意,PURE子例程与函数不同,可能有INTENT(INOUT)个参数,但仍存在副作用限制(并且PURE过程只能调用其他PURE过程。)

通过Fortran 2003,ELEMENTAL程序隐式PURE。 Fortran 2008添加了一个IMPURE前缀,可以与ELEMENTAL过程一起使用来禁用该方面。

答案 2 :(得分:0)

如果您尝试更改具有INTENT(IN)的变量,则无法编译。

纯函数只能有INTENT(IN)个参数,并返回一个仅依赖于参数的值。纯子例程可以修改INTENT(OUT)INTENT(INOUT)个参数,但同样只能基于参数的值。

在这两种情况下:相同的参数 - >同样的结果。

优点是它保证编译器可以在不改变程序行为的情况下交换执行顺序(以优化代码)。