[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[dennou-ruby:000564] Re: dcl-5.2C
豊田です。
こういう議論は fj.comp.lang.fortran でやってもいいかも。
> FORTRANのライブラリは、困ったときに、いきなりプロセスを止め
> ちゃうような書き方って普通なんですか??
普通だと思います。DCL はそうですし、ごとけんさんご存知の
netCDF ライブラリは今でこそ必ずエラー番号を返していますが、
どうやら昔の実装ではデフォルトでエラー時にプロセスをとめていた
形跡があります。
もっというと、Fortran の入出力文だってそうです。エラーになれば、
デフォルトで自爆、オプションでエラーを通知するけれど、適切な
メッセージを得る標準的方法がないので、けっきょくデフォルトの
自爆まかせにしたがるプログラマが多いです。
# Fortran 2000 のレビューがきたときに文句言っておけばよかった。
# まだ公開レビューの機会があるかなあ。
> もっといえば、ライブラリレベルで、exit()されること自体、アプ
> リからみれば迷惑なはなしですが、それは高望みというものでしょ
> うか??
おっしゃるとおり、多分に高度な要求だと思います。
(目的的説明)
もともと Fortran というやつはいきなりプロセスとめられて困るような
「死ぬ前に解放しなければならない」動的割り付け資源がないので、
それでよかったのです。ファイルは自動的にフラッシュされますし。
つまり、実は Fortran では迷惑しないようなアプリしか作れないのです。
(実は netCDF ファイルは閉じなきゃいかんわけですが、
そういうものは FORTRAN ライブラリとしては例外的と
みなされがちですしね。ま、そのうち変わってくるかも
しれません)
(手段的説明)
いまどきな言語は非常事態の通報手段として例外 throw/catch みたいな
ものがたいていあるわけですが、それがなければどうするかというと、
たとえば C ではシグナルハンドラだとか atexit みたいな機構でやっている
わけです。で、Fortran にはそういうものはありません。
Fortran 2000 には関数ポインタに相当するものが入りそうですが。
だから、必ずエラー番号を返すとかいった七面倒なことになります。
もちろんエラー番号を受ければ正しく処理することはできるのですが、
エラーだったからといって解放しなければならない資源があるわけでも
ないので、対応するメッセージ引いて印字して STOP する
以外にする必要があることなど(たとえば DCL のようなものならば)ある
わけでもなく、結局プロセス止めてくれればプログラマは楽、
ということになるわけです。
(文化的説明)
もうひとつ、Fortran 書きにはエラーに対処するという発想がない人が
多いという嘆かわしい事情もあります。前述のように I/O の高水準化は
非常に嫌われますし...。
Open 文や Write 文が自爆するかもしれないのに平然としている
プログラマが、ライブラリがプロセスを止めるかもしれないといって
心配するなんてことはないですよね。
信頼性に対する考え方が非常に違う文化があるのでしょう。
# 理解できないといっていても仕事にならんし。
(ちなみに gtool4/F90 の取り組み)
ちなみに gtool4/F90 では言語的状況に整合するべく、デフォルトで
自爆してます。ただし、それではやっぱりお天道様に顔向けできないので、
logical, intent(out), optional:: err なんて引数を与えたときだけ
エラー時に真を返すようにしています。
ごくたまに、失敗したらやりなおすというループを回すことがあって、
そういうときに役に立ちますからね。
昔は例外クラスみたいな構造体作って返していたのですが、自分でも
使わないものを実装している余裕もないものでして。
んで、ユーザとしては結局デフォルトで自爆とかしかしないわけですが、
abort() の前に「自分で開いた netCDF は極力閉じる」というコードを
入れているので、だいぶマシかと思っています。
例外のある言語も Java みたくなったらそれはそれで面倒かもしれないですが。
--
arte, non vi.
豊田英司: TOYODA Eizi
mailto:toyoda@xxxxxx