連載
» 2016年10月20日 05時00分 UPDATE

FinTech時代、銀行系システムはどうあるべきか(2):FinTech時代の今、COBOLやPL/I、メインフレームが勘定系システムで必要な理由 (1/2)

本連載では、銀行系システムについて、その要件や歴史を整理しつつ、スマートフォンを使う銀行取引やブロックチェーンなど、新しい技術が及ぼす影響を考察していきます。今回は、メインフレームでCOBOLやPL/Iが選定された理由やメインフレームのCPUが勘定系システムに使われ続ける理由について、演算や暗号化、圧縮機能の面から解説します。

[星野武史,日本アイ・ビー・エム株式会社]

 本連載「FinTech時代、銀行系システムはどうあるべきか」では、銀行系システムについて、その要件や歴史を整理しつつ、スマートフォンを使う銀行取引やブロックチェーンなど、新しい技術が及ぼす影響を考察していきます。

 連載第1回の「若手が知らないメインフレームと銀行系システムの歴史&基礎知識」では、銀行オンラインシステムの歴史を振り返りました。第3次オンラインシステム構築当時、銀行勘定系システムのトランザクション量を処理できるシステムはメインフレーム以外にはありませんでした。歴史の中でいわゆるオープン系のシステムが勘定系として使われてきていることにも触れました。

 では、なぜまだメインフレームが使われているのでしょうか。言語が選定された時代背景を振り返った後、メインフレームのハードウェア機能で特徴的な演算、暗号化、圧縮機能について検証していきます。

メインフレームでCOBOLやPL/Iが選定された理由

 2016年現在、メインフレームで稼働する銀行勘定系システムで使用されている言語はCOBOLとPL/Iがあります。PL/Iは科学技術計算向けのFORTRAN、事務処理向けのCOBOLの長所を取り入れて開発された言語です。

 第3次オンラインシステムでは、第2次オンラインシステムの反省から、開発生産性と保守のしやすさを考慮してプログラミング手法を変えようとしていました。その候補となったのが1970年代に提唱された「構造化プログラミング」です。第3次オンラインシステムが計画された1980年代前半に、標準で構造化プログラミングが可能であった言語はPL/Iでした。COBOLは1985年の国際規格により構造化プログラミングが可能となり、言語の選択肢は増えました。現在さまざまなシステムで多く使われているCが標準化されたのが1990年であり、JavaのJDK 1.0が登場するのは1996年になってからです。このような時代背景から、第3次オンラインシステムではCOBOLやPL/Iが使われるようになったのです。

 第3次オンラインシステムは前回振り返ったように「半永久のシステムライフ」を持ち、現在も使用されています。そのため、稼働する業務プログラムを開発する言語も積極的なメリットがないと変更されないため、現在でも銀行勘定系システムではCOBOLやPL/Iが使われています。

 では、なぜメインフレームが使用され続けているのか、まずは演算機能について確認していきます。

CPUと演算の関係〜メインフレームのCPUは銀行の預金計算に向いている〜

 銀行の預金の計算は10進数で行われており、預金の入金、出金では加減乗除、利息や利子の計算では乗除算が使われています。金融派生商品の開発評価には10進数以外も活躍していると思いますが、消費者の目に見える数値は10進数で表記されるものだけです。

 メインフレームの前身である「会計機」(「タビュレーティングマシン」。日本では「パンチカードシステム」と呼ばれていました)で扱う数値は10進数です。最初の第1次オンラインシステムで使われた「IBM 1410」では加減乗除は10進数のみ。同時代に科学技術計算専用として利用されていた「IBM 7090」では2進数のみを使用して計算をしていました。

 1964年に登場した「System/360」で使用されたオペレーティングシステム「OS/360」になって初めて、10進数加減乗除計算の命令が2進数加減乗除計算と同時に標準命令として採用されました。つまり10進数の商用計算と2進数の科学技術計算の両方ができるいわゆる汎用コンピュータが登場しました。

10進数の表現方法についての基礎知識

 まずはメインフレームで10進数をどのように表現しているかを見てみましょう。

 メインフレームでは、文字コードとして、1バイト(8ビット)で表現する「EBCDIC」(Extended Binary Coded Decimal Interchange Code、拡張2進化10進コード)を使用しています。EBCDIC拡張である漢字を表現する2バイト部分はベンダーによって文字コードが異なり互換性がありませんが、ここで述べる数字を含めた1バイト部分はほぼ同一です。

 10進数は、「ゾーンフォーマット」または「パックフォーマット」で表現されます。

 ゾーンフォーマットを直接操作する命令はなく、もっぱら入出力や数値の編集のために使用されます。例えば、10進数で「+1234」をゾーンフォーマットで表した場合、図1のように16進数では「F1F2F3C4」と表現されます。

