FORTRAN

概要

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

ジョン・バッカスは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で効率的なコードを出力したいという強い要求からコンパイラによる最適化技術が大きく進歩した。

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ビットのワードマシンだったので、整数値は2³⁵の大きさの範囲で定義されていた。また、実数の精度は2²⁷、倍精度実数の精度は2⁵⁴までだった。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と呼ばれた。

"Hello world"の例

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

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

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

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

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

Fortranは科学技術計算用の言語なので、スーパーコンピュータでのプログラミング言語としてよく用いられる。実際、多くのスーパーコンピュータで提供されている言語は、C/C++およびFortranである。
C言語と比較すると、Fortranはスタック等を使わず、コンパイル時に静的に記憶領域を確保するのが基本である。そのため、自由度が高くあらゆる状況を想定しなければならないC言語と比べるとコンパイラはコードを最適化しやすいという利点がある。
Fortranは、いまでも科学技術用行列演算での使用が基本であり、ベクトル型スーパーコンピュータは、Fortranを使ったプログラムで使用することが多い。そこで、スーパーコンピュータの高速演算機能を有効に使うための工夫がなされた。その1つの例としては、自動ベクトル化機能である。ベクトル型のスーパーコンピュータは、多くの演算を同時に行うベクトル演算機能がハードウェアで提供されている。この機能を有効に使うために、FortranのDOループをベクトル演算装置で演算させるために、自動的にベクトル命令にする機能が提供された。また、DOループ内のベクトル演算に適さないものをDOループ外に追い出す機能などもある。たとえば、
DO 100 I=1,NA(I) = B(I) * C(I)100 CONTINUE
のようなDO構文は、ほとんどの場合、1から数個のベクトル演算命令にコンパイルされる。そのほかにもDOループの中にIF文を含むような例、たとえば、
DO 110 I=1,NIF (A(I) .LE. LIMIT) THENB(I) = A(I) * ZEND IF110 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を 『特に教育や科学技術計算に適した、構造化された配列プログラミング言語である。』 と述べている。