Fortran ユーザーズガイド ホーム目次前ページへ次ページへ索引


付録 C

Fortran 95 の機能と相違点

この付録では、以下の Fortran の機能の主な相違点について説明します。

機能

Sun WorkShop 6 Fortran 95 は、以下に示す機能を備えています。

継続行の制限

f95f77 では 99 行まで行を継続することができます (開始行が 1 行とその後の継続行が 98 行ということです)。標準の Fortran 95 では、固定形式の場合で 19 行まで、自由形式の場合で 39 行までです。

固定形式固定形式のソースの行

固定形式のソースの場合、1 行に 73 文字以上使用できます。ただし、73 カラム目以降はすべて無視されます。標準の Fortran 95 では、行の長さは 72 文字までです。

指令

f95 では、指令行が CDIR$!DIR$CMIS$C$PRAGMAC$OMP または !MIC$ で開始できるようになりました。指令の要約については、付録 E を参照してください。標準 Fortran 95 には、指令の機能はありません。

タブ書式

f95 の固定形式のタブ書式のソーステキストは以下のように定義されます。

例 : 左側のタブ書式のソースは右側のようになります。

!^IUses of tabs
    CHARACTER *3 A = 'A' ^IINTEGER B = 2
^IREAL C = 3.0
^IWRITE(*,9) A, B, C
9^IFORMAT(1X, A3,
^I1 I3,
^I2 F9.1 )
^IEND
! Uses of tabs
CHARACTER *3 A = 'A'
INTEGER B = 2
REAL C = 3.0
	WRITE(*,9) A, B, C
9	FORMAT(1X, A3
       1 I3,
       2 F9.1)
	END

この例では、タブ文字は 「^I」 で示されており、「1」 または 「2」 で始まっている行が継続行です。また、1 つの書式ではなく、さまざまなタブ書式がコーディングで示されています。

使用するソースの書式

f95 で使用するソースの書式は、オプション、指令、拡張子によって異なります。

表 C-1   F95 ソース書式のコマンド行のオプション
オプション 作用
-fixed
すべてのソースファイルが Fortran の固定形式で記述されていると解釈します。
-free
すべてのソースファイルが Fortran の自由形式で記述されていると解釈します。


-free および -fixed オプションは、ファイル名の拡張子よりも優先されます。FREE 指令または FIXED 指令を使用すると、オプションおよびファイル名の拡張子よりも優先されます。

書式の混在

以下のように、異なるソースの書式を混在させてもかまいません。

大文字・小文字の区別

Sun Fortran 95 では、デフォルトでは大文字・小文字が区別されません。すなわち、AbcDeF という変数は、abcdef と同じ文字列として扱われます。-U オプションを付けてコンパイルすると、コンパイラは大文字と小文字を区別します。

既知の制限

Fortran 95 のプログラム単位には、最高 65,535 個の導出型、および最高 16,777,215 個の定数を定義できます。

ブール (Boolean) 型

f95 では、ブール型の定数と式をサポートしています。ただし、ブール型の変数、配列、文はサポートしていません。

ブール型に関する規則

ブール型定数の別の書式

f95 では、ブール型定数 (8 進、16 進、ホレリス) を、以下に示すような書式 (2 進ではありません) で使用することができます。標準の Fortran では、変数をブール型と宣言することはできません。

8 進

書式は ddddddB です。d は任意の 8 進数です。

入出力の書式指定では B という文字は 2 進数であることを示しますが、それ以外の場合は 8 進数であることを表します。

16 進

d が任意の 16 進の数字である X'ddd' または X"ddd" の書式です。

ホレリス

ホレリスデータには、以下の書式を使用できます。

nH... '...'H "..."H

nL... '...'L "..."L

nR... '...'R "..."R

上記の ... は文字列を表し、n は文字数を表します。

例 : 8 進と 16 進の定数の表現例を示します。

ブール型定数 内部の 8 進数
0B
00000000000
77740B
00000077740
X"ABE"
00000005276
X"-340"
37777776300
X'1 2 3'
00000000443
X'FFFFFFFFFFFFFFFF'
37777777777


例 : 代入文での 8 進と 16 進の使用例を示します。

i = 1357B
j = X"28FF"
k = X'-5A'

算術式の中で 8 進数または 16 進数の定数を使用すると、結果が未定義になることがあります。ただし、構文エラーにはなりません。

別の場所におけるブール型定数の使用

f95 では、DATA 文以外の場所で BOZ 定数を使用することができます。

