[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