Fortranを使おう
「いまさらFortran!?」などと言われそうですが、誤解を恐れずに、あえて書
くなら、現在普及している高級言語の中でFortranは最も先進的な言
語です(ただし数値計算分野に限る)。
簡単にFortranの歴史を書いておきます。
Fortranの生まれは古く、1957年、IBMのJohn Backusにより世界初の高級言語
として開発されました。FORmula TRANslatorの名が示すように、Fortranは当
初から数値計算を目的としていました。
その後、FORTRAN66、FORTRAN77規格ができ、FORTRAN77は数値計算用言語とし
て多くの研究者に愛用されてきました。そのため、数値計算関連の書籍やライ
ブラリでは、FORTRAN77で書かれた物が数多くあります。
最近、FORTRAN77の問題点を改善し、さらに数値計算特有の機能を強化した
Fortran90及びFortran95ができました。ちょっと普及が遅れている気がします
けど。
FORTRAN77
Fortranと言うと、未だにFORTRAN77の印象が強いようです。しかし、ここではっ
きりと書いておきます。FORTRAN77は既に時代遅れです。もっ
とひどく言うなら、「古典だ」と言ってしまって差し支えないでしょう。
根本的に、構造化プログラミングをしたくてもできない言語仕様に問題があり
ます。具体的に問題点を指摘すると、以下のような点が挙られると思います。
- 行番号なしでプログラミングできない
- ループブロックを記述できない(goto でループを作るしかない)
- 構造体がない
いいかげん、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を試してみたい方は、GCCのgfortranなら無償 &
自由に使えます。
- 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 Solutionが
MingW 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の仕様を入手できます。
ご意見、ご感想は、花房 真広 <[email protected]>まで。メールする前にtop pageの注意書を読んでください。