FORTRAN

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

FORTRAN
1956年に発行された最初のFORTRAN解説書『The Fortran Automatic Coding System for the IBM 704
パラダイム 構造化プログラミングオブジェクト指向プログラミング手続き型プログラミングジェネリックプログラミング命令型プログラミング、配列プログラミング 
登場時期 1954年 1954
開発者 IBMジョン・バッカス 
最新リリース Fortran 2018
型付け 強い静的型付け
主な処理系 Absoft, Cray, CUDA, Fortran Builder, GFortran, G95, Intel, Lahey/Fujitsu, Open Watcom, Pathscale, PGI, Silverfrost, Sun, XL Fortran, Visual Fortran ほか
影響を受けた言語 Speedcoding 
影響を与えた言語 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 ほか
ウェブサイト
拡張子 f、for、f90 

概要

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の歴史

パンチカードに記された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は科学者の間で数学を応用したプログラムの記述に広く用いられたことから、より高速で効率的なコードを出力しようとする原動力となった。またライブラリでなく言語として複素数をサポートしたことは、電気電子工学における動的特性の計算などに代表される科学や工学分野のプログラムを書きやすくした。

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編集(ホレリス・フィールド)の読み込み(以前はH編集子で確保された文字列データの領域には入力文で文字列を読み込めた(データが上書きされる)そのFORMAT文を使って出力すると,書き換えられたデータが使われて出力される)。
  • 配列の定義時の添字の範囲を超えたアクセス。
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 文     IF (X) 10, 20, 30
非-整数型の DO パラメータ あるいは制御変数     DO 9 X= 1.7, 1.6, -0.1 削除
DOループの末端の共有 もしくは
END DO あるいは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 編集子 606 FORMAT ( 9H1GOODBYE. ) 削除
計算 GO TO 文     GO TO (10, 20, 30, 40), index (時代遅れ)
文関数     FOIL( X, Y )= X**2 + 2*X*Y + Y**2 (時代遅れ)
DATA 文
  among executable statements
    X= 27.3

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

(時代遅れ)
CHARACTER* の形式による文字型宣言     CHARACTER*8 STRING   ! Use CHARACTER(8) (時代遅れ)
Assumed character length functions
      CHARACTER*(*) STRING
固定長形式のソースコード * 第1カラムが * あるいは ! あるいは C である行は注釈行.
C       第6カラムが空白でなければ継続行.文番号は先頭から5桁目までに書く。

"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 2018

Fortran 2018の最新版は、以前はFortran 2015と呼ばれていた[11]。大きな改訂が行われ、2018年11月28日にリリースされた[12]

Fortran 2018には、それ以前に公開された以下の2つの技術仕様が含まれている。

  • ISO/IEC TS 29113:2012 Further Interoperability with C[13]
  • ISO/IEC TS 18508:2015 Additional Parallel Features in Fortran[14]

追加の変更と新機能には、ISO/IEC/IEEE 60559:2011(2019年時点のIEEE浮動小数点数仕様の最新版)のサポート、16進の入出力、IMPLICIT NONE拡張など、様々な変更が含まれている[15][16][17][18]

科学分野と工学分野での利用

1968年にBASICの作者等によって書かれた専門雑誌の記事でもすでに「旧式の(old-fashioned)プログラミング言語」と記述されていたが[19]、Fortranは現在でも数十年に渡って使用されており、特に科学や工学のコミュニティでは、Fortranで書かれたソフトウェアが日常的に幅広く利用されている[20]ジェイ・パサコフは1984年に「物理学と気象学の学生はFORTRANを必ず学ぶ必要がある。大部分の成果がFORTRANで書かれており、科学者たちがPascalやModula-2などの他の言語に移行する可能性は極めて低い。」と書いている[21]。1993年、Cecil E. Leithは、FORTRANを「科学計算の母語」であると評し、他の言語によって置き換えられる可能性は「永遠の希望であり続けるだろう」と述べている[22]

言語仕様の変遷

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時代

JIS X 3001:1998では,Fortran 95と通称される規格が引用されている。該規格は一部例外を除きJIS X 3001 1-1994の上位互換拡張である。

Fortran 2003時代

