我正在钻研Fortran而且我遇到了 pure
关键字指定没有副作用的函数/子例程。
我有一本书, Fortran 90/95 由S Chapman介绍 pure
关键字,但奇怪的是没有提供“良好的编码实践”使用。
我想知道如何在程序中使用这个关键字。只是环顾四周,对我来说很明显,大多数没有副作用的程序都没有必要包括 pure
关键词。
那么它最好用在哪里?只有在想要的程序中 全然 保证没有副作用?或者也许在计划转换为的程序中 elemental
程序以后? (如 elemental
程序必须首先 pure
。)
PURE
在某些情况下是必需的 - 例如,在规范表达式中调用的过程或来自 FORALL
要么 DO CONCURRENT
结构体。 PURE
在这些情况下,要求Fortran处理器在过程调用的顺序上具有灵活性,同时仍然具有来自特定代码段的合理确定性结果。
除了那些必要的案例,是否使用 PURE
或不是基本上是一种风格问题,这在某种程度上是主观的。
使用成本 PURE
(无法在程序中执行IO,无法调用不可执行的程序 PURE
)和好处(今天编写的纯程序可以从明天编写的上下文中调用,需要一个纯粹的过程,因为 PURE
程序没有副作用调用这种程序的含义可能对代码的读者更清楚),两者之间的权衡取决于具体情况。
该标准可能为Fortran处理器提供了相当大的方法,可用于评估表达式中的表达式和函数引用。它肯定会在某些方面限制程序围绕函数执行的副作用和函数参数的修改。对纯函数的要求与那些约束和那些约束一致,因此有些人使用大多数函数都是纯粹的样式。同样,它可能仍然取决于具体情况,并且可能必须存在例外情况,例如C互操作性或与外部API的交互。
正如chw21所建议的,主要动机是 PURE
是让编译器更好地优化。特别是缺乏 PURE
对于函数,将防止由于未知副作用导致的并行化。注意 PURE
与函数不同,子程序可能有 INTENT(INOUT)
争论,但仍有副作用的限制(和a PURE
程序只能打电话给其他人 PURE
程序。)
通过Fortran 2003, ELEMENTAL
程序是隐含的 PURE
。 Fortran 2008增加了一个 IMPURE
可以使用的前缀 ELEMENTAL
禁用该方面的过程。
如果您尝试更改具有的变量 INTENT(IN)
,它不会编译。
纯粹的功能只能有 INTENT(IN)
参数,并返回仅依赖于参数的值。纯子程序可以修改 INTENT(OUT)
和 INTENT(INOUT)
参数,但同样,仅基于参数的值。
在这两种情况下:相同的参数 - >相同的结果。
优点是它保证编译器可以在不改变程序行为的情况下交换执行顺序(以优化代码)。