出典(authority):フリー百科事典『ウィキペディア(Wikipedia)』「2013/05/06 18:49:18」(JST)
FORTRAN | |
---|---|
The Fortran Automatic Coding System for the IBM 704 (15 October 1956), the first Programmer's Reference Manual for Fortran
|
|
パラダイム | 手続き型・構造化・命令型・オブジェクト指向 |
登場時期 | 1957年 |
開発者 | IBM(ジョン・バッカス) |
最新リリース | Fortran 2008 |
型付け | 強い静的型付け |
主な処理系 | Absoft, Cray, CUDA, Fortran Builder, GFortran, G95, Intel, Lahey/Fujitsu, Open Watcom, Pathscale, PGI, Silverfrost, Sun, XL Fortran, Visual Fortran ほか |
影響を与えた言語 | 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 ほか |
テンプレートを表示 |
プログラミング言語
■カテゴリ / ■テンプレート
FORTRAN(フォートラン)は、1954年にIBMのジョン・バッカスによって考案されたコンピュータにおける最初の、広く使われた高水準言語である。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 90/95の特徴は、以下のように要約される[3] 。
広く使われていたFORTRAN 77 の特徴は、以下のように要約される。
ジョン・バッカスは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は科学者の間で数学を応用したプログラムの記述に広く用いられたことから、より高速で効率的なコードを出力しようとする原動力となった。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文が加えられた。この時のターゲットマシンはワードマシンだったので、整数値は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
ステートメント。改善された言語サポートのための構造化プログラミング。OPEN
, CLOSE
, と INQUIRE
文。IMPLICIT
文。CHARACTER
データ・タイプ。文字の入出力と処理のための大幅な増補。PARAMETER
定数を指定するためのステートメント。SAVE
ステートメント。LGE, LGT, LLE, LLT
)。この規格の改訂において、多くの機能は除去されるか変えられ、以前の標準に合致する多くのプログラムはおそらく無効になった。 この時点で除去はX3J3の代替だけが許容された。だからコンセプト "不賛成"はANSI標準においては利用できなかった。しかし、コンフリクトリストの24アイテム(Appendix A2 of X3.9-1978を見よ)ループホールスとパスロジカルケースは以前の標準規格から許容されたが、しかし滅多に使用されない。 少数の機能は慎重に除去された:
DIMENSION A(10,5)
Y= A(11,1)
一般にFortran 90 として知られている規格は、大幅に発表が遅れたもののFORTRAN 77の正当な継承者であり、最終的に1991年にISO規格、1992年にANSI規格としてリリースされた。この抜本的な改訂では1978年のFORTRAN 77規格制定からのプログラミング技術における大幅な変化を反映するために、以下の多くの新しい機能が加えられた:
if (x<0) then x=0 end if
abcdefghijklmnopqrstuvwxyz12345=0.0e0
! これは"!"を用いたコメントです
x(1:n)=r(1:n)*cos(a(1:n))
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
module my_lib !モジュール interface function sample(x) real,intent(in)::x(:)!コンパイル時に変数の型の整合性とデータの入出力方向がチェックされる。 .... end function sample end interface end module
real,allocatable::temp(:) allocate(temp(nn)) deallocate(temp)
do i=1,nn if (b(i) /= 0) then a(i) = 1.0 / b(i) else exit end if end do
select case (sw) case ('++') a = a + 1 case ('--') a = a - 1 case default a = 0 end select
a=1.0e0_kind(1.0d0)
以前のバージョンとは異なり、Fortran 90は、何の機能も削除しなかった。 (Appendix B.1 は『この規格の、削除した機能のリストは空である。』と言っている。) つまり、FORTRAN 77に準拠したプログラムは、Fortran 90にもまた準拠している。 そして、両方の規格で、その動作が定義づけられた項目は使用可能でなければならない。 一部の機能はFortran 95で『削除』され、また機能の小さな部分は『時代遅れ』と認定されて将来の規格で除去されることが予定された。
時代遅れの機能 | 例 | 状態 / Fortran 95での予定 |
---|---|---|
算術 IF-statement | IF (X) 10, 20, 30 |
|
非-整数 DO パラメータ あるいは制御変数 | DO 9 X= 1.7, 1.6, -0.1 |
削除 |
Shared DO-loop termination or termination with a statement |
DO 9 J= 1, 10
|
|
ブロック外部からの END IFへのブランチ |
66 GO TO 77 ; . . .
|
削除 |
Alternate return | CALL SUBR( X, Y *100, *200 ) |
|
PAUSE文 | PAUSE 600 |
削除 |
ASSIGN statement と assigned GO TO statement |
100 . . .
|
削除 |
Assigned FORMAT specifiers | ASSIGN F TO 606 |
削除 |
H edit descriptors | 606 FORMAT ( 9H1GOODBYE. ) |
削除 |
Computed GO TO statement | GO TO (10, 20, 30, 40), index |
(時代遅れ) |
文関数 | FOIL( X, Y )= X**2 + 2*X*Y + Y**2 |
(時代遅れ) |
DATA statements among executable statements |
X= 27.3
|
(時代遅れ) |
CHARACTER* form of CHARACTER declaration | CHARACTER*8 STRING ! Use CHARACTER(8) |
(時代遅れ) |
Assumed character length functions | ||
固定フォームソースコード | * Column 1 contains * or ! or C for comments. C Column 6 for continuation. |
program helloworld print *, "Hello, world." end program helloworld
Fortran 95は、マイナーな改訂版である。 ほとんどは、Fortran 90規格の、いくつかの大きな問題を解決するためのものである。 それにも係わらず、Fortran 95もまた年号を付加されている。 それは、Fortranの拡張として定義される並列言語、HPF (High Performance Fortran:ハイ・パフォーマンスFortran)の一部導入によることは明白である。なお、本格的なHPFは、地球シミュレータ等で使用されている[2]:
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(いわゆるホレリス定数(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)。規格の開発者によれば、『オプショナル・パートは必要なものを完備した機能を記述している、それは多くのコンパイラ・インプリメンターとユーザーから要求されてきたものである。しかし、それらは、全てのFortran標準に合致するコンパイラは十分な一般性を持たないと考えられていた。それにも係わらず、もし標準に合致したFortranがそのようなオプションを提供するなら、『それらの機能は、標準規格の適切なパートに記述に従って提供されなければならない。』
Fortran 2003はメジャーな改訂であり、たくさんの新しい機能を導入した。 FORTRAN2003における新しい機能の包括的なサマリーは、Fortran Working Group (WG5)のオフィシャルWebサイトから得ることができる[6]。
この記事から、このバージョンが含む大幅な強化は:
FLUSH
ステートメント、キーワードの規則化、エラーメッセージへのアクセス。Fortran 2003 への重要な追加は、ISO technical report TR-19767である:
Fortranにおけるモジュール機能の強化。このレポートは、submodulesを提供する。これは、FortranのモジュールをよりModula-2のモジュールに近づける。 これらは、Adaのプライベート・チャイルド・サブユニットに似ている。 これは分離したプログラムユニットとして表現すべきモジュールの仕様と実装を可能にし、大規模なライブラリのパッケージ化を改善し、インターフェース定義を公開しても企業秘密を保持することを可能にし、コンパイレーション・カスケードを防ぐ。
最新の規格であり一般にはFortran 2008として知られているISO/IEC 1539-1:2010は2010年9月に承認された [7]。 Fortran 95と同様に、これはマイナー・アップグレードである。 Fortran 2003の明確化と訂正と共に、新しい特長も導入された。 新しい特長は、以下を含む:
ファイナル・ドラフト・スタンダード(FDIS)は、ドキュメントN1830として利用できる [8]。
Fortran 2008における重要な追加は、ISOテクニカルスペシフィケーション(TS) 29113のFortranにおけるC言語とのより高いインターオペラビリティであり [9] [10] 、2012年5月のISOの承認に向けてまとめられた。 C言語の配列へのFortranアクセスに関してタイプとランクを無視する仕様が加えられた。
JISにおける仕様は、以下のように変遷している。
1967年に、JISとして制定された。この時は、以下の3つの水準ごとに独立したJISが制定された。共通したタイトルは「電子計算機プログラム用言語 FORTRAN」だった。以下に水準間のおおよその違いを記す。
なお、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が制定された。
Fortranの言語仕様は、年代によってかなり変化して来ている。他のプログラミング言語で実装された構造化プログラミングの機能などがどんどん取り入れられて来ているからである。
FORTRANは、情報処理分野で広く使われていたため、学校や会社の教育(情報処理技術者向け教育)で利用された。教育向けには、より詳細なエラー情報を出すための拡張がWaterloo大学でWATFOR(後にWATFIV)コンパイラとして実装された。この実装は日本の大学でも使われた。また2006年4月にはNAGから教育用FORTRAN統合開発環境Fortran Builderが発売された。 Fortran BuilderにはFortran言語が学習できる28回の授業コンテンツが標準搭載されている。
Fortranは科学技術計算用の言語なので、スーパーコンピュータでのプログラミング言語としてよく用いられる。
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でも日本語を扱う需要が出てきた。そのため、各社(メインフレームを作成していたメーカ)では、独自に言語仕様に日本語の文字を扱えるように拡張した。そのため、各社で日本語の扱い方が異なる事態になった。そこで、JEIDAでは1985年に、JEIDA-42で日本語FORTRANを策定した。
FORTRANで日本語を扱う場合、変数名等には日本語は使えず、文字列や日本語を扱うための専用の型(日本語型)、日本語を入出力するためのFORMAT文の要素の拡張が行われた。
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のプリプロセッサである。
FORTRAN-Sは、日本電気によって開発された。
プログラミング言語Fは、FORTRANのEQUIVALENCE文などの、冗長、非構造化、非推奨な機能を削除したFortran 95のクリーンなサブセットとして設計された。 FはFortran 90で追加された配列演算の機能を使い、FORTRAN 77とFortran 90で追加された制御文を用い、構造化プログラミングで廃止された制御文を削除した。設計者はFを 『特に教育や科学技術計算に適した、構造化された配列プログラミング言語である。』 と述べている[11]。
[ヘルプ] |
gzip
ped PostScript file, FTP.nag.co.ukウィキブックスにFortran関連の解説書・教科書があります。 |
[display]http://ja.wikipedia.org/wiki/FORTRAN
.