Fortranを使おう

「いまさらFortran!?」などと言われそうですが、誤解を恐れずに、あえて書 くなら、現在普及している高級言語の中でFortranは最も先進的な言 語です(ただし数値計算分野に限る)。

簡単にFortranの歴史を書いておきます。
Fortranの生まれは古く、1957年、IBMのJohn Backusにより世界初の高級言語 として開発されました。FORmula TRANslatorの名が示すように、Fortranは当 初から数値計算を目的としていました。
その後、FORTRAN66、FORTRAN77規格ができ、FORTRAN77は数値計算用言語とし て多くの研究者に愛用されてきました。そのため、数値計算関連の書籍やライ ブラリでは、FORTRAN77で書かれた物が数多くあります。
最近、FORTRAN77の問題点を改善し、さらに数値計算特有の機能を強化した Fortran90及びFortran95ができました。ちょっと普及が遅れている気がします けど。

FORTRAN77

Fortranと言うと、未だにFORTRAN77の印象が強いようです。しかし、ここではっ きりと書いておきます。FORTRAN77は既に時代遅れです。もっ とひどく言うなら、「古典だ」と言ってしまって差し支えないでしょう。
根本的に、構造化プログラミングをしたくてもできない言語仕様に問題があり ます。具体的に問題点を指摘すると、以下のような点が挙られると思います。

いいかげん、FORTRAN77はやめて、Fortran90を使いましょう。

Fortran90/Fortran95

Fortran90では、上記のようなFORTRAN77の欠点がほぼ全て解消されています。 それに加えて、数値計算用にベクトル化や並列化に適した構文が追加されてい ます。どんな特徴があるのか、C/C++と比較してみましょう。

配列演算を書きやすい
たぶん、他の言語と比べた時の、Fortranの最も大きな特徴でしょう。特に、多 次元配列を扱おうとすると、他の言語を使うのがばからしくなります。
並列性を明示的に書くことができる
FortranのForAll文や、配列演算文を使うと、コンパイラは演算に並列性があ ることを簡単に解析できます。そのため、コンパイラは自動ベクトル化や自動 並列化を行いやすくなります。
可読性が高い
"FORmula TRANslator"と言うぐらいですので、元の数式に近い形で プログラムを書けます。また、配列演算構文を使うことで、何重ものループを 書いたりする必要が無くなり、ループだらけで何をやっているのかよくわから ない、といったことにもなりません。
豊富な数値計算用ライブラリ
数値計算に使うライブラリ群は、大抵FortranとC向けに作られています。 NetLib などを見ると、いろいろなライブラリが提供されています。
オブジェクト指向 : 標準化されたがまだ実用の域には未達
C++では、オブジェクト指向が使えるようになっています。一方、Fortranでは Fortran2003、Fortran2008でオブジェクト指向が標準化されてました。 ただ、標準化されたもののFortran2003以降をきっちりと実装したコンパイラが ほとんどありません(2009年時点)。
オブジェクト指向を使えないのは確かにデメリットですが、そもそも数値計算 の場合はオブジェクト指向を使うメリットはあまりないので、気になることは 無いように思います。

試しに、f(x,y,z) = 2 g2(x,y,z) - 3 g(x,y,z) + 4 を FortranとCで書いてみましょう。

Fortran 95

f(:,:,:) = 2.0*g(:,:,:)**2 - 3.0*g(:,:,:) + 4.0

C

for(z=0; z<N; z++){
    for(y=0; y<N; y++){
        for(x=0; x<N; x++){
            f[z][y][x]=2.0*g[z][y][x]*g[z][y][x] - 3.0*g[z][y][x] + 4.0;
        }
    }
}

Fortranでは、配列演算文をつかって簡単に書けます。このような簡単な式 では、Fortranのメリットは感じにくいかもしれませんが、式が複雑になるに したがって、Fortranの方が書きやすくなります。

