FORTRAN

提供: miniwiki
2018/8/19/ (日) 20:03時点におけるAdmin (トーク | 投稿記録)による版 (1版 をインポートしました)
(差分) ← 古い版 | 最新版 (差分) | 新しい版 → (差分)
移動先:案内検索
FORTRAN
150px
The Fortran Automatic Coding System for the IBM 704 (15 October 1956), the first Programmer's Reference Manual for Fortran
パラダイム 手続き型構造化命令型オブジェクト指向
登場時期 1957年
開発者 IBMジョン・バッカス
最新リリース Fortran 2008
型付け 強い静的型付け
主な処理系 Absoft, Cray, CUDA, Fortran Builder, GFortran, G95, Intel, Lahey/Fujitsu, Open Watcom, Pathscale, PGI, Silverfrost, Sun, XL Fortran, Visual Fortran ほか
影響を与えた言語 ALGOL 58, BASIC, PL/I, C
プラットフォーム z/OS, z/VM, z/VSE, MCP, VOS3, ACOS, GCOS, VMS, OS/400, UNIX, Linux, Windows, Mac OS, CP/M, MS-DOS ほか
テンプレートを表示


FORTRANフォートラン)は、1954年IBMジョン・バッカスによって考案された、コンピューターにおいて広く使われた世界最初の高級言語である。

概要

1956年に最初のマニュアルが、1957年IBM 704用の最初のコンパイラがリリースされた。名前「FORTRAN」は「formula translation」に由来し、FORTRAN 77やFortran 90などの末尾の数字は規格が制定された年を示している。

FORTRANは科学技術計算に向いた手続き型プログラミング言語であり、その長い歴史の間に開発された非常に多くの数学関数サブルーチン数値解析ソフトウェアの形で持っている。また、並列計算の並列性を明示的に書くことができ最適化が行いやすく、そのため他の言語より高速である等の理由から[1]数値予報および気候モデル構造力学における有限要素法計算流体力学計算物理学計算機化学計量経済学、動物と植物の品種改良などの大規模な計算を行う分野において、スーパーコンピュータで使われている[2]

また、ちょうどC言語に対するC++言語のように、Fortran 90/Fortran 95の言語仕様は、FORTRAN 77の頃と比べればかなり拡張され進歩したものとなっている。最新のソースコードは初期のものと比較すると、ほとんど別の言語のように見える。初期の頃は、変数名が大文字6文字までで、動的な記憶領域の確保ができないなど多くの制約があったが、それらの制限は無くなり、Fortran77から構造化プログラミングが、Fortran 90からモジュラープログラミング配列演算とユーザー定義総称関数が、Fortran 95からHigh Performance Fortranが、Fortran 2003からオブジェクト指向が、Fortran 2008 からはコンカレント・コンピューティング(並行計算)が導入された。

なお、大文字でFORTRANと表記した場合、FORTRAN 77以前のFORTRANを指し、Fortranと表記した場合、Fortran 90以降を指すことがある。

FORTRANの特徴

Fortran 90/95の特徴

Fortran 90/95の特徴は、以下のように要約される[3]

  • 数値計算プログラムを簡単かつ簡潔に記述できる。
  • プログラムの誤りを犯しにくい言語である。
  • 数値計算のための便利な道具があらかじめ用意されている。
  • 作成したプログラムを大規模高速演算に使用できる。
  • 無料のコンパイラが公開されている。

FORTRAN 77の特徴

広く使われていたFORTRAN 77 の特徴は、以下のように要約される。

  • 数式の計算が簡便に記述できる
ほぼ数学の数式通りに計算式を記述できる。もっともこの特徴は他に計算向きの高級言語がなかった時代の話であり、現代の水準では「プログラミング言語における標準数式表現の始祖」といった方が当たっている。
  • 入出力が容易
簡単に出力形式を定義できるFORMAT文や、実際の出力デバイスを意識しないで済む入出力文がある(C言語標準入出力と似た概念である)。
  • スタック指向/構造化指向の言語ではない
COMMON文、BLOCK DATA文やSAVE文など、データを静的に割り当てることを前提としている。
  • プログラムの書式が固定形式である