JIS X 3001:2009(2019年現在の最新改正版)では,Fortran 2003と通称される規格が引用されている。該規格は一部例外を除きJIS X 3001-1:1998の上位互換拡張である[23]

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コードを出力した。

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

また多くのFORTRANコンパイラは、Cプリプロセッサのサブセットを取り込んだ。 Fortran言語の進歩にもかかわらず、プリプロセッサは条件付きコンパイルとマクロ置換のために使用され続けている。

プログラミング言語Fは、FORTRANのEQUIVALENCE文などの、冗長、非構造化、非推奨な機能を削除したFortran 95のクリーンなサブセットとして設計された。言語FはFortran 90で追加された配列演算の機能を使い、FORTRAN 77とFortran 90で追加された制御文を用い、構造化プログラミングのために廃止された制御文を削除した。設計者は言語Fを 『特に教育や科学技術計算に適した、構造化された配列プログラミング言語である。』 と述べている[24]。しかしサブセット言語であるから,旧来のあるいはFで除かれた機能を含むFortranのソースコードは受け付けないため、実務用には普及しなかった。

HPF(High Performance Fortran)というFortran拡張系の言語もあるが、これもほぼ廃れた。

主な処理系

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 - 非商用利用に限りフリーで使用可
  • Oracle developer studio - 開発向けに無期限の無償ライセンス
  • NVIDIA HPC SDK - ライセンス契約への同意が必要
商用ソフト
  • Absoft Pro Fortran
  • Intel Visual Fortran
  • NAG Fortran
  • Open64
  • PGI Fortran
  • Sun Studio

その他

出典

  1. 陰山聡『Fortran90/95入門』、なぜFortran90/95か?
  2. 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. Doctor Fortran in "Eighteen is the new Fifteen"”. Software.intel.com. 2017年11月20日閲覧。
  12. Fortran 2018”. ISO. 2018年11月30日閲覧。
  13. Further Interoperability with C”. ISO. 2017年11月20日閲覧。
  14. Additional Parallel Features in Fortran”. ISO. 2017年11月20日閲覧。
  15. The New Features of Fortran 2015”. ISO. 2017年6月23日閲覧。
  16. Doctor Fortran in "One Door Closes"”. Software.intel.com. 2015年9月21日閲覧。
  17. Doctor Fortran Goes Dutch: Fortran 2015”. Software.intel.com. 2014年11月19日閲覧。
  18. Fortran 2018 Interpretation Document, 9 October 2018
  19. Kemeny, John G.; Kurtz, Thomas E. (11 October 1968). “Dartmouth Time-Sharing”. Science 162 (3850): 223–228. doi:10.1126/science.162.3850.223. http://dtss.dartmouth.edu/sciencearticle/index.html.
  20. Phillips, Lee. Scientific computing's future: Can any coding language top a 1950s behemoth?”. Ars Technica. 2014年5月8日閲覧。
  21. Pasachoff, Jay M. (1984年4月). “Scientists: FORTRAN vs. Modula-2”. BYTE: pp. 404. https://archive.org/stream/byte-magazine-1984-04/1984_04_BYTE_09-04_Real-World_Interfacing#page/n403/mode/2up 2015年2月6日閲覧。
  22. Galperin, Boris (1993). “26”. Large Eddy Simulation of Complex Engineering and Geophysical Flows. London: Cambridgey. p. 573. ISBN 978-0-521-43009-8
  23. JIS X 3001-1:2009「プログラム言語Fortran――第1部: 基底言語」日本産業標準調査会経済産業省
  24. F Programming Language Homepage