B'bbb' O'ooo'Z'zzz'

B"bbb" O"ooo"Z"zzz"

このような BOZ 定数が実数変数に代入されている場合には、型は変換されません。

標準の Fortran では、BOZ 定数は DATA 文でしか使用できません。

数値データ型のサイズの略記法

f95 では、宣言文、関数文、IMPLICIT 文において、以下のような非標準の書式で型を宣言することができます。

表 C-2   数値データ型のサイズの表記法
非標準 宣言子 短縮書式 意味
INTEGER*1
INTEGER(KIND=1)
INTEGER(1)
1 バイトの符号付き整数
INTEGER*2
INTEGER(KIND=2)
INTEGER(2)
2 バイトの符号付き整数
INTEGER*4
INTEGER(KIND=4)
INTEGER(4)
4 バイトの符号付き整数
LOGICAL*1
LOGICAL(KIND=1)
LOGICAL(1)
1 バイト論理型
LOGICAL*2
LOGICAL(KIND=2)
LOGICAL(2)
2 バイト論理型
LOGICAL*4
LOGICAL(KIND=4)
LOGICAL(4)
4 バイト論理型
REAL*4
REAL(KIND=4)
REAL(4)
IEEE の単精度浮動小数点数 (4 バイト)
REAL*8
REAL(KIND=8)
REAL(8)
IEEE の倍精度浮動小数点数 (8 バイト)
REAL*16
REAL(KIND=16)
REAL(16)
IEEE の 4 倍精度浮動小数点 (16 バイト)
COMPLEX*8
COMPLEX(KIND=4)
COMPLEX(4)
単精度複素数 (各部に 4 バイト)
COMPLEX*16
COMPLEX(KIND=8)
COMPLEX(8)
倍精度複素数 (各部に 8 バイト)
COMPLEX*32
COMPLEX(KIND=16)
COMPLEX(16)
4 倍精度複素数 (各部に 16 バイト)


1 列目の形式は一般に使用されていますが、非標準の Fortran 95 です。2 列目の種別番号はベンダーにより変わります。

Cray ポインタ

Cray ポインタとは、別の変数や配列などのアドレスを値にもつ変数のことです。この別のもののことを、指示先と呼びます。

f95 は Cray ポインタをサポートしています。標準の Fortran 95 ではサポートされていません。

構文

Cray ポインタの POINTER 文は以下の形式で記述します。

POINTER			( ポインタ名, 指示先名 [配列の仕様] ), ...

ポインタ名、指示先名、配列の仕様のそれぞれの意味は、以下のとおりです。

ポインタ名 対応する <指示先名> へのポインタです。ポインタ名には指示先のアドレスが含まれます。
制限事項: ポインタ名にはスカラー変数名を指定してください (派生型は指定できません)。
定数、構造体の名前、配列、関数を指定することはできません。
指示先名 対応する <ポインタ名> の指示先です。
制限事項 : 変数名、配列の宣言子、配列名を指定してください。
配列の仕様 配列の仕様を指定する場合は、明示的な実体があるもの (定数または非定数のサイズを持つもの)、または仮のサイズをもつものを指定してください。


例 : 2 つの指示先に対して Cray ポインタを宣言します。

	POINTER ( p, b ), ( q, c )

上記の例では、Cray ポインタ p とその指示先 b、Cray ポインタ q とその指示先 c を宣言しています。

例 : 配列に対して Cray ポインタを宣言します。

	POINTER ( ix, x(n, 0:m) )

この例では、Cray ポインタ ix とその指示先 x を宣言しています。同時に、x
nm-1 次元の配列であることを宣言しています。

Cray ポインタの目的

ポインタを使用すると、記憶領域の特定の場所に変数を動的に対応づけ、ユーザーが管理する記憶領域にアクセスすることができます。

Cray ポインタでは、メモリーの絶対的な場所にアクセスすることができます。

最適化のために同じ値をもつポインタは存在しないと仮定しているので、Cray ポインタではリンクをリストして操作することはできません。

Cray ポインタと Fortran のポインタ

Cray ポインタは次のように宣言します。

POINTER ( ポインタ名, 指示先名 [配列の仕様] )

Fortran のポインタは次のように宣言します。

POINTER オブジェクト名

この 2 種類のポインタを混在させることはできません。

Cray ポインタの機能

この場合の配列の宣言子は以下の場所に指定することができます。

  • 独立した型宣言文
  • 独立した DIMENSION
  • ポインタ文自体

Cray ポインタの制限事項