プログラム記述の方法がカラム位置に依存している(一部の実装では拡張されている)

FORTRANの歴史

ファイル:FortranCardPROJ039.agr.jpg
パンチカードに記されたFORTRANのコード。カラム1~5、6、73~80が制御用に確保されている。

ジョン・バッカスは1953年末、メインフレームコンピュータIBM 704のプログラムを開発するにあたり、アセンブリ言語に代わるものを開発することをIBMの上司に提案した。歴史的なFORTRAN開発チームはRichard Goldberg、Sheldon F. Best、Harlan Herrick、Peter Sheridan、Roy Nutt、 Robert Nelson、Irving Ziller、Lois Haibt、David Sayreというメンバーで構成された[4]

The IBM Mathematical Formula Translating System のドラフト仕様は1954年中旬に作成された。1956年10月にFORTRANの最初のマニュアルが作成され、コンパイラが1957年4月に開発された。顧客はアセンブリ言語で記述されたコードに匹敵するパフォーマンスが得られない限り高級言語を採用しないので、最初から最適化コンパイラが開発された。

この新しい方法がハンドアセンブルより高速に動作するかどうかには疑いの目があったが、プログラム中の命令数を1/20に削減できるので急速に受け入れられていった。IBMの社内誌であるThinkに掲載された1979年のインタビューでバッカスは「私がこの仕事をしたのは面倒くさがりだったからです。私はプログラムを書くことが好きではなかったので、IBM 701でミサイルの軌道計算プログラムを開発したときに、プログラムの開発を簡単にするためにプログラミングシステムを作り始めました。」[5]と語っている。

FORTRANは科学者の間で数学を応用したプログラムの記述に広く用いられたことから、より高速で効率的なコードを出力しようとする原動力となった。FORTRANに組み込まれた複素数は特に電気工学のような専門的なアプリケーションに適していた。

1960年までに様々なバージョンのFORTRANがIBM 709IBM 650IBM 1620IBM 7090で動作していた。FORTRANのユーザー数は急増し、コンピューターメーカーがFORTRANコンパイラをこぞって提供したので、1963年までには40を超えるFORTRANコンパイラが存在していた。こうしたことから、FORTRANはアーキテクチャの異なる様々なコンピュータで広くサポートされた最初の言語と言える。

FORTRAN開発の歴史は、初期のコンパイラ技術の歴史そのものといえる。FORTRANで効率的なコードを出力したいという強い要求からコンパイラによる最適化技術が大きく進歩した。

FORTRAN

IBM 704用に開発された最初のFORTRANは32の命令をもっていた。

IBM 1401版FORTRAN

IBM 1401版は革新的な65パスのコンパイラであり、わずか8k語の磁気コアメモリで動作する。コアに記録されたプログラムが段階的に実行可能なコードへと変換されて上書きされる。変換されたコードは機械語ではなく、UCSD PascalのPコードが生まれるよりも20年も前ながら、中間コードを利用していた。

FORTRAN II

IBMのFORTRAN IIは1958年に開発された。主な改良点は手続き型プログラミングのサポートであり、サブルーチンや関数を定義できるようになった。

その後、FORTRAN IIのデータ型には、DOUBLE PRECISION(倍精度型)とCOMPLEX(複素数型)が追加された。

FORTRAN III

IBMは1958年にFORTRAN IIIを開発していた。いくつかの新機能に加えインラインアセンブラが可能であった。しかしながらこのバージョンは販売されなかった。704 FORTRANやFORTRAN IIと同様に、FORTRAN IIIにも移植の妨げになるような機種依存の機能があった。他のベンダーから販売されていたFORTRANも初期は同様の問題を抱えていた。

FORTRAN IV

IBMは1961年に顧客の要望を受けFORTRAN IVの開発を開始した。READ INPUT TAPEのようなFORTRAN IIの機種依存部分を削除したほか、LOGICAL(論理型)、論理演算、算術IF文の代替となる論理IF文が加えられた。この時のターゲットマシンは36ビットのワードマシンだったので、整数値は235の範囲で定義されていた。また、実数の精度は227、倍精度実数の精度は254までだった。FORTRAN IVは1962年にIBM 7030(通称ストレッチ)用がリリースされ、後にIBM 7090版とIBM 7094版がリリースされた。

