« 工事完成基準でも同じです | トップページ | 固定小数点演算 »

2008年10月17日 (金)

FORTRAN と COBOL の代替言語はないかも

以下の記事を読んでの感想。

「COBOLは現役バリバリだ。"COBOLは化石"などと口にするのはITとエンタープライズシステムが何たるかをわかっていない証拠」

「30年システムに携わっているが,COBOLは規格として長期間安定し,ビジネスロジックの書きやすさにおいては右に出る言語はない」

「COBOLは現役バリバリ」,東京海上日動がシステム全面再構築でCOBOLを選んだワケ (ITPro)

COBOL を使う最大の理由といえば、10進固定小数点演算が言語組み込みでサポートされている点がまず思い浮かびました。

事務処理用及び管理分野用とされるCOBOLにおいては会計・経理処理などのように通貨を対象とした正確な数値計算が特に要求されるため、数値に対する10進数から2進数への基数変換時に計算誤差の発生しない2進化10進数による数値型(固定小数点数)を用いることができる。

COBOL (Wikipedia)

会計計算では、計算規則は、人間が手で計算することを前提に作られているはずですから、10進固定小数点で計算しなければ、計算結果は「正しく」ならないでしょうね。保険関係の計算を行なうのに COBOL を使うのは、合理的な選択に思えます。プログラミング言語の組み込み型に、10進固定小数点がなければ、プログラムを書くのは、かなりつらくなるでしょう。

他方、浮動小数点演算はどうかといえば、未だ FORTRAN がデファクト・スタンダードであったりします。

十数年前、C言語 が普及し始めた当時、C言語の浮動小数点演算機能について、確か以下のようなことが言われていたと思います。

  1. 式を評価する際、浮動小数点数が double にキャストされる仕様がふざけている
  2. 標準ライブラリの数学関数の引数がすべて double になっているのがふざけている
  3. 複素数型がないのは馬鹿にしている

C言語 は、 FORTRAN より退化している、という評価がもっぱらであったかと思います。

以下の数を扱える。

  • 整数(範囲は機種依存、4バイトであればその範囲)
  • 単精度実数(整数部+小数部、指数表示可能、精度は機種依存)
  • 倍精度実数(単精度の倍の精度を持つ)
  • 複素数(単精度または倍精度の実数の組み合わせ。2つの数字を()でくくる)

    ......

    組込み関数

    組込み関数は、同じ機能でも引数の型と関数の型によって名前が異なる。関数名の先頭がI〜Nのものが整数型、Dが倍精度実数型、Cが複素数型、それ以外が実数型である。

    FORTRAN (Wikipedia)

なお、 C言語 浮動小数点で批判が多かった、 「式がすべて double になる」は、その後改善されています。

ここで注意すべきは、式の中の float が自動的に double に変換されるのではないことである。これは C のもとの定義に比べて代わった点の一つになっている。しかし一般に <math.h> にあるような数学関数では倍精度が使われよう。 float を使う主な理由は、大きな配列の記憶容量を減らすことであり、またそうあることではないが、倍精度の算術がとくに高くつくような計算機で計算時間を短くする点にある。

B.W.カーニハン/D.M.リッチー著, 石田晴久訳, 『プログラミング言語C 第2版』, 共立出版, 1989, p.55

単精度を使う理由が効率の問題でしかない、というのは少し乱暴な話ですね。

Java言語では、このC言語の仕様を、ほぼそのまま受け継いでいます。

Conversions and Promotions (Java Language Specification Third Edition)

Math (Java 2 Platform SE 5.0)

で、やっぱり批判されていると。

Java's floating-point arithmetic is blighted by five gratuitous mistakes:

  1. Linguistically legislated exact reproducibility is at best mere wishful thinking.
  2. Of two traditional policies for mixed precision evaluation, Java chose the worse.
  3. Infinities and NaNs unleashed without the protection of floating-point traps and flags mandated by IEEE Standards 754/854 belie Java's claim to robustness.
  4. Every programmer's prospects for success are diminished by Java's refusal to grant access to capabilities built into over 95% of today's floating-point hardware.
  5. Java has rejected even mildly disciplined infix operator overloading, without which extensions to arithmetic with everyday mathematical types like complex numbers, intervals, matrices, geometrical objects and arbitrarily high precision become extremely inconvenient.

    W. Kahan and Joseph D. Darcy, "How Java's Floating-Point Hurts Everyone Everywhere"1

C言語のときからすると、要求のハードルは大分高くなっているようにも思えますけど。5番目は、10進固定小数点演算 java.math.BigDecimal についても当てはまりますね。

FORTRAN と COBOL というのは、コンピュータが「計算機」であった時代に生まれたプログラミング言語であるわけでして、数値計算に関しては、未だこれに代わる言語というのは存在していないように思いますね。C言語がプログラミング言語のメインストリームになってからは、数値計算というのはプログラミング言語の進化から忘れられた存在なのかもしれません。


1. http://www.cs.berkeley.edu/~wkahan/JAVAhurt.pdf

|

« 工事完成基準でも同じです | トップページ | 固定小数点演算 »

コメント

コメントを書く



(ウェブ上には掲載しません)


コメントは記事投稿者が公開するまで表示されません。



トラックバック

この記事のトラックバックURL:
http://app.f.cocolog-nifty.com/t/trackback/80472/24553427

この記事へのトラックバック一覧です: FORTRAN と COBOL の代替言語はないかも:

« 工事完成基準でも同じです | トップページ | 固定小数点演算 »