参考文献

  • 浦昭二『FORTRAN 入門』培風館、(1966,1972,1980,1983年)。
  • 浦昭二、近藤頌子、土居範久、原田賢一『FORTRAN 77入門』培風館、(1982年)。
  • 森口繁一:「JIS FORTRAN入門 (上)」第3版、東京大学出版会、ISBN978-4130620307、(1984年1月)。
  • 西村恕彦, 酒井俊夫, 高田正之:「岩波FORTRAN辞典」、岩波書店、ISBN978-4000098816、(1986年12月8日)。※ Fortran77(まで)の規格を記述した辞典。
  • 森正武:「FORTRAN77数値計算プログラミング」増補版、岩波書店、(1987年)。
  • 秋冨勝:「学生のためのFORTRAN―JIS上位水準による」、東京電機大学出版局、ISBN978-4501515300、 (1990年4月1日)。
  • M. Metcalf, J. Reid: bit 別冊「詳解Fortran90」、共立出版(1993年12月1日)。※ 原著は "Fortran 90 Explained"、Oxford Univ. Press(1990年)。
  • Walter S. Brainerd, Charles H. Goldberg, Jeanne C. Adams: "Programmer's guide to Fortran 90"(3rd Ed.)、Springer、(1996年)。
  • 竹澤照:「Fortran II 数値計算」、共立出版、ISBN 4-320-02868-6、(1997年5月10日)。
  • 新井親夫:「Fortran90入門-基礎から再帰手続きまで-」、森北出版、ISBN978-4627839816、 (1998年9月1日)。
  • 冨田博之、齋藤泰洋:「Fortran90/95プログラミング」、培風館 (1999年2月26日)。 ※ 2011年4月に改訂新版が出ている。
  • 竹澤照:「Forran III データ構造とアルゴリズム」、共立出版、ISBN 4-320-02937-2、 (1999年7月10日)。
  • Ed Akin: "Object-Oriented Programming via Fortran 90/95"、Cambridge Univ Press、ISBN 978-0-521-52408-7、(2003年1月13日)。
  • 牛島省:『数値計算のためのFortran 90/95プログラミング入門』森北出版、ISBN 978-4-627-84721-7、(2007年)。※ 第2版が2020年1月に出版。
  • 竹澤照:「Fortran I 基礎」(第2版)、共立出版、ISBN 4-320-02977-1、(2000年8月20日)※ 初版は(1995年4月25日)。
  • Walter S. Brainerd: "Guide to Fortran 2003 Programming"、Springer、ISBN 978-1-84882-542-0、(2009年)。
  • Jeanne C. Adams, Walter S. Brainerd, Richard A. Hendrickson, Richard E. Maine, Jeanne T. Martin, Brian T. Smith: "The Fortran 2003 Handbook - The Complete Syntax, Features and Procedures"、Springer、ISBN 978-1-84628-378-9、(2009年)。
  • 冨田博之, 齋藤泰洋:「Fortran90/95プログラミング」改訂新版、培風館、ISBN978-4-563-01587-9、(2011年4月1日)。
  • Michael Metcalf, John Reid, Malcolm Cohen: "Modern Fortran Explained" (Numerical Mathematics and Scientific Computation) (4th Ed.)、Oxford Univ Press、ISBN978-0199601417、(2011年5月19日)。
  • Norman S. Clerman, Walter Spector: "Modern Fortran: Style and Usage"、Cambridge University Press、ISBN978-0-521-51453-8、(2012年2月23日)。
  • 安田清和, 水野正隆, 小野 英樹:「Fortran90/95による実践プログラミング」、大阪大学出版会、ISBN978-4872594737、(2014年3月28日)。
  • 田口俊弘:「Fortran ハンドブック」、技術評論社、ISBN978-4774175065、(2015年7月10日)。
  • Walter S. Brainerd: "Guide to Fortran 2008 Programming"(2nd Ed.)、Springer、ISBN978-1447167587、(2015年9月25日)。
  • 日向俊二:「Fortran 2008入門」、カットシステム、ISBN978-4-87783-399-2、(2016年4月)。
  • Michael Metcalf, John Reid, Malcolm Cohen: "Modern Fortran Explained: Incorporating Fortran 2018" (5th Ed.)、Oxford Univ. Press、ISBN978-0198811886、(2018年11月6日)。
  • Mark Jones Lorenzo: "Abstracting Away the Machine: The History of the FORTRAN Programming Language (FORmula TRANslation)"、Independently published、ISBN978-1082395949、(2019年8月22日)。
  • 牛島省:「数値計算のためのFortran90/95プログラミング入門(第2版)」、森北出版、ISBN 978-4627847224 (2020年1月28日)。

関連項目

外部リンク

This article is issued from Wikipedia. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.