また、Fortranの配列演算文では、各配列要素を並列に演算可能であることを 示します。上記の例では、コンパイラはN3の並列性があることを 簡単に解析できます。

リンク(主にコンパイラ)

ひとまずFortran95を試してみたい方は、GCCgfortranなら無償 & 自由に使えます。

Absoft ProFortran
商用コンパイラです。Linux(IA32,AMD64,PPC)/MacOS X/Windowsに対応してい ます。
G95 Project
GPLライセンスなFortran95コンパイラを作ろうというプロジェクトです。活発 に開発が続いていて、最近ではFortran95の機能のほとんどが実装されていま す。
GCC gfortran
GCC-4.0.0から、Fortran95がサポートされました。内部の最適化機構も GCC-3.4からGCC-4.0で大幅に変更され、GCC-4.1でさらに最適化が強化されて います。GCC-4.2からはOpenMP もサポートされ、徐々に強化されています。
Linuxや{Free,Net}BSDだと、最近のものはGCC-4.0以降を含んでいますので、 標準でgfortranが使えるか、わずかな手間でインストールできます。
Windows版が欲しい人は、 GFortran Binaries からインストーラー付きのものをdownloadできます。 最近だと、Equation SolutionMingW C,C++,Fortranのインストーラー を提供してくれています。GCCのrelease後、割と短時間でインストーラーが用意 されますし、32bit版と64bit版の双方が揃っているのでお薦めです。
IBM XL Fortran for MacOS X
遂にIBM製のFortranコンパイラがMacOS Xに移植されました。製品版はabsoftから販売されています。CPUメーカー 純正のコンパイラということで期待されますが、性能はどうでしょうか?
Intel Fortran Compiler
Intel製のFortranコンパイラです。Fortran77/90/95に対応していて、 Pentium4への最適化や、SSEを使った疑似ベクトル化機能などがあります。
バージョン8.0から、フロントエンドがDigital Fortranのものになったようで す。最適化もだいぶ強化されたようで、手元のプログラムはバージョン7.1で コンパイルしたものに比べて1.5倍ぐらいの性能がでるようになりました。
頻繁にバグ修正や新しいCPUへの対応が行われていますし、何しろIntelのCPUでは 最速といって過言ではないので、Intel CPUを使う場合はお薦めです。
Linux版は、非商用利用であれば無償で使えます。
Lahey/Fujitsu Fortran
富士通製の商用Fortranコンパイラです。Linux/Solaris/Windows用があります。
NAG Fortran Compiler
商用コンパイラです。対応プラットフォームが多いのが特徴です。FortranをC 言語のソースに変換しているらしく、性能は裏で走っているCコンパイラ次第 のようです。
LLVM
BSD Licenseのopen source compilerで、 AppleがMacやiPhone用の開発環境として採用しています。 GCCのgfortranをfrontendとして使い、Fortran 95のcompileも行えます。
Open64
Open64 @ AMD
Open sourceのC, C++, Fortran compilerです。 SGIのMIPS Pro compilerだったものが2000年頃にopen sourceになり、 主にItanium(IA64)用として開発されていました。 最近、AMDがOpteron向け最適化を頑張っているようで、 AMD64/x86_64でもかなりよい性能が出るようです。
PathScale Compiler Suite
AMD64用商用コンパイラです。
PGI Fortran Compiler
商用コンパイラです。IA32とAMD64プラットフォームをサポートしています。
The Fortran Company
大胆にも、fortran.comをとってしまった会社。各種コンパイラへのリンク、 ライブラリ類のダウンロード、書籍の販売などを行っています。
日本工業標準調査会
工業規格 JISのページです。JISX-3001-1 「プログラム言語Fortran−第1部: 基底言語」として、Fortran95の仕様を入手できます。

ご意見、ご感想は、小本 真広 <webmaster@komoto.org>まで。メールする前にtop pageの注意書を読んでください。