Cray ポインタの指示先の制限事項

Cray ポインタの使用法

Cray ポインタには以下のようにして値を割り当てることができます。

例 : q = 0
例 : p = q + 100
例 : p = LOC ( x )

例 : Cray ポインタの使用例

	SUBROUTINE  sub ( n )
	COMMON pool(100000)
	INTEGER blk(128), word64
	REAL a(1000), b(n), c(100000-n-1000)
	POINTER ( pblk, blk ), (ia, a ), ( ib, b ), &
			( ic, c ), ( address, word64 )
	DATA address / 64 /
	pblk = 0
	ia = LOC( pool )
	ib = ia + 1000
	ic = ib + n
	...

上記の例を説明します。

最適化と Cray ポインタ

最適化を図るため、f95 では指示先の領域は他の変数の領域とは重ならないようにしています。つまり、指示先は他の変数とは関連づけられていないとみなされます。

ただし、以下の 2 つの場合には関連が生じる可能性がありますので注意してください。

このような関連付けは、配列の等値化などで意図的に行われる場合もあります。ただし、このときの実行結果は最適化を実行するかどうかによって異なる可能性があります。

例 : bc のポインタは同じです。

	POINTER ( p, b ),  ( p, c )
	REAL x, b, c
	p = LOC( x )
	b = 1.0
	c = 2.0
	PRINT *, b
	...

上記の例では、bc のポインタが同じであるため、c に 2.0 を代入すると同じ値が b にも割り当てられます。このため、b に 1.0 がすでに代入されていても、出力結果は 2.0 になります。

組み込み関数

f95 は標準の処理を拡張した組み込み関数をサポートしています。

表 C-3   非標準の組み込み関数  
名前 定義 関数の型 引数 引数 備考
COT
余接関数 実数 実数 ([X]=x)
P, E
DDIM
正差 倍精度実数 倍精度実数 ([X]=x,[Y=]y)
P, E
LEADZ
先行の 0 ビットの数を調べる 整数 ブール型、整数、実数、ポインタ ([I=]i)
NP, I
POPCNT
設定されたビットの数を調べる 整数 ブール型、整数、実数、ポインタ ([I=]i)
NP, I
POPPAR
ビットの設定数のパリティを演算する 整数 ブール型、整数、実数、ポインタ ([X=]x)
NP, I


上記の表の備考欄の意味は以下のとおりです。

備考 意味
P 名前を引数として渡すことができる
NP 名前を引数として渡すことはできない
E 組み込み関数の外部コードは実行時に呼び出される
I f95 が組み込み関数のインラインコードを生成する


入出力拡張機能

Sun FORTRAN 77 の一部の入出力拡張機能が Fortran 95 のコンパイラに追加されました。

指令

コンパイラ指令は、特別な動作をするようにコンパイラに指示します。プラグマとも呼ばれます。

コンパイラ指令は 1 行または複数行のテキストとしてソースプログラムに挿入されます。コンパイラ指令は一見注釈に似ていますが、注釈にはない特別な文字が付加されています。Fortran 95 以外のほとんどのコンパイラでは指令を注釈として扱うので、コードの一定の移植性は保たれます。

f95 (および f77) では、サン形式の指令がデフォルトとして設定されています。Cray 形式の指令に切り換えるには、コンパイラコマンド行フラグの -mp=cray を使用してください。

Fortran 指令については、付録 E にまとめられています。

f95 の特殊な指令行の書式

f95 は、第 2 章に示すような f95/f77 の一般的な指令に加え、独自の特殊な指令を認識します。構文は次のようになります。

!DIR$ d1, d2, ...

ソースが固定形式の場合

ソースが自由形式の場合

これらのことから、!DIR$ を 1 カラム目から 5 カラム目に記述しておけば、自由形式または固定形式のどちらのソースでも機能することがわかります。

FIXED 指令と FREE 指令

指令行の後に続くソース行の書式を指定します。

範囲

指令が適用される範囲は、ファイル内に指令が出現してから最後までの部分、または次に FREE あるいは FIXED が出現するまでの部分です。

使用法

制限事項

FREE 指令と FIXED 指令には以下の制限事項があります。

例 : FREE 指令を指定します。

!DIR$ FREE
	DO i = 1, n
		a(i) = b(i) * c(i)
	END DO

並列化の指令

並列化の指令は、コンパイラに次の DO ループの並列化処理を指示する特別な注釈です。これらに関する概要は、付録 E と『Fortran プログラミングガイド』に記載されています。f95 は、f77 の Sun および Cray 形式の並列化指令だけでなく、OpenMP Fortran API 指令も認識します。