1965年には国家規格であるANSI X3.4.3 FORTRANに準拠した。

FORTRAN 66

American Standards Association(現ANSI)がFORTRANの米国規格を委員会で制定するようになったことはFORTRANの歴史の要である。1966年に2つの異なる言語が制定された。一つは当時既にデファクトスタンダードであったFORTRAN IVを基にしたFORTRANであり、もう一つはFORTRAN IIを基にして機種依存部分を取り除いたBasic FORTRANである。最初に制定されたFORTRANの規格は後にFORTRAN 66と呼ばれた。

FORTRAN 77

FORTRAN 66 規格のリリース後、コンパイラ・ベンダーは多くの拡張を"標準Fortran"に導入し、1966の規格の改訂を始めるようにANSIを促した。この改訂は1977年に制定され、最終的な改訂案は1978年4月に新しいFORTRAN標準として承認された。この新しい標準はFORTRAN 77として知られ、FORTRAN 66後の多くの変更を追加し、多くの重要な機能を加えた:

  • ブロック IFEND IF ステートメント、オプショナルなELSEELSE IF ステートメント。改善された言語サポートのための構造化プログラミング
  • DOループ機能拡張、パラメータ記述を含む、負の増分とゼロのトリップ・カウント(これ以前のFORTRANではDOループは必ず繰り返しを少なくとも1回は行うことになっていたのを廃止した)。
  • 改良されたI/OのためのOPEN, CLOSE, と INQUIRE文。
  • ダイレクト-アクセス ファイル I/O。
  • IMPLICIT 文。
  • CHARACTER データ・タイプ。文字の入出力と処理のための大幅な増補。
  • PARAMETER 定数を指定するためのステートメント。
  • 永続的なローカル変数SAVEステートメント。
  • 内部関数のための総称関数。
  • ASCII 文字列シーケンスにベースをおく、文字列比較のための内部命令セット(LGE, LGT, LLE, LLT)。

この規格の改訂において、多くの機能は除去されるか変えられ、以前の標準に合致していたプログラムの多くはおそらく無効になった。この時点で除去はX3J3の代替だけが許容された。だからコンセプト "不賛成"はANSI標準においては利用できなかった。しかし、コンフリクトリストの24アイテム(Appendix A2 of X3.9-1978を見よ)ループホールスとパスロジカルケースは以前の標準規格から許容されたが、しかし滅多に使用されない。少数の機能は慎重に除去された

  • ホレリス定数とホレリス・データ、すなわち:
GREET = 12HHELLO THERE!
  • FORMAT 記述子におけるH編集(ホレリス・フィールド)の読み込み(以前はホレリスで確保された文字列データの領域に入力文で文字列を読み込めた(データが上書きされる))。
  • アレイの添え字における境界のオーバーインデクシング。
DIMENSION A(10,5)
Y= A(11,1)
  • DOループから、ループ外への移動と帰還("エクステンデット・レンジ"(DOループの拡張範囲)として知られる)。
  • 以前の規格では文字型(CHARACTER型)がなかったので、文字データや文字列データを整数や実数の変数や配列に格納することが行われていたが、Fortran77ではそれを廃止した。

Fortran 90

一般にFortran 90 として知られている規格は、大幅に発表が遅れたもののFORTRAN 77の正当な継承者であり、最終的に1991年にISO規格、1992年にANSI規格としてリリースされた。この抜本的な改訂では1978年のFORTRAN 77規格制定からのプログラミング技術における大幅な変化を反映するために、以下の多くの新しい機能が加えられた

  • フリーフォームソース入力と小文字のFortranキーワード。プログラム本文を7桁目から書かなくても良く、80桁の制限も無い。
if (x<0) then
x=0
end if
  • 最長31文字までの識別子。
abcdefghijklmnopqrstuvwxyz12345=0.0e0
  • インラインコメント。
! これは"!"を用いたコメントです
  • 配列演算(あるいは部分配列演算)。これは数学とエンジニアリングの計算を大幅に簡素化する。
  • 全部または部分マスクされた、配列の指定と配列の表現、例えば、
