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

EMi*_*ler 5 fortran variadic variadic-functions fortran77 fortran95

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

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

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

那么Fortran编译器如何实现,MAX或者MIN实际上是

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

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

Pet*_*ter 7

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

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

例如,给定

  RESULT = MAX(A,B,C)
Run Code Online (Sandbox Code Playgroud)

所有需要的是识别的参数,A,B,和C在句法分析和(受语句/表达是有效的-诸如具有相同的类型和种类的所有三个)发射的代码,步骤在每个参数以找到最大.

所以编译器可能会翻译类似的东西

  RESULT = MAX(A,B,C)
Run Code Online (Sandbox Code Playgroud)

进入看起来的东西(假设我们有一个发出C代码的Fortran编译器)

  result = a;
  if (b > result) result = b;
  if (c > result) result = c;
Run Code Online (Sandbox Code Playgroud)

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

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