在不支持可变函数的情况下,如何在 Fortran 中实现 MAX 和 MIN 函数?
How are the MAX and MIN functions implemented in Fortran without support for variadic functions?
除非我弄错了,否则在 Fortran 中无法编写具有任意数量参数的函数或子例程(更简洁地称为可变参数函数)。
例如:
RESULT = FUNC(A1, A2 [, A3 [, ...]])
我知道,我可以创建可选参数,但是参数的数量是有限的,必须在函数定义中一个一个地手动声明。
那么 Fortran 编译器是如何实现的,MAX
或 MIN
实际上是
RESULT = MAX(A1, A2 [, A3 [, ...]])
特别令人困惑的是,这些可变 MAX
和 MIN
函数是 evidently Fortran 77 标准的一部分。因此,无论存在什么能力来实现这些功能,都必须在 1977 年左右可用。
编译器支持可变参数函数,允许程序员编写接受可变数量参数的函数。
即使对于程序员来说可能看起来相同,Fortran 中的 MAX() 也不需要是函数、可变参数或其他 - 它可以作为编译器内置的功能来实现,以识别一系列标记和表达式,并根据需要发出尽可能多的代码(例如到目标文件)以产生所需的结果。这可能涉及调用库函数,也可能不涉及。
例如给定
RESULT = MAX(A,B,C)
所需要的只是在句法分析期间识别参数,A
、B
和 C
并且(以 statement/expression 有效为前提 - 这样因为所有三个都具有相同的类型和种类)发出代码,遍历每个参数以找到最大值。
所以编译器可能会翻译成
RESULT = MAX(A,B,C)
变成类似于
的东西(假设我们有一个发出 C 代码的 Fortran 编译器)
result = a;
if (b > result) result = b;
if (c > result) result = c;
并简单地向上面发出一些额外的逻辑来处理每个额外的参数。
而且,是的,这种能力早在 1977 年之前就存在于编译器中。这种能力是拥有编译器的主要要点之一 - 自动将对程序员来说简单的东西转换成任何需要的更复杂逻辑的过程。
除非我弄错了,否则在 Fortran 中无法编写具有任意数量参数的函数或子例程(更简洁地称为可变参数函数)。
例如:
RESULT = FUNC(A1, A2 [, A3 [, ...]])
我知道,我可以创建可选参数,但是参数的数量是有限的,必须在函数定义中一个一个地手动声明。
那么 Fortran 编译器是如何实现的,MAX
或 MIN
实际上是
RESULT = MAX(A1, A2 [, A3 [, ...]])
特别令人困惑的是,这些可变 MAX
和 MIN
函数是 evidently Fortran 77 标准的一部分。因此,无论存在什么能力来实现这些功能,都必须在 1977 年左右可用。
编译器支持可变参数函数,允许程序员编写接受可变数量参数的函数。
即使对于程序员来说可能看起来相同,Fortran 中的 MAX() 也不需要是函数、可变参数或其他 - 它可以作为编译器内置的功能来实现,以识别一系列标记和表达式,并根据需要发出尽可能多的代码(例如到目标文件)以产生所需的结果。这可能涉及调用库函数,也可能不涉及。
例如给定
RESULT = MAX(A,B,C)
所需要的只是在句法分析期间识别参数,A
、B
和 C
并且(以 statement/expression 有效为前提 - 这样因为所有三个都具有相同的类型和种类)发出代码,遍历每个参数以找到最大值。
所以编译器可能会翻译成
RESULT = MAX(A,B,C)
变成类似于
的东西(假设我们有一个发出 C 代码的 Fortran 编译器) result = a;
if (b > result) result = b;
if (c > result) result = c;
并简单地向上面发出一些额外的逻辑来处理每个额外的参数。
而且,是的,这种能力早在 1977 年之前就存在于编译器中。这种能力是拥有编译器的主要要点之一 - 自动将对程序员来说简单的东西转换成任何需要的更复杂逻辑的过程。