“真实世界”使用Fortran中的参数传递

时间:2010-10-22 12:06:09

标签: fortran fortran90

我总是假设fortran将“通过引用”实体传递给伪参数。然后我得到了这个答案(答案的实际论点是相关的,但不是这个)

  

标准从未指定和,   确实走了很多路   避免这种说明。虽然   你的是一个常见的误解,它   即使在大多数情况下也不严格准确   较旧的编译器,尤其是   优化开启。一个严格的   传递参考会杀死许多人   常见的优化。

     

根据最近的标准,   传递参考只是   在某些情况下不允许。标准   不会在其中使用这些词语   规范性文本,但也有一些东西   实施起来是不切实际的   通过引用传递。

     

当你开始进入事物时   像指针一样,假设的错误   一切都是通过参考传递的   将开始使自己更加明显   比以前。你必须放弃它   会有误解或很多事情   让你困惑。

     

我认为其他人已经回答了   其余的职位充分。还有一些   解决了上述问题,但我   我想强调它。

请参阅here for attribution

根据这个答案,标准中没有任何内容指定数据如何从调用者传送到被调用者。实际上,这应该如何解释实际使用它(不管编译器如何实现标准的实际效果),特别是在涉及intent()规范时?

修改:我想澄清一下我的问题。我想要了解的是标准期望您在执行呼叫时如何工作。鉴于用于传递实体的实际编译器策略未被标准定义,原则上(根据标准)不能期望将参数传递给函数实际上将表现为“传递引用”,其所有相关的副作用,因为这种行为是编译器和优化相关的。因此,我认为无论实际的实施策略如何,标准都会为您提供必须遵循的编程风格。

3 个答案:

答案 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或某些特定情况下的其他内容。但总的来说,那时候你已经超出了标准的范围,所有的赌注都没有了。