x(1:n)=r(1:n)*cos(a(1:n))
  • 選択的配列のアサインのためのwhere文。
integer::a(10)
real(8)::b(10)
a=f(x)
where(a>0)
b=-1.0
elsewhere
b=1.0
end where
  • 配列の定数と式による初期化。
  • ユーザ定義の配列を返す関数と配列コンストラクタ。
function sample(x) result(y) !配列yを返す
integer,parameter::nn=4
real::y(nn)=(/ 1,2,3,4 /) !配列のコンストラクタと定数による初期化
....
end function sample
  • 再帰手続き。
  • モジュラープログラム、すなわち関係するサブルーチンとデータのグループ化と、他のプログラムユニットで使用、モジュールの内の指定した部分だけの使用を含む。
  • interface文を使用してコンパイル時に型がチェックされる大幅に改善された引数渡しメカニズム。
module my_lib !モジュール
interface
function sample(x)
real,intent(in)::x(:)!コンパイル時に変数の型の整合性とデータの入出力方向がチェックされる。
....
end function sample
end interface
end module
  • ユーザー定義総称関数(同じ関数名で、引数の数とタイプを自動的に識別して異なる内部関数を呼び出す)のインターフェース。
  • 演算子('+'、'-'、など)のオーバーローディング(多重定義)。
  • 派生型データタイプ。
  • 変数のデータタイプと他の属性を指定するための新たなデータタイプの宣言シンタックス、
  • allocatable属性と allocateとdeallocate文を用いたダイナミックメモリアロケーション。
real,allocatable::temp(:)
allocate(temp(nn))
deallocate(temp)
  • ポインター属性とポインターアサイン、nullify文によるダイナミックデータ構造の扱い。
  • do 文の end do による終端。
  • do while 文
  • exit文によるdo文からの脱出と、cycle文によるdo文の次の繰り返しへの移行。
do i=1,nn
if (b(i) /= 0) then
a(i) = 1.0 / b(i)
else
exit
end if
end do
  • select文。
select case (sw)
case ('++')
a = a + 1
case ('--')
a = a - 1
case default
a = 0
end select
  • ユーザがコントロールできる数値精度の移植性の良い指定方法。
a=1.0e0_kind(1.0d0)
  • 新しく導入された内部関数。それに伴い従来の文関数(statement function)は廃止予定に。

削除または時代遅れとされた機能の一覧

以前のバージョンとは異なり、Fortran 90は、何の機能も削除しなかった。(Appendix B.1 は『この規格の、削除した機能のリストは空である。』と言っている。)つまり、FORTRAN 77に準拠したプログラムは、Fortran 90にもまた準拠している。そして、両方の規格で、その動作が定義づけられた項目は使用可能でなければならない。一部の機能はFortran 95で『削除』され、また機能の小さな部分は『時代遅れ』と認定されて将来の規格で除去されることが予定された。

時代遅れの機能 状態 / Fortran 95での予定
算術 IF-statement     IF (X) 10, 20, 30
非-整数 DO パラメータ あるいは制御変数     DO 9 X= 1.7, 1.6, -0.1 削除
Shared DO-loop termination or
termination with a statement
other than END DO or CONTINUE  
    DO 9 J= 1, 10

        DO 9 K= 1, 10
9   L= J + K

ブロック外部からの

END IFへのブランチ

66  GO TO 77 ; . . .

    IF (E) THEN ;     . . .
77  END IF

削除
Alternate return     CALL SUBR( X, Y *100, *200 )
PAUSE文     PAUSE 600 削除
ASSIGN statement
  と assigned GO TO statement
100  . . .

    ASSIGN 100 TO H
    . . .
    GO TO H . . .

削除
Assigned FORMAT specifiers     ASSIGN F TO 606 削除
H edit descriptors 606 FORMAT ( 9H1GOODBYE. ) 削除
Computed GO TO statement     GO TO (10, 20, 30, 40), index (時代遅れ)
文関数     FOIL( X, Y )= X**2 + 2*X*Y + Y**2 (時代遅れ)
DATA statements
  among executable statements
    X= 27.3

    DATA A, B, C / 5.0, 12.0. 13.0 /     . . .

