「なぜ金融系では未だにCOBOL」や「メインフレームCOBOLの10進は高精度で高速」議論の製品系出典まとめ (original) (raw)
X(Twitter)での話題は出典なき極論も多いので、HW/SW製品系の出典を並べて見ました (最終更新 2024/6/18)
1.主な論点
今回の発端は以下のポスト。
Q:なぜ金融系では未だにCOBOLが使われるんですか?
A:お手元にExcelがありましたら任意のセルに「=4.8-4.7-0.1」って入れてみてください。
— 遊撃部長F/S&RWAs (@fstora) 2024年6月6日
そこから以下の話が展開されました。
- COBOLは数値が10進なので精度が高く高速なので、銀行はCOBOL
- いや、精度は型次第だし、CPU内部は2進演算なので速度も同じだ!
- いやいや、メインフレームにはCOBOL用アクセラレータがある???
これらは極論も多いし、特に性能の話はハードウェア(CPU)とプログラミング言語(コンパイラ等)の組み合わせが重要です。
2.結論
先に論点ごとの結論を書きます。
①精度の問題
- 精度は言語自体より、使用するデータ型(桁数)によります
- Excelやx86など多くの製品は内部2進です(*1)
- しかし**COBOLのデフォルトの10進は桁数が多いため、多くの場合は高精度**になります(*2)
*1
Microsoft Excel は、浮動小数点数の格納方法と計算方法を決定するために IEEE 754 仕様に基づいて設計されました。
浮動小数点演算が Excel で不正確な結果をもたらす可能性がある - Microsoft 365 Apps | Microsoft Learn
*2
COBOL 2002規格ではコンパイラは小数点上下合計で31けたまでの宣言を許容しなければならないことになっています。コンパイラによっては、それ以上も許容しています。これは倍精度浮動小数点の十進精度が15けた程度であるのに比較するとかなりの高い精度です。
実は、COBOLの1985年規格までは18けたまでを許容すればよいことになっていましたが、現代の金融業務の要請に伴い31けたまで拡張されたものです。
これであなたもCOBOLプログラマ:COBOL - Getting Started(2)(2/3 ページ) - @IT
②速度の問題
- 演算速度は言語自体より、実行環境によります(*1)
- 一般的なCPUでは10進も内部2進で演算されるため、10進の優位は特にありません
- しかし10進サポート言語(COBOL, PL/I, C, Javaなど)(*2)と、10進搭載CPU(各社メインフレーム、Power、SPARC64など)(*3)の組み合わせで、高速10進演算可能。つまりメインフレームCOBOL限定ではないが、ハイエンド構成にはなります。
*1 厳密には言語同士の比較なら機械語やアセンブラが最速で、他はライブラリ(ランタイム)など、更にJavaはJVMのオーバーヘッドもあります。
*2 厳密には各コンパイラ等の最適化レベルにもよります。なお製品内部の実装詳細は一般公開されているとは限りません。
*3 厳密には各CPUの内部実装レベル(マイクロコード、ワイヤードなど)にもよります。一般に実装レベルを高めたCPUは高速な反面、複雑で高価になります。
③メインフレームCOBOLが良いのか?
- 高精度は利点。2進でも要件に応じて適切な型選択すれば良いが複雑化リスクも。
- 10進搭載CPUとの組み合わせで10進演算高速化できるが、COBOL限定ではなくPL/I, C, Javaなどでも良い。
- 一般論では、コンピュータは道具なので通常は汎用品を使い、処理速度や信頼性など特別な要件がある場合に専用品を比較検討すればよいと思う。日本の銀行も地銀の多くはオープン系で稼働中、メガバンクはメインフレーム + COBOLやPL/Iなど。
3.出典
ネットで軽く検索した結果なのでばらつきあります。富士通や日立の10進サポート言語の情報もあるはずですが発見できず.....
①メインフレームCOBOL, PL/I 対 Intel 32/64
現在でも銀行勘定系システムでは COBOL や PL/I が使われています。では、なぜメインフレームが使用され続けているのか
単純に消費税の計算をしただけで計算結果が異なる例はいくらでもあり、2 進数では小数計算は不向きといえます。メインフレームでは 10 進数演算の命令があります
Intelアーキテクチャのマニュアル PDF「Intel 64 and IA32 Architectures Software Developer's Manual」を見てみると、「10 進演算命令」という項目がありますが、演算後にこれらの命令を実施して 10 進表記の形式に補正(adjust)する命令を指しています。そのため、内部的には2 進数で演算が行われていることが分かります。さらにメインフレームでは10進数関連命令は64ビットモードでも使用できますが、Intel アーキテクチャでは 64 ビットモードでは使えないため32ビットのプログラムを使わざるを得なくなります。10 進数命令に関しては制約があるといえます。
FinTech時代の今、COBOLやPL/I、メインフレームが勘定系システムで必要な理由
②IBM System/360
1964年登場の System/360 は商用の10進演算(decimal)と科学技術計算用の浮動小数点演算(fp)を両方搭載して汎用機(general-purpose system)と呼ばれた。以後のIBMやIBM互換のメインフレームも当仕様を継承してます(富士通・日立はOS互換、旧アムダールはHW互換)。
System/360 is a general-purpose system that may be tailored readily for commercial, scientific, communications, or control applications. A Standard instruction set provides the basic computing function of the system. To this set a decimal feature may be added to provide a Commercial instruction set or a floatingpoint feature may be added to provide a Scientific instruction set. When the instructions associated with storage protection are added to the commercial and scientific features, a Universal instruction set is obtained. Timer and direct-control features may be used with systems to support time-sharing or real-time operations, and in teleprocessing applications.
③IBM z10
2008年の System z10から10進浮動小数点数演算装置をハードウェア化。
10進浮動小数点演算についてはファームウェアベースからハードウェアベースに移行したことで、約10倍の性能アップを実現した
IBM IT VISION 2008 -「System z10」を世界で初めて発表 | TECH+(テックプラス)
④IBM Power
Power6以降は10進浮動小数点演算をハードウェア処理。
IBMが次期POWERとサーバーを国内発表、10進浮動小数点をハード処理 | 日経クロステック(xTECH)
⑤富士通 SPARC64 X
SPARC64 X以降は10進浮動小数点演算をハードウェア処理。
UNIXサーバ SPARC Servers ソフトウェア処理の一部をハードウェアに組み込む「Software on Chip」 - 富士通
⑥RISC-V
未定義(今後の拡張)のようです。
L(10進浮動小数点:未定義)....中略..などがExtensionとして挙げられている。
RISC-Vの浸透 なぜRISC-Vが使われるようになったのか、その理由を探る:RISCの生い立ちからRISC-Vまでの遠い道のり(1/3 ページ) - ITmedia NEWS
⑦メインフレーム用の C, Java
IBM Z (z/OS)用の現役の言語での例です。
(z/OS の C)
拡張として10進をサポート。
decimal データ型は、ANSI C 言語定義に対する拡張です。
Javaの仕様なので当然ながらBigDecimalが使用できる。
最新のIBM z/Architecture10進数命令およびベクトル・パック10進数命令を利用する効率的な2進化10進数演算子を使用します。
IBM Semeru Runtime Certified Edition for z/OS
⑧AIX用の C
ハードウェアの10進命令を使用と明示してはいないが、常識的には最適化していると思われます。
10 進浮動小数点サポート
⑨IBM i の C
こちらも同様。日本ではオフコンと呼ばれる旧AS/400で、Power搭載。
(IBM i の C)
4.その他
古い記事も含みますが関連する記事やブログです。
(マイナビ)
審議中のIEEE 754の拡張である754rの主要な追加の一つは、10進の浮動小数点演算である。科学技術計算の場合は、現在、IEEE 754で定義されている2進の浮動小数点演算で問題が無いが、事務計算では10進演算の必要性が高い。
(略)利息を計算して、1円単位に切り上げるなどという計算を2進の浮動小数点演算で行うと、誤りが生じる場合がある。このため、財務計算などでは、ソフトウェアで10進の浮動小数点演算を行っている。また、通常、金額のデータなどは10進数の形式で保存されており、これを演算のために2進数に変換し、計算後、10進数に変換して格納するのは、無駄が多い。というのが、10進の浮動小数点演算を追加する理由である。
コンピュータアーキテクチャの話(104) 10進浮動小数点演算 | TECH+(テックプラス)
(COBOLコンソーシアム)
COBOLの歴史
ミッションクリティカルなビジネスアプリケーションの70%は,今もCOBOL
で記述されている。
COBOLの2002年規格と今後の展望 (2003年の記事)
https://www.cobol.gr.jp/knowledge/material/030624_report/02.pdf
COBOLは、その誕生以来、ビジネスアプリケーションにおける精密な数値処理の要求に 応え続けてきました。この言語の核となるのは、人間にとって直感的で、かつ計算上の誤差を最小限に抑えることができる10進数のデータ表現です。
COBOLコンソーシアム − COBOLの10進数データについて
10進演算を高級なハードウェア命令としてサポートするメインフレームと異なり、マイクロプロセッサを使用するオープンシステムでは、10進演算はほとんどの場合ソフトウェアによって実行されます。
COBOLコンソーシアム − COBOL利用技術のご紹介 -第4回- 算術演算の精度
Javaでも10進演算は可能ですが、かなり読みにくいものになります。
https://www.cobol.gr.jp/knowledge/technical/pdf/tec006.pdf
(2024/6/18 追加) 記事の最後に当記事に触れていただきましたが「ハードウェアの要素もあるのを忘れたらアカンやろ」とのコメントがわかりやすい。
じゃあ何すか、COBOL以外では4.8 - 4.7 - 0.1できないってことっすか / ScalaとSpireで安心安全な計算ライフを実現しよう - Lambdaカクテル
以上です。