サムネイル|1956年に発行された最初のFortran解説書『The Fortran Automatic Coding System for the IBM 704』

Fortran(フォートラン)は科学技術計算に向いた手続き型プログラミング言語。1954年にIBMのジョン・バッカスが考案したコンピュータ黎明期の高水準言語であり、その後も改訂されて使用されている。

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

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

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

言語名は大文字 FORTRAN でなく Fortran とつづることが、1990年にISOのJTC1/SC22小委員会のワーキンググループ WG5の会議にて合意されている。 なお、大文字で FORTRAN と表記した場合は FORTRAN 77 以前の FORTRAN を指し、Fortranと表記した場合は Fortran 90 以降を指すことがあるただし、最初の解説書の表紙に「Fortran」とあるように、最初期から先頭のみ大文字の表記も混在していた。。

Fortranの特徴 Fortran 90/95の特徴 Fortran 90/95の特徴は、次のとおりに要約される。

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

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

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

Fortranの歴史

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

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

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

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

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

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

FORTRAN

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

IBM 1401版FORTRAN IBM 1401版は革新的な63 phases現代の我々がいう所の言語処理系のパスではない https://ibm-1401.info/1401-IBM-Systems-Journal-FORTRAN.html を参照のコンパイラであり、わずか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の大きさの範囲で定義されていた。また、実数型実際は単精度浮動小数点数型なのだが、REALという名前のため「実数」と、FORTRANでは歴史的に呼ばれている。の精度は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後の多くの変更を追加し、多くの重要な機能を加えた:

ブロック IFとEND IF ステートメント、オプショナルなELSEとELSE 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を見よ)ループホールスとパスロジカルケースは以前の標準規格から許容されたが、しかし滅多に使用されない。少数の機能は慎重に除去された。

文字列定数をプログラム中で記述するためのホレリス記法、すなわち:

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

ベクトル化のために forallと階層化されたwhereが追加された。 ユーザ定義の pure と elemental 手続きが追加された。 派生型コンポーネントのデフォルト初期化、これにはポインターの初期化が含まれる、が追加された。 データオブジェクトの初期化表記を使うための拡張が追加された。 allocatable 配列はその有効域から出る時には自動的にdeallocateされるということの明確な定義が追加された。

多くの内部手続は拡張された。たとえばmaxloc 内部手続にdim引数が追加された

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

REALとDOUBLE PRECISION変数を使用したDO 文は削除された。 END IF文へのブロック外部からの飛び込みは削除された。 PAUSE 文は削除された。 ASSIGNとASSIGN型GOTO 文、ASSIGN書式指定は削除された。 H 編集子(いわゆるホレリス定数(: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を保証しているので、メモリリークを起こす心配がないからである。

エイリアシングは配列の参照において最適化の障害にならず、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サイトから得ることができるFortran Working Group (WG5).It may also be downloaded as a PDF file or gzipped PostScript file, FTP.nag.co.uk。

この記事によれば、このバージョンが含む大幅な強化は以下の通りである。

派生タイプの強化:使用法が進歩したコントロール、パラメータ化された派生型、改善された構造化コンストラクタとファイナライザー。 オブジェクト指向プログラミングのサポート:オブジェクト指向のタイプの拡張とインヘリタンス、ポリモーフィズム、ダイナミック・タイプアロケーション、タイプ-バウンド・プロセジャー。 データマニピュレーション・エンハンスメント: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月に承認されたN1836, Summary of Voting/Table of Replies on ISO/IEC FDIS 1539-1, Information technology - Programming languages - Fortran - Part 1: Base language 。Fortran 95と同様に、これはマイナー・アップグレードである。Fortran 2003の明確化と訂正と共に、新しい特長も導入された。新しい特長は、以下を含む モジュール構造の追加、ISO/IEC TR 19767:2005にとってかわるサブモジュール。 Co-array Fortran―並列計算モデル。