FORTRAN
FORTRAN(フォートラン)は、1954年にIBMのジョン・バッカスによって考案された、コンピュータにおいて広く使われた世界最初の高水準言語である。
1956年に最初のマニュアルが、1957年にIBM 704用の最初のコンパイラがリリースされた。名前「FORTRAN」は「formula translation」に由来し、FORTRAN 77やFortran 90などの末尾の数字は規格が制定された年を示している。
FORTRANは科学技術計算に向いた手続き型プログラミング言語であり、その長い歴史の間に開発された非常に多くの数学関数やサブルーチンを数値解析ソフトウェアの形で持っている。また、並列計算の並列性を明示的に書くことができ最適化が行いやすく、そのため他の言語より高速である等の理由から、数値予報および気候モデル、構造力学における有限要素法、計算流体力学、計算物理学、計算機化学、計量経済学、動物と植物の品種改良などの大規模な計算を行う分野において、スーパーコンピュータで使われている。
また、ちょうど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 90/95の特徴は、以下のように要約される 。
数値計算プログラムを簡単かつ簡潔に記述できる。
プログラムの誤りを犯しにくい言語である。
数値計算のための便利な道具があらかじめ用意されている。
作成したプログラムを大規模高速演算に使用できる。
無料のコンパイラが公開されている。
広く使われていたFORTRAN 77 の特徴は、以下のように要約される。
ほぼ数学の数式通りに計算式を記述できる。もっともこの特徴は他に計算向きの高級言語がなかった時代の話であり、現代の水準では「プログラミング言語における標準数式表現の始祖」といった方が当たっている。
簡単に出力形式を定義できるFORMAT文や、実際の出力デバイスを意識しないで済む入出力文がある(C言語の標準入出力と似た概念である)。
スタック指向/構造化指向の言語ではない
COMMON文、BLOCK DATA文やSAVE文など、データを静的に割り当てることを前提としている。
プログラム記述の方法がカラム位置に依存している(一部の実装では拡張されている)
ジョン・バッカスは1953年末、メインフレームコンピュータIBM 704のプログラムを開発するにあたり、アセンブリ言語に代わるものを開発することをIBMの上司に提案した。歴史的なFORTRAN開発チームはRichard Goldberg、Sheldon F. Best、Harlan Herrick、Peter Sheridan、Roy Nutt、 Robert Nelson、Irving Ziller、Lois Haibt、David Sayreというメンバーで構成された。
The IBM Mathematical Formula Translating System のドラフト仕様は1954年中旬に作成された。1956年10月にFORTRANの最初のマニュアルが作成され、コンパイラは1957年4月に完成した。顧客はアセンブリ言語で記述されたコードに匹敵するパフォーマンスが得られない限り高級言語を採用しないので、最初から最適化コンパイラが開発された。
この新しい方法がハンドアセンブルより高速に動作するかどうかには疑いの目があったが、プログラム中の命令数を1/20に削減できるので急速に受け入れられていった。IBMの社内誌であるThinkに掲載された1979年のインタビューでバッカスは「私がこの仕事をしたのは面倒くさがりだったからです。私はプログラムを書くことが好きではなかったので、IBM 701でミサイルの軌道計算プログラムを開発したときに、プログラムの開発を簡単にするためにプログラミングシステムを作り始めました。」と語っている。
FORTRANは科学者の間で数学を応用したプログラムの記述に広く用いられたことから、より高速で効率的なコードを出力しようとする原動力となった。またライブラリでなく言語として複素数型をサポートしたことは、電気電子工学における動的特性の計算などに代表される科学や工学分野のプログラムを書きやすくした。
1960年までに様々なバージョンのFORTRANがIBM 709、IBM 650、IBM 1620、IBM 7090で動作していた。FORTRANのユーザー数は急増し、コンピューターメーカーがFORTRANコンパイラをこぞって提供したので、1963年までには40を超えるFORTRANコンパイラが存在していた。こうしたことから、FORTRANはアーキテクチャの異なる様々なコンピュータで広くサポートされた最初の言語と言える。
FORTRAN開発の歴史は、初期のコンパイラ技術の歴史そのものといえる。FORTRANで効率的なコードを出力したいという強い要求からコンパイラによる最適化技術が大きく進歩した。
IBM 704用に開発された最初のFORTRANは32の命令をもっていた。
IBM 1401版は革新的な65パスのコンパイラであり、わずか8k語の磁気コアメモリで動作する。コアに記録されたプログラムが段階的に実行可能なコードへと変換されて上書きされる。変換されたコードは機械語ではなく、UCSD PascalのPコードが生まれるよりも20年も前ながら、中間コードを利用していた。
IBMのFORTRAN IIは1958年に開発された。主な改良点は手続き型プログラミングのサポートであり、サブルーチンや関数を定義できるようになった。
その後、FORTRAN IIのデータ型として、DOUBLE PRECISION(倍精度型)とCOMPLEX(複素数型)が追加された。
IBMは1958年にFORTRAN IIIを開発していた。いくつかの新機能に加えインラインアセンブラが可能であった。しかしながらこのバージョンは販売されなかった。704 FORTRANやFORTRAN IIと同様に、FORTRAN IIIにも移植の妨げになるような機種依存の機能があった。他のベンダーから販売されていたFORTRANも初期は同様の問題を抱えていた。
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に準拠した。
American Standards Association(現ANSI)がFORTRANの米国規格を委員会で制定するようになったことはFORTRANの歴史の要である。1966年に2つの異なる言語が制定された。一つは当時既にデファクトスタンダードであったFORTRAN IVを基にしたFORTRANであり、もう一つはFORTRAN IIを基にして機種依存部分を取り除いたBasic FORTRANである。最初に制定されたFORTRANの規格は後にFORTRAN 66と呼ばれた。
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 コードの文字順序に基づいた、文字列比較のための内部命令セット(<CODE>LGE, LGT, LLE, LLT</CODE>)。
この規格の改訂において、多くの機能は除去されるか変えられて、以前の標準に合致していたプログラムの多くはおそらく無効になった。この時点で除去はX3J3の代替だけが許容された。だからコンセプト "不賛成"はANSI標準においては利用できなかった。しかし、コンフリクトリストの24アイテム(Appendix A2 of X3.9-1978を見よ)ループホールスとパスロジカルケースは以前の標準規格から許容されたが、しかし滅多に使用されない。少数の機能は慎重に除去された。
文字列定数をプログラム中で記述するためのホレリス記法、すなわち:
<TT> GREET = 12HHELLO THERE! </TT>
FORMAT 記述子におけるH編集(ホレリス・フィールド)の読み込み(以前はH編集子で確保された文字列データの領域には入力文で文字列を読み込めた(データが上書きされる)そのFORMAT文を使って出力すると,書き換えられたデータが使われて出力される)。
配列の定義時の添字の範囲を超えたアクセス。
<CODE>DIMENSION A(10,5)</CODE>
<CODE>Y= A(11,1)</CODE>
DOループの途中でいったん外に飛び出して後で戻る("エクステンデット・レンジ"(DOループの拡張範囲)として知られる)。
以前の規格では文字型(CHARACTER型)がなかったので、文字データや文字列データを整数や実数の変数や配列に格納することが行われていたが、Fortran77ではそれを廃止した。
一般にFortran 90 として知られている規格は、大幅に発表が遅れたもののFORTRAN 77の正当な継承者であり、最終的に1991年にISO規格、1992年にANSI規格としてリリースされた。この抜本的な改訂では1978年のFORTRAN 77規格制定からのプログラミング技術における大幅な変化を反映するために、以下の多くの新しい機能が加えられた
フリーフォームソース入力と小文字のFortranキーワード。プログラム本文を7桁目から書かなくても良く、80桁の制限も無い。
最長31文字までの識別子。
インラインコメント。
配列演算(あるいは部分配列演算)。これは数学とエンジニアリングの計算を大幅に簡素化する。
全部または部分マスクされた、配列の指定と配列の表現、例えば、
選択的配列のアサインのためのwhere文。
配列の定数と式による初期化。
ユーザ定義の配列を返す関数と配列コンストラクタ。
再帰手続き。
モジュラープログラム、すなわち関係するサブルーチンとデータのグループ化と、他のプログラムユニットで使用、モジュールの内の指定した部分だけの使用を含む。
interface文を使用してコンパイル時に型がチェックされる大幅に改善された引数渡しメカニズム。
ユーザー定義総称関数(同じ関数名で、引数の数とタイプを自動的に識別して異なる内部関数を呼び出す)のインターフェース。
演算子('+'、'-'、など)のオーバーローディング(多重定義)。
派生型データタイプ。
変数のデータタイプと他の属性を指定するための新たなデータタイプの宣言シンタックス、
allocatable属性と allocateとdeallocate文を用いたダイナミックメモリアロケーション。
ポインター属性とポインターアサイン、nullify文によるダイナミックデータ構造の扱い。
do 文の end do による終端。
do while 文
exit文によるdo文からの脱出と、cycle文によるdo文の次の繰り返しへの移行。
select文。
ユーザがコントロールできる数値精度の移植性の良い指定方法。
新しく導入された内部関数。それに伴い従来の文関数(statement function)は廃止予定に。
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 edit descriptor(いわゆるホレリス定数(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はメジャーな改訂であり、たくさんの新しい機能を導入した。 Fortran2003における新しい機能の包括的なサマリーは、Fortran Working Group (WG5)のオフィシャルWebサイトから得ることができる。
この記事によれば、このバージョンが含む大幅な強化は以下の通りである。
派生タイプの強化:使用法が進歩したコントロール、パラメータ化された派生型、改善された構造化コンストラクタとファイナライザー。
オブジェクト指向プログラミングのサポート:オブジェクト指向のタイプの拡張とインヘリタンス、ポリモーフィズム、ダイナミック・タイプアロケーション、タイプ-バウンド・プロセジャー。
データマニピュレーション・エンハンスメント: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として知られているISO/IEC 1539-1:2010は2010年9月に承認された。Fortran 95と同様に、これはマイナー・アップグレードである。Fortran 2003の明確化と訂正と共に、新しい特長も導入された。新しい特長は、以下を含む
モジュール構造の追加、ISO/IEC TR 19767:2005にとってかわるサブモジュール。
Co-array Fortran―並列計算モデル。
do concurrent―相互依存のないループを並列に実行するDOループ。
メモリ上のレイアウトを指定するためのCONTIGUOUS(隣接)属性。
コンストラクト・スコープ付のオブジェクトの宣言を含むブロック・コンストラクト。
派生タイプにおける再帰的ポインターの代替としての再帰的アロケータブル・コンポーネント。
ファイナル・ドラフト・スタンダード(FDIS)は、ドキュメントN1830として利用できる。
Fortran 2008における重要な追加は、ISOテクニカルスペシフィケーション(TS) 29113のFortranにおけるC言語とのより高いインターオペラビリティであり、2012年5月のISOの承認に向けてまとめられた。C言語の配列へのFortranアクセスに関してタイプとランクを無視する仕様が加えられた。
Fortran 2018の最新版は、以前はFortran 2015と呼ばれていた。大きな改訂が行われ、2018年11月28日にリリースされた。
Fortran 2018には、それ以前に公開された以下の2つの技術仕様が含まれている。
ISO/IEC TS 29113:2012 Further Interoperability with C
ISO/IEC TS 18508:2015 Additional Parallel Features in Fortran
追加の変更と新機能には、ISO/IEC/IEEE 60559:2011(2019年時点のIEEE浮動小数点数仕様の最新版)のサポート、16進の入出力、IMPLICIT NONE拡張など、様々な変更が含まれている。
1968年にBASICの作者等によって書かれた専門雑誌の記事でもすでに「旧式の(old-fashioned)プログラミング言語」と記述されていたが、Fortranは現在でも数十年に渡って使用されており、特に科学や工学のコミュニティでは、Fortranで書かれたソフトウェアが日常的に幅広く利用されている。ジェイ・パサコフは1984年に「物理学と気象学の学生はFORTRANを必ず学ぶ必要がある。大部分の成果がFORTRANで書かれており、科学者たちがPascalやModula-2などの他の言語に移行する可能性は極めて低い。」と書いている。1993年、Cecil E. Leithは、FORTRANを「科学計算の母語」であると評し、他の言語によって置き換えられる可能性は「永遠の希望であり続けるだろう」と述べている。
FORTRAN 66以降、ISO、ANSI、JISで仕様が制定されている。Fortranの言語仕様は、年代によってかなり変化して来ている。他のプログラミング言語で実装された構造化プログラミングの機能などがどんどん取り入れられて来ているからである。
FORTRAN 66とFORTRAN 77の言語仕様の詳細は、FORTRAN 77の言語仕様を参照のこと。
Fortran 90以降の言語仕様の詳細は、Fortranの言語仕様を参照のこと。
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文がない。
COMMON文に配列宣言が使えない。
整合配列がない。
なお、1971、1976年に若干の改訂がなされている。
国際標準化機構(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 77を基に他の言語の特徴を組み込み、言語仕様を近代化しようとしたが、そのため仕様がなかなか決まらず、1991年に ISO/IEC 1539:1991として制定された。JISではそれを受け、JIS X 3001:1994が制定された。
JIS X 3001:1998では,Fortran 95と通称される規格が引用されている。該規格は一部例外を除きJIS X 3001 1-1994の上位互換拡張である。
JIS X 3001:2009では,Fortran 2003と通称される規格が引用されている。当該規格は一部の例外を除いてJIS X 3001-1:1998の上位互換拡張である。
対応するJISは制定されなかった。
JIS X 3001-1:2023(2023年現在の最新改正版)では,Fortran 2018と通称される規格が引用されている。
FORTRANは、情報処理分野で広く使われていたため、学校や会社の教育(情報処理技術者向け教育)で利用された。教育向けには、より詳細なエラー情報を出すための拡張がWaterloo大学でWATFOR(後にWATFIV)コンパイラとして実装された。この実装は日本の大学でも使われた。
Fortranは科学技術計算用の言語なので、スーパーコンピュータでのプログラミング言語としてよく用いられる。実際、多くのスーパーコンピュータでベンダーが主に注力して提供されている言語は、C/C++およびFortranである。
C言語と比較すると、Fortranはスタック等を使わずに、コンパイル時に静的に記憶領域を確保するのが基本であった。そのため、自由度が高くあらゆる状況を想定しなければならないC言語と比べるとコンパイラはコードを最適化しやすいという利点がある。
Fortranの主な用途である科学と技術用の計算では配列を用いた演算が基本であり、ベクトル型スーパーコンピュータは、Fortranを使ったプログラムで使用することが多い。そこで、スーパーコンピュータの高速演算機能を有効に使うための工夫がなされた。その1つの例としては、自動ベクトル化機能である。ベクトル型のスーパーコンピュータは、多くの演算を同時に行うベクトル演算機能がハードウェアで提供されている。この機能を有効に使うために、FortranのDOループをベクトル演算装置で演算させるために、自動的にベクトル命令にする機能が提供された。また、DOループ内のベクトル演算に適さないものをDOループ外に追い出す機能などもある。たとえば、
のようなDO構文は、ほとんどの場合、1から数個のベクトル演算命令にコンパイルされる。そのほかにもDOループの中にIF文を含むような例、たとえば、
のようなものもベクトル化できる場合がある。これは、いったんAの各要素がLIMIT以下かどうかを示すマスクベクトルを作成して、Aという配列(=ベクトル)に、変数Zの値を乗じるとき、マスクベクトルを参照するベクトル演算を行うことで、DOループをベクトル化する。