5.2 外部程序单元的定义 BACKWARD FORWARD


5.2.1 函数和子程序语句

外部前缀可出现在函数语句或子程序语句中(如Fortran标准所定义的一样),它所处的位置与关键字RECURSIVE,PURE,以及ELEMENTAL可能出现的位置是相同的。这一点由Fortran 95的1995年5月草稿中规则R1219的扩展所指定,此规则用于前缀说明。用于函数语句的规则R1217,用于前缀的R1218,以及用于子程序语句的R1222没做改动,但是为了进行引用在这里我们也将其重写下来。

H501 function-stmt   is [prefix]FUNCTION function-name
               ([dummy-arg-name-list])
                [RESULT(result-name)]
H502 subroutine-name  is [prefix]SUBROUTINE subroutine-name
               [([dummy-arg-list])]
H503 prefix        is prefix-spec[prefix-spec]...
H504 prefix-spec     is type-spec
              or RECURSIVE
              or PURE
               or ELEMENTAL
              or extrinsic-prefix

约束:对Fortran 95的1995年5月草稿中12.2节所给出的过程特性的定义进行了扩展,扩展后将过程的外部类包含了进去。

约束:在任何一个HPF外部子程序中,每个内部子程序必须和其宿主具有相同的外部类,如果一个内部子程序没有显式指定外部类,则假定它就具有其宿主的外部类。

5.2.2 程序,模块,以及块数据语句

外部前缀也可出现在程序语句,模块语句或块数据语句的开始。下列的句法定义对Fortran 95的语法规则R1102(用于程序语句),R1105(用于模块语句),以及R1111(用于块数据语句)进行了扩展。

H505 program-stmt    is [extrinsic-prefix] PROGRAM program-name
H506 module-stmt     is [extrinsic-prefix] MODULE module-name
H507 block-data-stmt   is [extrinsic-prefix] BLOCK DATA [block-data-name] 

约束:在任何一个HPF模块中,每个模块子程序必须和其宿主具有相同的外部类,如果一个模块子程序没有显式指定外部类,则假定它就具有其宿主的外部类。

约束:在任何一个HPF主程序或模块子程序中,每个内部子程序必须和其宿主具有相同的外部类,如果一个内部子程序没有显式指定外部类,则假定它就具有其宿主的外部类。

约束:在任何一个HPF块数据语句中,如果出现外部前缀(extrinsic-prefix),则块数据名字(block-data-name)也必须出现。

5.2.3 外部前缀
H508 extrinsic-prefix       is EXTRINSIC(extrinsic-spec)
H509 extrinsic-spec        is extrinsic-spec-arg-list
                   or extrinsic-kind-keyword
H510 extrinsic-spec-arg      is language
                   or model
                   or external-name
H511 language           is [LANGUAGE=]char-initialization-expr
H512 model             is [MODEL=]char-initialization-expr
H513 external-name         is [EXTERNAL_NAME=]char-initialization-expr

下面的约束是在Fortran 95的1995年5月草稿所指定的那些约束的的基础上另加的。

约束:规则extrinsic-spec-arg-list好象EXTRINSIC是一个带有显式接口的过程,该接口的哑参列表可以是LANGUAGE,MODEL,EXTERNAL_NAME,且这三个关键字是可选的。注意,在一个extrinsic-spec-arg-list中,语言(language),模型(model)或外部名字(external-name)必须至少出现一个。

约束:在language中,char-initialization-expr的值可以是:

.‘HPF’,指的是HPF语言;如果没有显示指定model,则model隐含为‘GLOBAL’;

.‘FORTRAN’,指的是ANSI/ISO标准Fortran语言;如果没有显示指定model,则model隐含为‘SERIAL’;

.‘C’,指的是ANSI标准C程序设计语言;如果没有显示指定model,则model隐含为‘SERIAL’;或者

.一个依赖于实现的值,该值的model是隐含的且依赖于实现的。

如果未指定language,则language的值与extrinsic-prefix所出现的宿主作用域单元中language的值是相同的。

约束:在model中,char-initialization-expr的值可以是:

.‘GLOBAL’,指的是全局模型

.‘LOCAL’,指的是局部模型

.‘SERIAL’,指的是串行模型

.一个依赖于实现的值

如果未指定model,也没有通过一个language的说明来隐含指定,则model的值与extrinsic-prefix所出现的宿主作用域单元中model的值是相同的。

约束:所有其名字以三个字母“HPF”开头的language和model都被此说明及其后继者保留起来以用于当前的或进一步的定义。

约束:在external-name中,char-initialization-expr的值是能够被外部程序所知的程序单元的名字,例如外部文件系统和程序库。如果不指定external-name,则它的值是依赖于实现的。

HPF定义了三个外部类关键字(extrinsic-kind-keyword):HPF,HPF_LOCAL,以及HPF_SERIAL。

H514 extrinsic-kind-keyword    is HPF
                  or HPF_LOCAL
                  or HPF_SERIAL

约束:extrinsic(HPF)等价于extrinsic('HPF','GLOBAL')。在没有extrinsic-prefix的情况下,HPF编译器将编译单元解释为外部类HPF。这样对于一个HPF编译器,指定EXTRINSIC(HPF)或extrinsic('HPF','GLOBAL')是多余的。但是这种显式指定可用于支持多种的编译器。

约束:extrinsic(HPF_LOCAL)等价于extrinsic('HPF','LOCAL')。外部类为HPF_LOCAL的主程序运行时就好象它是一个具有外部类HPF_LOCAL的子程序,该子程序由一个外部类为HPF的主程序所调用,主程序在调用它时不带任何参数且主程序的可执行部分仅包含该调用。

约束:extrinsic(HPF_SERIAL)等价于extrinsic('HPF','SERIAL')。外部类为HPF_SERIAL的主程序运行时就好象它是一个具有外部类HPF_SERIAL的子程序,该子程序由一个外部类为HPF的主程序所调用,主程序在调用它时不带任何参数且主程序的可执行部分仅包含该调用。

约束:所有其名字以三个字母“HPF”开头的外部关键字(extrinsic-kind-keywords)都被此说明及其后继者保留起来以用于当前的或进一步的定义。

对实现者的建议:编译器厂家也可定义和提供其它的language或model。虽然不能作为HPF说明的一部分,但也希望它们能够符合HPF外部类的规则和精神。

一种实现方式是将某些约束加到程序员身上;而且,每个外部类可以要求不同的约束。

例如,在并行处理器上实现时,就会发现复制哑参以便为每个处理器提供一个拷贝的做法是很方便的。只要这个进程对调用者是不可见的,就允许这么做。完成这一点的一种方法是将约束加到程序员身上:从子程序返回时,此标量参数的所有拷贝必须具有相同的值。这意味着,如果哑参具有INTENT(OUT),则在子程序返回时,所有的拷贝必须被一致修改。(对实现者的建议结束)


Copyright: NPACT BACKWARD FORWARD