Fortran 编译器是否强制或假定 PURE 关键字为真?
Is the PURE keyword enforced or assumed to be true by a Fortran compiler?
是否要求 Fortran 90+ 兼容编译器始终拒绝编译标记为 PURE 的函数,如果函数违反了 PURE[=20= 的要求]?
换句话说,我可以确定(假设编译器没有错误),如果我标记任意函数 PURE,则会出现编译时错误UB 的?
将此与 C++ 中的 restrict 进行对比,在 C++ 中,程序员向编译器承诺,给定的 pointer/reference 永远不会别名。编译器在这个假设下完成它的工作,如果在任何时候指针被别名,你会在运行时得到 UB。
在 Fortran 2018 中,列出的所有适用于“纯”子程序的约束都是所谓的 (F2018,15.7 p.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前缀添加到虚拟过程的接口块中。但是我们在这里没有定义子程序,因此编号约束不适用:我们不能指望编译器检查实际参数过程是否是纯的。没有编号约束(或语法规则)表明接口块必须正确才能最终使用。这是我们作为程序员的责任,编译器可能会相信我们会认真对待这一责任。您的编译器会很好地检查和收集许多情况,但它不必考虑我们的 .
如果你自己写一个Fortran函数并标记pure
那么编译器必须检查它是否符合要求。但是,有许多选项可以让您欺骗编译器并在接口块中承诺纯函数的情况下滑动非纯外部(甚至非 Fortran)函数。在这种情况下,它确实是一个承诺,即使持有它是标准所要求的并且违反它会使 prohram 不符合标准,因此不符合 Fortran。
是否要求 Fortran 90+ 兼容编译器始终拒绝编译标记为 PURE 的函数,如果函数违反了 PURE[=20= 的要求]?
换句话说,我可以确定(假设编译器没有错误),如果我标记任意函数 PURE,则会出现编译时错误UB 的?
将此与 C++ 中的 restrict 进行对比,在 C++ 中,程序员向编译器承诺,给定的 pointer/reference 永远不会别名。编译器在这个假设下完成它的工作,如果在任何时候指针被别名,你会在运行时得到 UB。
在 Fortran 2018 中,列出的所有适用于“纯”子程序的约束都是所谓的
但是,适用于“纯”子程序的约束不一定是使子程序在纯计算机科学意义上纯的约束。
还有一个补充问题也可以在这里解决。我提到的约束适用于 纯子程序 ,但这些并不是程序员可以将过程标记为纯子程序的唯一地方。
纯子程序的约束适用于我们想要编译的地方:
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前缀添加到虚拟过程的接口块中。但是我们在这里没有定义子程序,因此编号约束不适用:我们不能指望编译器检查实际参数过程是否是纯的。没有编号约束(或语法规则)表明接口块必须正确才能最终使用。这是我们作为程序员的责任,编译器可能会相信我们会认真对待这一责任。您的编译器会很好地检查和收集许多情况,但它不必考虑我们的
如果你自己写一个Fortran函数并标记pure
那么编译器必须检查它是否符合要求。但是,有许多选项可以让您欺骗编译器并在接口块中承诺纯函数的情况下滑动非纯外部(甚至非 Fortran)函数。在这种情况下,它确实是一个承诺,即使持有它是标准所要求的并且违反它会使 prohram 不符合标准,因此不符合 Fortran。