(時代遅れ)
CHARACTER* form of CHARACTER declaration     CHARACTER*8 STRING   ! Use CHARACTER(8) (時代遅れ)
Assumed character length functions
      CHARACTER*(*) STRING
固定フォームソースコード * Column 1 contains * or ! or C for comments.
C       Column 6 for continuation.

"Hello world"の例

program helloworld
print *, "Hello, world."
end program helloworld

Fortran 95

Fortran 95は、マイナーな改訂版である。ほとんどは、Fortran 90規格の、いくつかの大きな問題を解決するためのものである。それにも係わらず、Fortran 95もまた年号を付加されている。それは、Fortranの拡張として定義される並列言語、HPF (High Performance Fortran:ハイ・パフォーマンスFortran)の一部導入によることは明白である。なお、本格的なHPFは、地球シミュレータ等で使用されている[2]:

  • forallと階層化されたwhereがベクトル化のために追加された。
  • ユーザ定義の pureelemental プロセジャーが追加された。
  • 派生タイプコンポーネントのデフォルト初期化、これはポインターの初期化を含むが追加された。
  • データオブジェクトの初期化表記を使うための拡張が追加された。
  • allocatable アレイがスコープから出た時に自動的にdeallocateされることの明確な定義が追加された。

多くの内部関数は拡張された。一例としてmaxloc 内部関数にdim引数が追加された

Fortran 90で時代遅れとされた、いくつかの機能はFortran 95から削除された。

  • REALDOUBLE PRECISION変数を使用したDO ステートメントは削除された。
  • END IFステートメントへのブロック外部からのブランチは削除された。
  • PAUSE ステートメントは削除された。
  • ASSIGNASSIGNGOTO ステートメント、ASSIGNフォーマット指定は削除された。
  • H edit descriptor(いわゆるホレリス定数(en:Hollerith constant))は削除された。

Fortran 95への重要な追加は、一般にはAllocatable TRとして知られる、ISO technical report、TR-15581: Enhanced Data Type Facilitiesである。この仕様は、Fortran 2003準拠のFortran コンパイラより前に、ALLOCATABLE アレイの強化した用法を定義した。そのような用法は、プロセジャーのダミー引数リストとしての派生タイプコンポーネントALLOCATABLEアレイと、関数の返し値を含む。ALLOCATABLEアレイは、POINTER-ベース・アレイより好ましいものである。なぜなら、ALLOCATABLE アレイは、スコープから抜けたとき、Fortran 95による自動的なdeallocateを保証しメモリリークの可能性を無くすからである。

エイリアシングはarrayの参照において最適化の障害にならず、Fortranコンパイラがポインタ-ベース・アレイより高速なコードを生成することを可能にする。

他の重要なFortran 95への追加は ISO technical report TR-15580: 浮動小数点例外ハンドリングである。一般にはIEEE TRとして知られている、この仕様はIEEE 浮動小数点演算と例外ハンドリングを定義する、

条件付コンパイルと可変長文字列

必須のベース言語(ISO/IEC 1539-1:1997に定義)以外に、Fortran 95 言語もまた2つのオプショナルなモジュールを含む:

  • 可変文字列(ISO/IEC 1539-2 : 2000)
  • 条件付コンパイル(ISO/IEC 1539-3 : 1998)

それらは、共にマルチパート国際標準を構成する(ISO/IEC 1539)。規格の開発者によれば、『オプショナル・パートは必要なものを完備した機能を記述している、それは多くのコンパイラ・インプリメンターとユーザーから要求されてきたものである。しかし、それらは、全てのFortran標準に合致するコンパイラは十分な一般性を持たないと考えられていた。それにも係わらず、もし標準に合致したFortranがそのようなオプションを提供するなら、『それらの機能は、標準規格の適切なパートに記述に従って提供されなければならない。』

Fortran 2003

Fortran 2003はメジャーな改訂であり、たくさんの新しい機能を導入した。 FORTRAN2003における新しい機能の包括的なサマリーは、Fortran Working Group (WG5)のオフィシャルWebサイトから得ることができる[6]

