Fortran最高

研究室での初仕事がとある古いSunのワークステーションで動いていたFortranプログラム*1Linux上のg77に移植するというものだったのだが,実質1ヶ月ぐらいかかって本日ようやく完了.最初は実機が無くて苦労したが,実機が復旧してデバッグ環境が整ってからはからはさすがに捗った.
ちなみに最も時間を割かれた問題はFortranの"Direct Access File"の非互換性による計算結果の不一致であった.Fortranには固定長レコードのバイナリファイルを簡単に扱う機能がある.これがSunのワークステーションではビッグエンディアンで記録されていて,AT互換機上でのg77ではこれがリトルエンディアンで記録されていたというのが顛末だ.このプログラムで使用するほとんどのデータはFITS*2ファイルで提供されていたため逆に発覚が遅れてしまったかもしれない.ちなみに同じAT互換機上でもIntel Fortranの"Direct Access File"には色々ヘッダ情報が付いていて,エンディアンは同じでもg77と互換性がない.結局それぞれの環境でテキストダンプするプログラムを作り,テキスト経由でデータの変換を行っている.まあこれもある意味のマーシャリングだろうか.
今回移植したプログラムはF77と呼ばれる規格に基づいて書かれている.この規格は悪名高い暗黙の変数宣言を許しており,実際移植中にtypoらしきものをいくつか見つけてしまった.恐らくバグなのだろうが,直すと動かなくなりそうなのが恐い.
FortranでもF90やF95ではそれなりにモジュール化や生産性への配慮がなされている.これらの配慮を有効に利用してコーディングすればそれなりに読みやすいソースコードとなるはずだ.ただし私は経歴上F90やF95で書かれた大規模プロジェクトというのはあまり知らない.しかしそれでもパフォーマンス的な観点から今でもFortranを利用するという局面はあるようだ.
http://www-6.ibm.com/jp/developerworks/linux/030613/j_l-sc11.html
最後にGeant4というライブラリを紹介しておこう.これは核物理の分野で最近開発されたライブラリで,素粒子反応測定器のシミュレータである.
http://wwwasd.web.cern.ch/wwwasd/geant4/geant4.html
何故このライブラリを紹介するかというと,これがFortranからC++への移行という側面を持ったソフトウェアだからだ.これらの事情に関しては以下の資料がとても面白い.
http://geant4.kek.jp/~sasaki/OO99/
第一線で働く物理学者がC++でのカスタムメモリアロケータやデータのシリアライズで苦労している姿を想像すると,案外物理の世界も身近に感じられたりはしないだろうか?

*1:約800KB程度.

*2:天文学で広く使用されている画像データフォーマット.実際には画像データ以外にも様々な付加データを格納できる拡張性を持つ.通常はcfitsioと呼ばれるライブラリを通してデータを読み書きする.このライブラリは環境のエンディアンの違いも吸収してくれる.