1 概要
本ドキュメントでは、Fortran Builder 7.1 の新機能および変更点について説明します。
2 リリースの概要
Fortran Builderのリリース 7.1 では、以下を含むFortran 2008のすべて機能をサポートするようになりました。
- データポインタを返す関数への参照が、代入文の左側を含む多くの場面で変数として使用できます。
- その他、マイナーな機能追加が行われ、ポインタ指示先の初期化(これにより割付け可能な要素が再帰的もしくは相互に再帰的な型を持つことができる)や 手続ポインタを返す関数がが行えるようになりました。
また本リリースで、以下を含む数多くのFortran 2018の機能が追加されました。
-
組込みの集約サブルーチン(
CO_SUM
他)の追加により、 Fortran 2018の共配列並列プログラミング機能をすべてサポートしました。 - C言語の高度な相互運用性を部分的にサポートしました。 具体的には、次元数引継ぎ引数、型引継ぎ引数、およびC記述子がサポートされます。
-
RANK
組込関数とSELECT_RANK
構文を用いて、 (Cではなく)Fortranで直接次元引継ぎ引数が利用できます。 -
いくつかのマイナーな機能追加が行われ、
省略可能な仮引数が組込配列関数(
SUM
など)のDIM
引数として使用できるようになりました。
更に、本リリースでは新たにOpenMPプログラムを用いたプログラムでも、未定義変数のチェックができるようになり、OpenMPプログラミングへの対応が更に改善されました。
エラー診断も更に強化されました。
ソース整形機能も強化され、より柔軟な指定が可能となりました。
3 追加のOpenMPサポート
-
-C=undefined オプションによるOpenMPプログラムの未定義変数検出がサポートされました。
例)Program bad Use omp_lib Real x,y(10) x = 3 !$OMP PARALLEL DO DEFAULT(PRIVATE) SHARED(y) Do i=1,Size(y) y(omp_get_thread_num() + 1) = x * omp_get_thread_num() End Do !$OMP END PARALLEL DO Print *,y End Program
以下が出力されます。実行時エラー: bad.f90, line 7: 定義されていない変数Xへの参照が行われました 致命的なエラーでプログラムが終了しました
4 追加のエラー診断
-
ALLOCATE
文またはDEALLOCATE
文で、同じ変数が複数回出現した場合、 エラーとして検出されるようになりました。 - 型結合手続のオーバーライドとグローバルな整合性の診断で、仮引数の形状の違いを報告するようになりました。
-
SYSTEM_CLOCK
への8ビットまたは16ビットの整数引数は、値の受け取りには小さすぎるため、 エラーとして検出されるようになりました。 -
SYSTEM_CLOCK
の引数の不一致で警告を出すようになりました。- 引数が無い場合
- 整数引数が異なる種別である場合(Fortran 202xでは無効となるので)
- 整数引数と実数引数が混同された場合
- 整数引数がFortran 202xで推奨される64ビット整数でない場合
-
変数が利用者定義入出力によって処理されない場合、割付け、ポインタ、またはアクセスできない成分の要素を持つ変数で
NAMELIST
を使用するとエラーが発生します。 -
定数文字列の書式指定で、閉じる括弧の後に非空白文字がある場合、警告が発生します。
例)Print '(1X,I0) whatever',13
上記は以下のような警告を発します。疑問: ss.f90, line 1: 文字列の書式識別子で右括弧の後には余分な非空白文字「whatever」が現れます
-
CONTINUE
文は何の効果も持ちませんが、文番号があれば分岐先の文になったり、DO
ループの終わりになったりします。 しかし、文番号のないCONTINUE
文は、何ら役に立ちません。 このような場合、Note
レベルの警告が発せられます。CONTINUE
文がDO
ループの中にある場合、 CプログラマはこれがCYCLE
文の効果を持つと考えるかもしれないので、Questionable
に昇格されます。(Cではそうなっている)
例)Program continues Continue Do i=1,10 Print *,i**2 Continue End Do End Program
上記は以下の警告を発します。注意: ss.f90, line 2: CONTINUE文が文番号を持っていません 疑問: ss.f90, line 5: DOループの中に文番号のないCONTINUE文がありますが、CYCLE文と勘違いしましたか?
-
パラメタ化された構造型の共配列を割り付ける場合、異なる像で長さ型パラメタの値が異なる場合、
実行時エラーとして検出されるようになりました。
例)program bad type t(n,m,o) integer,len :: n,m,o real c(n,m,o) end type type(t(:,:,:)),allocatable :: x[:] if (num_images()<2) error stop '?Not enough images(2)' m1 = merge(123,456,this_image()==2) allocate(t(10,m1,30) :: x[*]) print *,'FAIL',this_image(),size(x%c) end program
実行時エラー: bad.f90, line 9: 共配列のALLOCATEで像1の型パラメタMの値が456ですが像2のは123です
-
空の
SELECT CASE
およびSELECT TYPE
構文は、選択子の評価以外には何も行われないため、 Questionable として報告されます。例えば
sub.f90
が以下を含む場合、Subroutine sub(x,n) Class(*) x Integer n Select Case (n) End Select Select Type (x) End Select End Subroutine
以下のような警告が発せられます。疑問: sub.f90, line 4: SELECT CASE構文が空です 疑問: sub.f90, line 6: SELECT TYPE構文が空です
また、最適化(-Oオプション)が使用されている場合、選択子の評価が行われない場合があります。
-
-C=intovfオプションは、
SHAPE
とSIZE
組込み関数での整数オーバーフローを検出するようになりました。
例)Program shape_overflow_example Real a(1,123456,3) Call sub(a) Contains Subroutine sub(x) Use Iso_Fortran_Env Real,Intent(In) :: x(:,:,:) Integer(int16) sh(3) sh = Shape(x,int16) Print *,sh End Subroutine End Program
上記が-C=intovfを付けないでコンパイルされた場合、以下のようなナンセンスな結果となりますが1 -7616 3
-C=intovfを付けてコンパイルした場合には、以下のような実行時エラーが発生します。実行時エラー: ss.f90, line 9: 組込み関数SHAPEでINTEGER(int16)オーバーフローが発生しました(真実の結果=123456)
-
-C=callsオプションは、手続ポインタの仮引数を、データポインタを返す関数と、
手続を返す関数(手続呼び出しのどのレベルでも)とで異なるものとして扱うようになりました。
これらのエラーは、手続が不正確な
引用仕様宣言
で呼び出された場合にのみ発生します。例)
Subroutine sub(f,x) Interface Function f(y) Real,Pointer :: f End Function End Interface Real,Intent(In) :: x Real,Pointer :: p p => f(x) Print *,Associated(p) End Subroutine
上記手続が以下のような不正確な引用仕様宣言で呼び出された場合Program bad Interface Subroutine sub(f,x) Real,External,Pointer :: f Real,Intent(In) :: x End Subroutine End Interface Real,External,Pointer :: pp Intrinsic sqrt pp => sqrt Call sub(pp,1.5) End Program
-C=callsオプション (さらにトレースバックを得るには-gline) を指定すると、 以下のような実行時エラーメッセージが出力されます。(指定しない場合はセグメンテーションフォルトとなります)実行時エラー: sub.f90, line 1: SUBにおいて誤った引用仕様ブロックです - 仮引数F(第1番目)が手続ポインタ ではありません 致命的なエラーでプログラムが終了しました sub.f90, line 1: エラーがSUBで発生しました bad.f90, line 11: BADから呼び出されました
5 その他の追加機能
-
整形ツールのオプション-idcase=と-kwcase=に、
新たな選択肢が'Camel_Case'加わりました。
これは‘Capitalised’と異なり、最初の文字だけではなくアンダースコアの後の文字も大文字になります。
-kwcase=Camel_Case の場合、影響を受けるキーワードは
Non_Intrinsic
、Non_Overridable
、Non_Recursive
、及びOpenMPキーワードNum_Threads
です。 なお、選択肢の指定時に大文字と小文字は区別されず、Camel_Caseの場合(‘cam’と省略できる)を除いて、最初の一文字のみにまで省略する事も可能です。 -
ソース整形ツールのオプション-idcase=に新たな選択肢squote{Asis}が加わりました。
これは、ユーザー定義演算子(固有演算子は含まない)を含むすべての識別子の大文字と小文字を、
入力に現れたままの状態で保持するものです。
例えば、入力が大文字小文字の整合性が取れていない状態の“
eX = Ex + 1
”であった場合、 出力はそのまま全く同じ形のものとなります。 このオプションは、拡張整形ツールや他のツールでは使用できません。 -
拡張ソース整形ツールオプション -case: は、
名前の種類によって異なる大文字・小文字の設定を可能にします。
コロンの後には、“kind=case”のカンマ区切りリストが続きます。
ここでcaseは、ケース指定 (
UPPERCASE
、lowercase
、Capitalised
、Camel_Case
)で、 kindは以下に示すカテゴリーのうちの1つになります。comp
要素 constr
構文名 intr
組込み手続 param
パラメタ proc
手続 tbp
型結合手続 tparam
構造型パラメタ type
構造型 var
変数 例えば-case:var=lower,proc=uは変数に小文字を、手続に大文字を指定します。 特定の種類の名前に対する設定がない場合、適切なカテゴリにフォールバックします。 code{param}、
type
、comp
、tparam
、proc
はすべてvar
に、intr
はproc
に、tbp
はcomp
かproc
にフォールバックされます。 ルールやフォールバックルールがない場合は、 -idcase=オプション設定(もしくはデフォルト)が使用されます。 -
拡張ソース整形ツールオプション-casex:は、大文字小文字の規則の例外を指定します。
コロンの後に、任意の大文字・小文字指定を適用する例外文字列をカンマで区切ったリストを記述します。
例えば、-casex:MaxVal,XYz は、
maxval
やxyz
と同等の名前が出現するたびに、 それぞれを、MaxVal
やXYz
とします。 - -quietオプションは、コンパイラ(またはツール)のバナーメッセージと、最後の要約行を抑止します。 つまり診断メッセージのみが出力されるようになります。
-
拡張メッセージは、それがどのような種類の拡張であるかの情報を提供するようになりました。
追加の情報は、その機能を追加したFortran標準の版 (例: “
拡張(F2018)
”) か、NAGの拡張か (“拡張(NAG)
”)か、標準機能に取って代わられた FORTRAN77 などの古い拡張か (“非標準(廃止予定)”) のいずれかであることを示します。 - 情報メッセージは3つのレベルに分けられました。 注意(最高)、情報、参考(最低)です。 デフォルトでは注意メッセージは出力されるようになっていますが、-w=noteオプションでこれを抑制することもできます。 -infoオプションで情報と参考の両方のメッセージを表示させることができます。
6 外部ライブラリのサポートについて
- Fortran Builder 7.1 は、以下の NAG ライブラリ製品をサポートします。
- Mark 28.3, 64-bit (NLW6I283EL)
- Mark 27.3, 64-bit (NLW6I273EL)
- Mark 27.2, 64-bit (NLW6I272EL)
- Mark 27.1, 64-bit (NLW6I271EL)
- Mark 27.0, 64-bit (NLW6I27DEL)
-