この記事から、このバージョンが含む大幅な強化は:

  • 派生タイプの強化:使用法が進歩したコントロール、パラメータ化された派生型、改善された構造化コンストラクタとファイナライザー。
  • オブジェクト指向プログラミングのサポート:オブジェクト指向のタイプの拡張とインヘリタンスポリモーフィズム、ダイナミック・タイプアロケーション、タイプ-バウンド・プロセジャー。
  • データマニピュレーション・エンハンスメント:allocatable コンポーネント (TR 15581の組み入れ)、遅延タイプパラメータ、ボラタイル・アトリビュート、ポインタ-の強化、初期化拡張、内蔵関数の強化。
  • 入出力の強化:非同期転送、ストリーム・アクセス、派生タイプのためのユーザ定義転送オペレーション、ユーザ指定のフォーマット変換時の丸めの制御、接続前のユニットの名前付定数、FLUSH ステートメント、キーワードの規則化、エラーメッセージへのアクセス。
  • プロセジャーのポインター。
  • IEEE 浮動小数点と浮動小数点例外処理のサポート(TR 15580の組み入れ)。
  • C言語との相互運用。
  • 国際的な慣習のサポート:ISO 10646(国際文字セット)の4バイト文字の利用、数値形式の入出力でのデシマル(.)とコンマ(,)の選択。
  • ホスト・オペレーティングシステムとの一体化の強化。コマンドライン引数、環境変数とプロセッサーエラーメッセージ。

Fortran 2003 への重要な追加は、ISO technical report TR-19767である:

Fortranにおけるモジュール機能の強化。このレポートは、submodulesを提供する。これは、FortranのモジュールをよりModula-2のモジュールに近づける。これらは、Adaのプライベート・チャイルド・サブユニットに似ている。これは分離したプログラムユニットとして表現すべきモジュールの仕様と実装を可能にし、大規模なライブラリのパッケージ化を改善し、インターフェース定義を公開しても企業秘密を保持することを可能にし、コンパイレーション・カスケードを防ぐ。

Fortran 2008

最新の規格であり一般にはFortran 2008として知られているISO/IEC 1539-1:2010は2010年9月に承認された [7]。 Fortran 95と同様に、これはマイナー・アップグレードである。Fortran 2003の明確化と訂正と共に、新しい特長も導入された。新しい特長は、以下を含む

  • モジュール構造の追加、ISO/IEC TR 19767:2005にとってかわるサブモジュール。
  • Co-array Fortran―並列計算モデル。
  • do concurrent―相互依存のない繰返しループのための並列DOループ。
  • メモリ上のレイアウトを指定するためのCONTIGUOUS(隣接)属性。
  • コンストラクト・スコープ付のオブジェクトの宣言を含むブロック・コンストラクト。
  • 派生タイプにおける再帰的ポインターの代替としての再帰的アロケータブル・コンポーネント。

ファイナル・ドラフト・スタンダード(FDIS)は、ドキュメントN1830として利用できる [8]

Fortran 2008における重要な追加は、ISOテクニカルスペシフィケーション(TS) 29113のFortranにおけるC言語とのより高いインターオペラビリティであり [9] [10] 、2012年5月のISOの承認に向けてまとめられた。C言語の配列へのFortranアクセスに関してタイプとランクを無視する仕様が加えられた。

言語仕様の変遷

FORTRAN 66以降、ISOANSIJISで仕様が制定されている。 Fortranの言語仕様は、年代によってかなり変化して来ている。他のプログラミング言語実装された構造化プログラミングの機能などがどんどん取り入れられて来ているからである。

初期 (FORTRAN 66)

1966年にANSI X3.9-1966が制定され、JISとしては1967年に制定された。この時は、以下の3つの水準ごとに独立したJISが制定された。共通したタイトルは「電子計算機プログラム用言語 FORTRAN」だった。以下に水準間のおおよその違いを記す。

  • JIS C 6201(水準7000)
    • 複素数型と倍精度実数型がある
    • DATAと初期値設定副プログラム(BLOCK DATA文)がある
    • FORMAT文中の欄記述子にD,G,Aが定義できる
    • 変数配列手続き名は最大6文字
  • JIS C 6202(水準5000)
    • 変数、配列手続き名は最大6文字
  • JIS C 6203(水準3000)
    • 変数、配列、手続き名は最大5文字
    • 論理型のデータ、論理式、関係式、論理IF文は使えない。
    • 宣言文がない。
    • EXTERNAL文がない。
    • 3次元の配列がない。
    • 名前付きCOMMON文がない。
    • 文番号は4桁
    • COMMON文に配列宣言が使えない。
    • 整合配列がない。