図1 「+1234」をゾーンフォーマットで表した例

 ゾーンフォーマットは1つのバイト(図1では「F1」「F2」「F3」「C4」)の右端4ビットと左端4ビットに分かれ、右端を「数字ビット」(図1では16進表記で「1」「2」「3」「4」、2進表記で「0001」「0010」「0011」「0100」)、左端を「ゾーンビット」(図1では16進表記で「F」「F」「F」「C」、2進表記で「1111」「1111」「1111」「1100」)と呼びます。最右端の1バイト(図1では「C4」)の左端4ビット(図1では16進表記で「C」、2進表記で「1100」)はゾーンビットの替わりに符号(図1では「+」つまり「正の数」を表す。詳細は後述)となることもあります。

 パックフォーマットは10進数演算命令で使用される形式で、最大16バイト31桁まで利用可能です。「億」<「兆」<「京」<「垓」<「じょ」<「穣」<「溝」と表現される「『1溝』よりも『1』少ない数」まで表現できますが、もはや天文学的数字で現実感がありません。乗数および除数は8バイトまでの長さになります。8バイトで15桁100兆まで表現可能なので、整数の乗除であれば日本の国家予算約100兆円を乗数または除数にできる長さが確保されています。どれだけ大きな数値が扱えるか実感できたでしょうか。

 「+1234」をパックフォーマットで表した場合、図2のようになります。データはバイト単位で格納されるため、上位に0が付加され、16進数で「01234C」と表現されます。

図2 「+1234」をパックフォーマットで表した例

 1バイト当たり2個の10進数数字で構成されていますが(図2では16進表記で「01」「23」「4C」)、最右端の4ビット(図2では16進表記で「C」)は符号(後述)となります。

 符号は正を「C」(1100)、負を「D」(1101)で表わします。ゾーンビットである「F」(1111)、「A」(1010)、「E」(1110)も代替符号の正として扱われ、「B」(1011)は代替符号の負として扱われます。ただし、代替符号は命令の結果としては付かずC(正)やD(負)の符合が付けられます。

 なおIntelアーキテクチャでも、パック10進数の数値部分は同じ表現ですが、データの格納方法が「リトルエンディアン」となり符号表記も異なります。

2進数と10進数のおさらい〜2進数では小数計算は不向き

 0と1のみで表現される2進数では、図3のように加算も乗算も0と1の組み合わせの4通りしかありません。このため単純な論理装置の組み合わせで回路を構成できるため、高速に計算できるのは2進数の演算です。

図3 2進数の加算・乗算一覧

 しかし2進数表現では、小数の表現が苦手な場合が多いのです。図4のように、10進数で「0.5」(以下、「0.5(10)」と表記)は2進数では「0.1」(以下「0.1(2)」と表記)できますし、「0.25(10)」は「0.01(2)」、「0.125(10)」は「0.001(2)」と表記でき、10進数から2進数に変換し、10進数に再び変換しても問題ありません。

 しかし、例えば「0.1(10)」の場合、「0.0001100110011……(2)」と無限小数となってしまうことは広く知られた問題です。たとえ倍精度の2進浮動小数点を使用したとしても「0.1の近似値」しか表現できません。このため、単純に消費税の計算をしただけで計算結果が異なる例はいくらでもあり、2進数では小数計算は不向きといえます。

図4 10進小数を2進小数に変換する例

 メインフレームでは10進数演算の命令がありますが、他のコンピュータではどうしているのでしょうか。

 IntelアーキテクチャのマニュアルPDF「Intel 64 and IA-32 Architectures Software Developer's Manual」を見てみると、「10進演算命令」という項目がありますが、演算後にこれらの命令を実施して10進表記の形式に補正(adjust)する命令を指しています。そのため、内部的には2進数で演算が行われていることが分かります。さらにメインフレームでは10進数関連命令は64ビットモードでも使用できますが、Intelアーキテクチャでは64ビットモードでは使えないため32ビットのプログラムを使わざるを得なくなります。10進数命令に関しては制約があるといえます。

メインフレーム、COBOLやPL/Iは10進数での計算に有利

 2進数で計算せずに10進数で計算できるように、メインフレームの勘定系システムで使用されているCOBOLやPL/Iといった言語は、古くから10進数浮動小数点のデータ形式を定義し使用できます。それ以外の言語でも、例えばJavaでは「デシマル型」(java.math.BigDecimalクラス)があって浮動小数点は扱えるようになっています。

 これらの演算は浮動小数点演算の標準規格(IEEE754)をサポートしているので、2016年の現在ではメインフレームとそれ以外のアーキテクチャのコンピュータで機能上の差はなくなりつつあるといえます。しかし、2008年以降に登場したメインフレームでは10進数浮動小数点の演算をハードウェア的にサポートするようになり、演算処理が格段に高速化しIntel系のCPUに差を付けているようです。

 またRISCプロセッサでも、10進数浮動小数点のハードウェアサポートを装備するようになってきています。ただし、ハードウェアによる浮動小数点演算の高速化のメリットを享受するためには、ハードウェア機能をサポートするコンパイラでプログラムを再コンパイルする必要があります。

       1|2 次のページへ

Copyright© 2017 ITmedia, Inc. All Rights Reserved.

@IT Special

- PR -

TechTargetジャパン

この記事に関連するホワイトペーパー

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。