gpt4 book ai didi

fortran - Fortran 编译器是否强制或假定 PURE 关键字为真?

转载 作者:行者123 更新时间:2023-12-02 16:06:03 25 4
gpt4 key购买 nike

是否要求符合 Fortran 90+ 的编译器始终拒绝编译标记为 PURE 的函数,如果函数违反了 PURE 的要求?

换句话说,我可以确定(假设编译器没有错误),如果我将任意函数标记为 PURE,将会出现编译时错误而不是 UB?

将此与 C++ 中的 restrict 进行对比,在 C++ 中,程序员向编译器 promise ,给定的指针/引用永远不会别名。编译器在这个假设下完成它的工作,如果在任何时候指针被别名,你就会在运行时得到 UB。

最佳答案

在 Fortran 2018 中,列出的所有适用于“纯”子程序的约束都是所谓的 numbered constraints (F2018,15.7 第 2 页)。这意味着编译器需要能够诊断违反任何此类约束的情况。 (实际上,编译器没有什么动机选择让程序员摆脱困境并允许此类违规行为。)不需要在编译时(而不是运行时)诊断对编号约束的违反,尽管通常是这样。

但是,适用于“纯”子程序的约束不一定是使子程序在纯计算机科学意义上纯化所需的约束。


还有一个补充问题也可以在这里解决。我提到的约束适用于纯子程序,但这些并不是程序员可以将过程标记为纯子程序的唯一地方。

纯子程序的约束适用于我们想要编译的地方:

function f(x, y, z)
...
end function

添加 PURE 前缀来代替

pure function f(x, y, z)
...
end function

是预期对约束进行评估的地方:使 PURE 不适合 f 的内容会引起投诉。

不过请考虑:

subroutine s(f)
interface
pure function f(x,y,z)
...
end function f
end interface
end subroutine s

在这里我们可以将 PURE 前缀添加到虚拟过程的接口(interface) block 。但是我们在这里没有定义子程序,因此编号约束不适用:我们不能指望编译器检查实际参数过程是否是纯的。没有编号约束(或语法规则)表明接口(interface) block 必须正确才能最终使用。这是我们作为程序员的责任,编译器可能会相信我们会认真对待这一责任。您的编译器会很好地检查和挑选许多情况,但它不必考虑我们的 wilful desire to obfuscate。 .

关于fortran - Fortran 编译器是否强制或假定 PURE 关键字为真?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69363752/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com