The IBM Mathematical Formula Translating System のドラフト仕様は1954年中旬に作成された。1956年10月にFortranの最初のマニュアルが作成され、コンパイラは1957年4月に完成した。顧客はアセンブリ言語で記述されたコードに匹敵するパフォーマンスが得られない限り高級言語を採用しないので、最初から最適化コンパイラが開発された。
この新しい方法がハンドアセンブルより高速に動作するかどうかには疑いの目があったが、プログラム中の命令数を1/20に削減できるので急速に受け入れられていった。IBMの社内誌であるThinkに掲載された1979年のインタビューでバッカスは「私がこの仕事をしたのは面倒くさがりだったからです。私はプログラムを書くことが好きではなかったので、IBM 701でミサイルの軌道計算プログラムを開発したときに、プログラムの開発を簡単にするためにプログラミングシステムを作り始めました。」[6]と語っている。
Fortranは科学者の間で数学を応用したプログラムの記述に広く用いられたことから、より高速で効率的なコードを出力しようとする原動力となった。また、ライブラリでなく言語として複素数型をサポートしたことは、電気電子工学における動的特性の計算などに代表される科学や工学分野のプログラムを書きやすくした。
1960年までに様々なバージョンのFORTRANがIBM 709、IBM 650、IBM 1620、IBM 7090で動作していた。FORTRANのユーザー数は急増し、コンピューターメーカーがFORTRANコンパイラをこぞって提供したので、1963年までには40を超えるFORTRANコンパイラが存在していた。こうしたことから、FORTRANはアーキテクチャの異なる様々なコンピュータで広くサポートされた最初の言語と言える。
Fortran開発の歴史は、初期のコンパイラ技術の歴史そのものといえる。Fortranで効率的なコードを出力したいという強い要求からコンパイラによる最適化技術が大きく進歩した。
FORTRANIBM 704 メインフレーム
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後の多くの変更を追加し、多くの重要な機能を加えた: この規格の改訂において、多くの機能は除去されるか変えられて、以前の標準に合致していたプログラムの多くはおそらく無効になった。この時点で除去はX3J3の代替だけが許容された。だからコンセプト "不賛成"はANSI標準においては利用できなかった。しかし、コンフリクトリストの24アイテム(Appendix A2 of X3.9-1978を見よ)ループホールスとパスロジカルケースは以前の標準規格から許容されたが、しかし滅多に使用されない。少数の機能は慎重に除去された。 一般にFortran 90 として知られている規格は、大幅に発表が遅れたもののFORTRAN 77の正当な継承者であり、最終的に1991年にISO規格、1992年にANSI規格としてリリースされた。この抜本的な改訂では1978年のFORTRAN 77規格制定からのプログラミング技術における大幅な変化を反映するために、以下の多くの新しい機能が加えられた 以前のバージョンとは異なり、Fortran 90は、何の機能も削除しなかった。(Appendix B.1には、「この規格の、削除した機能のリストは空である。」と記載されている)つまり、FORTRAN 77に準拠したプログラムは、Fortran 90にもまた準拠している。そして、両方の規格で、その動作が定義づけられた項目は使用可能でなければならない。一部の機能はFortran 95で「削除」され、また機能の小さな部分は「時代遅れ」と認定されて将来の規格で除去されることが予定された。 削除または時代遅れとされた機能の一覧時代遅れの機能例状態 / Fortran 95での予定 END IFへのブランチ66 GO TO 77 ; . . . IF (E) THEN ; . . . 77 END IF削除
IBM 1401版FORTRAN
FORTRAN II
FORTRAN III
FORTRAN IV
FORTRAN 66
FORTRAN 77
ブロック 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)。
文字列定数をプログラム中で記述するためのホレリス記法、すなわち:
GREET = 12HHELLO THERE!
FORMAT 記述子におけるH編集(ホレリス・フィールド)の読み込み(以前はH編集子で確保された文字列データの領域には入力文で文字列を読み込めた(データが上書きされる)そのFORMAT文を使って出力すると,書き換えられたデータが使われて出力される)。
配列の定義時の添字の範囲を超えたアクセス。
DIMENSION A(10,5)Y= A(11,1)
DOループの途中でいったん外に飛び出して後で戻る("エクステンデット・レンジ"(DOループの拡張範囲)として知られる)。
以前の規格では文字型(CHARACTER型)がなかったので、文字データや文字列データを整数や実数の変数や配列に格納することが行われていたが、Fortran77ではそれを廃止した。
Fortran 90
フリーフォームソース入力と小文字のFortranキーワード。プログラム本文を7桁目から書かなくても良く、80桁の制限も無い。
if (x<0) thenx=0end 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.0elsewhere b = 1.0end 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 sampleend interfaceend 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 ifend do
select文。
select case (sw)case ('++') a = a + 1case ('--') a = a - 1case default a = 0end select
ユーザがコントロールできる数値精度の移植性の良い指定方法。
a = 1.0e0_kind(1.0d0)
新しく導入された内部関数。それに伴い従来の文関数(statement function)は廃止予定に。
削除または時代遅れとされた機能の一覧
算術 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, 109 L= J + K
ブロック外部からの
Alternate return CALL SUBR( X, Y *100, *200 )
PAUSE文 PAUSE 600削除
ASSIGN statement
と assigned GO TO statement100 . . . 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)(時代遅れ)
Size:80 KB
出典: フリー百科事典『ウィキペディア(Wikipedia)』
担当:undef