我总是假设fortran将“通过引用”实体传递给伪参数。然后我得到了这个答案(答案的实际论点是相关的,但不是这个)
标准从未指定和, 确实走了很多路 避免这种说明。虽然 你的是一个常见的误解,它 即使在大多数情况下也不严格准确 较旧的编译器,尤其是 优化开启。一个严格的 传递参考会杀死许多人 常见的优化。
根据最近的标准, 传递参考只是 在某些情况下不允许。标准 不会在其中使用这些词语 规范性文本,但也有一些东西 实施起来是不切实际的 通过引用传递。
当你开始进入事物时 像指针一样,假设的错误 一切都是通过参考传递的 将开始使自己更加明显 比以前。你必须放弃它 会有误解或很多事情 让你困惑。
我认为其他人已经回答了 其余的职位充分。还有一些 解决了上述问题,但我 我想强调它。
根据这个答案,标准中没有任何内容指定数据如何从调用者传送到被调用者。实际上,这应该如何解释实际使用它(不管编译器如何实现标准的实际效果),特别是在涉及intent()规范时?
修改:我想澄清一下我的问题。我想要了解的是标准期望您在执行呼叫时如何工作。鉴于用于传递实体的实际编译器策略未被标准定义,原则上(根据标准)不能期望将参数传递给函数实际上将表现为“传递引用”,其所有相关的副作用,因为这种行为是编译器和优化相关的。因此,我认为无论实际的实施策略如何,标准都会为您提供必须遵循的编程风格。
答案 0 :(得分:3)
是的,那是真的。 Fortran标准没有为不同的INTENT属性指定精确的evaluation strategy。例如,对于使用INTENT(OUT)的伪参数,某些Fortran编译器可以使用call-by-reference或call-by-copy-restore评估。
但我不明白为什么你真的需要知道使用哪种评估策略?是什么原因?我认为Fortran做对了。人类关注的是(高级别)论证意图,而计算机关注的是(低级别)评估策略。 “将人类和计算机上的东西呈现给人类的东西。” N. Wiener
我认为该标准包含有关不同INTENT属性使用的足够信息。 Final Committee Draft of Fortran 2003 standard的部分“5.1.2.7 INTENT属性”(PDF,5 MB)是一个很好的起点。
答案 1 :(得分:2)
正如其他人所说,只要它正常工作,你就不必知道编译器是如何工作的。 Fortran> = 90允许您指定参数的目的:输入,输出或两者,然后编译器负责传递参数。只要编译器正确实现,以便双方(调用者和被调用者)使用相同的机制,程序员为什么要关心?因此Fortran标准试图不限制编译器编写者如何实现编译器,允许他们按照自己的意愿进行设计和优化。
在编程风格方面,确定过程参数的用途,并用适当的意图声明它们。然后,例如,如果您不小心尝试修改过程中的intent(in)参数,编译器将发出错误消息,以防止您犯这个错误。它甚至可以在发出目标代码之前执行此操作,因此实际的参数传递机制与强制执行该语言的要求无关。
C是一种较低级别的语言,程序员需要根据各种原因选择传递值或引用。但是对于诸如科学编程之类的问题,这是必须控制的不必要的方面。它在嵌入式或设备驱动程序编程中非常重要。
如果有必要控制参数传递机制的原因,例如与另一种语言的接口,Fortran 2003提供了ISO C Binding(已经广泛实现)。有了这个,你可以匹配参数传递的C方法。
答案 2 :(得分:1)
我不确定我理解你的问题,但看待事物的一种方式是,只要有人编写符合标准的代码,就不需要关心如何实现参数传递。编译器确保(当然,禁止编译器错误)参数以符合标准的方式传递。
现在,如果你玩耍技巧,例如使用C interop等,比如通过比较参数地址,您可以确定编译器是否使用传递引用,copy-in / copy-out或某些特定情况下的其他内容。但总的来说,那时候你已经超出了标准的范围,所有的赌注都没有了。