注 - Fortran の並列化機能には、Sun WorkShop HPCのライセンスが必要です。

Fortran 77 との互換性

ソース

標準に準拠した固定形式 (filename.F) の FORTRAN 77 のソースコードにはサンの Fortran 95 との互換性が保証されます。たとえば、VMS Fortran の機能などの標準以外の拡張機能を使用すると、互換性がなくなり、サンの Fortran 95 でのコンパイルはできません。

制約

f77 コンパイラでは、配列添え字を最高 20 個まで使用できますが、f90 では、7 個しか使用できません。

f77 でコンパイルしたルーチンとのリンク

例 : f95 のメインと f77 のサブルーチンです。

demo$ cat m.f95
CHARACTER*74 :: c = 'テストです。'
   CALL echo1( c )
END
demo$ cat s.f
	SUBROUTINE echo1( a )
	CHARACTER*74 a
	PRINT*, a
	RETURN
	END
demo$ f77 -c -silent s.f
demo$ f95 m.f95 s.o -lf77compat
demo$ a.out
 テストです。
demo$

例 : FORTRAN 77 のライブラリからルーチンを呼び出す f95 のメインです。

demo$ cat tdtime.f95
        REAL e, dtime, t(2)
        e = dtime( t )
        DO i = 1, 100000
           as = as + cos(sqrt(float(i)))
        END DO
        e = dtime( t )
        PRINT *, '経過:', e, ', ユーザー:', t(1), ', システム:', t(2)
        END
demo$ f95 tdtime.f95
demo$ a.out
 経過:0.14, ユーザー:0.14, システム:0.0E+0
demo$

dtime(3F) を参照してください。

入出力

f95f77 の互換ライブラリにリンクされるので、f77f95 のバイナリ入出力には互換性があります。

バイナリ入出力に互換性があるので、以下のような状況でも実行することができます。

読み込まれた数字と書き込まれた数字が一致しない場合があります。

組み込み関数

Fortran 95 の標準機能として、以下に示すような組み込み関数が新たにサポートされました。これらの関数は FORTRAN 77 にはありません。

以下の名前をユーザープログラムで使用する場合は、EXTERNAL 文を追加し、組み込み関数ではなくユーザー関数を使用するように f95 に指示する必要があります。

Fortran 95 の組み込み関数には、以下のものがあります。

ADJUSTL,ADJUSTR,ALL,ALLOCATED,ANY,BIT_SIZE,COUNT,CSHIFT,
DIGITS,DOT_PRODUCT,EOSHIFT,EPSILON,EXPONENT,HUGE,KIND,
LBOUND,LEN_TRIM,MATMUL,MAXEXPONENT,MAXLOC,MAXVAL,MERGE,
MINEXPONENT,MINLOC,MINVAL,NEAREST,PACK,PRECISION,
PRESENT, PRODUCT,RADIX,RANGE,REPEAT,RESHAPE,RRSPACING,
SCALE,SCAN, SELECTED_INT_KIND,SELECTED_REAL_KIND,
SET_EXPONENT,SHAPE,SIZE,SPACING,SPREAD,SUM,TINY,
TRANSFER,TRANSPOSE,UBOUND, UNPACK,VERIFY

将来のバージョンとの互換性

ソースコードは、f95 の本リリースと将来のリリースで互換となる予定です。

f95 の本リリースでモジュール情報ファイルを作成する場合、そのファイルが将来のリリースと互換性があるかどうかは保証されません。

言語の混在

Solaris システムでは、C で書かれたルーチンを Fortran のプログラムと組み合わせることができます。C と Fortran では呼び出し規則が共通なためです。

モジュールファイル

Fortran 95 の MODULE を含むファイルをコンパイルすると、ソースで検出された MODULE ごとにモジュールファイル (.mod ファイル) が生成されます。ファイル名は MODULE 名を基に付けられます。たとえば、MODULE.xyz からは xyz.mod (すべて小文字) というファイル名が作成されます。

デフォルトでは、このようなファイルは現在作業中のディレクトリで検索されます。
-Mdir オプションを指定すると、別の場所も検索するように f95 に指示することができます。

.mod ファイルをアーカイブファイルに格納したり、1 つのファイルに結合したりすることはできません。


サン・マイクロシステムズ株式会社
Copyright information. All rights reserved.
ホーム   |   目次   |   前ページへ   |   次ページへ   |   索引