なお、1971、1976年に若干の改訂がなされている。

FORTRAN 77時代

国際標準化機構(ISO)は、米国規格協会(ANSI)の X3J3 が作成した FORTRAN の規格 X3.9-1978 を ISO 1539-1980 として定めた。基本水準(subset language)と上位水準(full language)の2種類の水準からなっていた。これを基にして、同じく2水準の JIS C 6201-1982 が制定された。なお、1987年に、JISの分類が変更になり、この規格は JIS X 3001-1982 となった。内容には変更はない。

Fortran 90時代

FORTRAN 77を基に他の言語の特徴を組み込み、言語仕様を近代化しようとしたが、そのため仕様がなかなか決まらず、1991年に ISO/IEC 1539:1991として制定された。JISではそれを受け、JIS X 3001:1994が制定された。

Fortran 95時代

Fortran 2003時代

Fortran 2008時代

FORTRANと教育

教育向けコンパイラ

FORTRANは、情報処理分野で広く使われていたため、学校や会社の教育(情報処理技術者向け教育)で利用された。教育向けには、より詳細なエラー情報を出すための拡張がWaterloo大学でWATFOR(後にWATFIV)コンパイラとして実装された。この実装は日本の大学でも使われた。

Fortranとスーパーコンピュータ

Fortranは科学技術計算用の言語なので、スーパーコンピュータでのプログラミング言語としてよく用いられる。実際、多くのスーパーコンピュータで提供されている言語は、C/C++およびFortranである。

C言語と比較すると、Fortranはスタック等を使わず、コンパイル時に静的に記憶領域を確保するのが基本である。そのため、自由度が高くあらゆる状況を想定しなければならないC言語と比べるとコンパイラはコードを最適化しやすいという利点がある。

Fortranは、いまでも科学技術用行列演算での使用が基本であり、ベクトル型スーパーコンピュータは、Fortranを使ったプログラムで使用することが多い。そこで、スーパーコンピュータの高速演算機能を有効に使うための工夫がなされた。その1つの例としては、自動ベクトル化機能である。ベクトル型のスーパーコンピュータは、多くの演算を同時に行うベクトル演算機能がハードウェアで提供されている。この機能を有効に使うために、FortranのDOループをベクトル演算装置で演算させるために、自動的にベクトル命令にする機能が提供された。また、DOループ内のベクトル演算に適さないものをDOループ外に追い出す機能などもある。たとえば、

DO 100 I=1,N
A(I) = B(I) * C(I)
100 CONTINUE

のようなDO構文は、ほとんどの場合、1から数個のベクトル演算命令にコンパイルされる。そのほかにもDOループの中にIF文を含むような例、たとえば、

DO 110 I=1,N
IF (A(I) .LE. LIMIT) THEN
B(I) = A(I) * Z
END IF
110 CONTINUE

のようなものもベクトル化できる場合がある。これは、いったんAの各要素がLIMIT以下かどうかを示すマスクベクトルを作成し、Aという配列(=ベクトル)に、変数Zをかけるとき、マスクベクトルを参照してベクトル演算を行うことによって、DOループをベクトル化する。

このような作業は、すべてコンパイラが行い、利用者にはできるだけ負担をかけないようにしている。しかし、より高度なベクトル化を行うために、最適化を行う支援ツールが用意されている場合もある。

FORTRANと日本語

コンピュータ上で日本語の文字を扱えるようになると、FORTRANでも日本語を扱う需要が出てきた。そのため、各社(メインフレームを作成していたメーカ)では、独自に言語仕様に日本語の文字を扱えるように拡張した。そのため、各社で日本語の扱い方が異なる事態になった。そこで、JEIDAでは1985年に、JEIDA-42で日本語FORTRANを策定した。

