正确使用 PURE 关键字 Fortran
Proper use of the PURE keyword Fortran
我目前正在研究 Fortran,我遇到了指定 functions/subroutines 没有副作用的 pure
关键字。
我有一本书,Fortran 90/95,作者 S Chapman,其中介绍了 pure
关键字,但奇怪的是没有提供 "good coding practice" 用法。
我想知道在他们的程序中应该多自由地使用这个关键字。环顾四周,我很明显发现大多数没有副作用的过程都没有必要包含 pure
关键字。
那么它最好用在什么地方呢?只有在程序中才能完全保证没有副作用?或者也许在程序中计划稍后转换为 elemental
程序? (因为elemental
程序必须先pure
。)
正如 chw21 所建议的,PURE
的主要动机是让编译器更好地优化。特别是,函数缺少 PURE
会由于未知的副作用而阻止并行化。请注意,PURE
子例程与函数不同,可能有 INTENT(INOUT)
个参数,但仍然存在副作用限制(并且 PURE
过程只能调用其他 PURE
过程.)
从 Fortran 2003 开始,ELEMENTAL
过程隐式 PURE
。 Fortran 2008 添加了一个 IMPURE
前缀,可以与 ELEMENTAL
程序一起使用来禁用该方面。
PURE
在某些情况下是必需的 - 例如,在规范表达式中或从 FORALL
或 DO CONCURRENT
构造中调用的过程。 PURE
在这些情况下需要为 Fortran 处理器提供过程调用排序的灵活性,同时仍然从一段特定的代码中获得合理的确定性结果。
除了那些需要的情况,用不用PURE
基本上是风格问题,有点主观
使用PURE
有成本(无法在过程中进行IO,无法调用不是PURE
的过程)和好处(今天编写的纯过程可以从明天写的上下文需要一个纯过程,因为 PURE
过程没有副作用调用这样一个过程的含义对于代码的 reader 可能更清楚),两者之间的权衡两者要看具体情况。
该标准可能会为 Fortran 处理器提供相当大的回旋余地,使其可以评估表达式和表达式中的函数引用。它肯定会以某种方式限制程序围绕函数执行和函数参数修改的副作用。对纯函数的要求与该回旋余地和那些约束一致,因此有些人使用大多数函数都是纯函数的风格。同样,它可能仍然取决于具体情况,并且对于 C 互操作性或与外部 API 的交互之类的事情可能必须存在例外情况。
我目前正在研究 Fortran,我遇到了指定 functions/subroutines 没有副作用的 pure
关键字。
我有一本书,Fortran 90/95,作者 S Chapman,其中介绍了 pure
关键字,但奇怪的是没有提供 "good coding practice" 用法。
我想知道在他们的程序中应该多自由地使用这个关键字。环顾四周,我很明显发现大多数没有副作用的过程都没有必要包含 pure
关键字。
那么它最好用在什么地方呢?只有在程序中才能完全保证没有副作用?或者也许在程序中计划稍后转换为 elemental
程序? (因为elemental
程序必须先pure
。)
正如 chw21 所建议的,PURE
的主要动机是让编译器更好地优化。特别是,函数缺少 PURE
会由于未知的副作用而阻止并行化。请注意,PURE
子例程与函数不同,可能有 INTENT(INOUT)
个参数,但仍然存在副作用限制(并且 PURE
过程只能调用其他 PURE
过程.)
从 Fortran 2003 开始,ELEMENTAL
过程隐式 PURE
。 Fortran 2008 添加了一个 IMPURE
前缀,可以与 ELEMENTAL
程序一起使用来禁用该方面。
PURE
在某些情况下是必需的 - 例如,在规范表达式中或从 FORALL
或 DO CONCURRENT
构造中调用的过程。 PURE
在这些情况下需要为 Fortran 处理器提供过程调用排序的灵活性,同时仍然从一段特定的代码中获得合理的确定性结果。
除了那些需要的情况,用不用PURE
基本上是风格问题,有点主观
使用PURE
有成本(无法在过程中进行IO,无法调用不是PURE
的过程)和好处(今天编写的纯过程可以从明天写的上下文需要一个纯过程,因为 PURE
过程没有副作用调用这样一个过程的含义对于代码的 reader 可能更清楚),两者之间的权衡两者要看具体情况。
该标准可能会为 Fortran 处理器提供相当大的回旋余地,使其可以评估表达式和表达式中的函数引用。它肯定会以某种方式限制程序围绕函数执行和函数参数修改的副作用。对纯函数的要求与该回旋余地和那些约束一致,因此有些人使用大多数函数都是纯函数的风格。同样,它可能仍然取决于具体情况,并且对于 C 互操作性或与外部 API 的交互之类的事情可能必须存在例外情况。