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では Fortran2000でオブジェクト指向を実装しようという動きがありますが、まだ 標準化されていませんし、対応コンパイラもありません。
オブジェクト指向を使えないのは確かにデメリットですが、そもそも数値計算 の場合はオブジェクト指向を使うメリットがあまりないので、あまり気になる ことは無いように思います。

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

f(:,:,:) = 2.0*g(:,:,:)**2 - 3.0*g(:,:,:) + 4.0
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に対応してい ます。
Compaq Fortran Compiler for Linux Alpha
今は亡きDECのAlpha用コンパイラです。学術用途であれば無償で使うことができます。
F Compiler
Fortran95から、Fortran77以前の文法を取り除いた、F言語コンパイラです。 Fortran77互換の古い機能を使わなければ、Fortran95コンパイラとして使うこ とができます。
ソースコードは公開されていませんが、無償で使えます。 Linux/Solaris/Windowsなど、多くの環境で使うことができます。
G95 Project
GPLライセンスなFortran95コンパイラを作ろうというプロジェクトです。活発 に開発が続いていて、最近ではFortran95の機能のほとんどが実装されていま す。
GCC gfortran
GCC-4.0.0から、Fortran95がサポートされました。内部の最適化機構も GCC-3.4からGCC-4.0で大幅に変更され、GCC-4.1でさらに最適化が強化されて います。
Linuxで使う場合、私はgcc-4.1.spec のようなSPECファイルを書いて、RPMにして使っています。
Windows版が欲しい人は、GFortran Binaries からインストーラー付きのものをdownloadできます。
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倍ぐらいの性能がでるようになりました。
Linux版は、非商用利用であれば無償で使えます。
Lahey/Fujitsu Fortran
富士通製の商用Fortranコンパイラです。Linux/Solaris/Windows用があります。
NAG Fortran Compiler
商用コンパイラです。対応プラットフォームが多いのが特徴です。FortranをC 言語のソースに変換しているらしく、性能は裏で走っているCコンパイラ次第 のようです。
PathScale Compiler Suite
AMD64用商用コンパイラです。
PGI Fortran Compiler
商用コンパイラです。IA32/AMD64環境で最速という噂も聞きます。IA32と AMD64プラットフォームをサポートしています。
The Fortran Company
大胆にも、fortran.comをとってしまった会社。各種コンパイラへのリンク、 ライブラリ類のダウンロード、書籍の販売などを行っています。
日本工業標準調査会
工業規格 JISのページです。JISX-3001-1 「プログラム言語Fortran−第1部: 基底言語」として、Fortran95の仕様を入手できます。

おまけ

MPICH2 for Intel compilers
Intel icc/ifort 用の MPICH2です。
mpich2-1.0.1-intel8.src.rpm

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