FORTRANで日本語を扱う場合、変数名等には日本語は使えず、文字列や日本語を扱うための専用の型(日本語型)、日本語を入出力するためのFORMAT文の要素の拡張が行われた。

FORTRANベースの言語

FORTRAN 77に先立つFORTRANベースのプリプロセッサは使いやすい言語を提供するために広く使われた。プリプロセスされたコードは、任意のマシンの標準のFORTRANコンパイラでコンパイルすることができるという利点を持つ。これらのプリプロセッサは通常、構造化プログラミング、6文字よりも長い変数名、追加のデータ型、条件付きコンパイル、さらにはマクロ機能をサポートしていた。

ポピュラーなプリプロセッサとしてFLECSとiftran、MORTRAN、SFtran、S-Fortran、Ratfor、Ratfivがあった。例えば、RatforとRatfivはCライクな言語を実装し、プリプロセスにより標準的なFORTRAN 66コードを出力した。Fortran言語の進歩にもかかわらず、プリプロセッサは条件付きコンパイルとマクロ置換のために使用され続けている。

LRLTRANは、ローレンス放射線研究所で、ベクトル演算および動的な記憶、システムのプログラミングをサポートする他の拡張機能を提供するために開発され、ディストリビューションにはLTSSオペレーティングシステムが含まれていた。Fortran 95規格は、任意の条件付きコンパイルの機能を定義するオプションパート3を備えている。この機能は、しばしば 『CoCo』と呼ばれている。多くのFORTRANコンパイラは、それらのシステムにCプリプロセッサのサブセットを取り込んだ。

SIMSCRIPTは、大規模な離散システムのモデリングとシミュレーションのためのアプリケーションに特化したFortranのプリプロセッサである。

プログラミング言語Fは、FORTRANのEQUIVALENCE文などの、冗長、非構造化、非推奨な機能を削除したFortran 95のクリーンなサブセットとして設計された。 FはFortran 90で追加された配列演算の機能を使い、FORTRAN 77とFortran 90で追加された制御文を用い、構造化プログラミングで廃止された制御文を削除した。設計者はFを 『特に教育や科学技術計算に適した、構造化された配列プログラミング言語である。』 と述べている[11]

主な処理系

Windows

フリーソフト
商用ソフト
  • Absoft Pro Fortran
  • Intel Visual Fortran
  • NAG Fortran
  • Lahey Fortran

Linux

フリーソフト
  • GFortran
  • G95
  • Open Watcom Open Watcom
  • Intel Fortran Composer XE 2011 for Linux - 非商用利用に限りフリーで使用可
商用ソフト
  • Absoft Pro Fortran
  • Intel Visual Fortran
  • NAG Fortran
  • Open64
  • PGI Fortran
  • Sun Studio

その他

脚注

  1. 陰山聡『Fortran90/95入門』、なぜFortran90/95か?
  2. 2.0 2.1 HPF推進協議会 (HPFPC)
  3. 牛島省『数値計算のためのFortran 90/95プログラミング入門』森北出版、2007年、はじめに
  4. History of FORTRAN and FORTRAN II — Software Preservation Group
  5. Fortranの開発者ジョン・バッカスが死亡 - Gadgets - MSNBC.com
  6. Fortran Working Group (WG5).It may also be downloaded as a PDF file or gzipped PostScript file, FTP.nag.co.uk
  7. N1836, Summary of Voting/Table of Replies on ISO/IEC FDIS 1539-1, Information technology - Programming languages - Fortran - Part 1: Base language ftp://ftp.nag.co.uk/sc22wg5/N1801-N1850/N1836.pdf (PDF, 101 KiB)
  8. N1830, Information technology, Programming languages, Fortran, Part 1: Base language ftp://ftp.nag.co.uk/sc22wg5/N1801-N1850/N1830.pdf (PDF, 7.9 MiB)
  9. ISO page to ISO/IEC DTS 29113, Further Interoperability of Fortran with C
  10. Draft of the Technical Specification (TS) 29113 ftp://ftp.nag.co.uk/sc22wg5/N1901-N1950/N1917.pdf (PDF, 312 kiB)
  11. F Programming Language Homepage

参考文献

関連項目