如果不支持可变参数函数,Fortran中的MAX和MIN函数如何实现?

时间:2016-06-16 20:52:49

标签: fortran variadic-functions fortran77 variadic fortran95

除非我弄错了,否则Fortran无法用任意数量的参数编写函数或子例程(更简洁地称为可变参数函数)。

例如: RESULT = FUNC(A1, A2 [, A3 [, ...]])

我知道,我可以创建可选参数,但参数的数量是有限的,必须在函数定义中逐个手动声明。

那么Fortran编译器如何实现,MAXMIN实际上是

RESULT = MAX(A1, A2 [, A3 [, ...]])

特别令人困惑的是,这些可变MAXMIN函数是evidently,是Fortran 77标准的一部分。因此,实现这些功能的任何能力都必须在1977年左右提供。

1 个答案:

答案 0 :(得分:7)

编译器支持可变函数,允许程序员编写一个接受可变数量参数的函数。

即使程序员看起来相同,Fortran中的MAX()也不需要是函数,可变参数或其他函数 - 它可以作为编译器内置的功能来实现,以识别一系列令牌和表达式,并根据需要发出尽可能多的代码(例如,发送到目标文件)以产生所需的结果。这可能涉及调用库函数,或者可能不会。

例如,给定

  RESULT = MAX(A,B,C)

所需要的只是在句法分析中识别参数ABC,并且(在声明/表达有效的情况下 - 例如三者都有相同的类型和类型)发出代码,遍历每个参数以找到最大值。

因此编译器可能会翻译类似

的内容
  RESULT = MAX(A,B,C)

看起来像是(假设我们有一个发出C代码的Fortran编译器),比如

  result = a;
  if (b > result) result = b;
  if (c > result) result = c;

并简单地向上面发出一些额外的逻辑来处理每个附加参数。

而且,是的,这种能力在1977年之前就存在于编译器中。这种能力是编译器的主要要点之一 - 自动化将程序员简单的东西转换成需要更复杂的逻辑的过程。