ホーム > コラム・レポート > コラム > コラム|舞呉コボ郎のマイグレーション放浪記
第1回 マイグレ創成期 編  / COBOL 一番重要なのはMOVEとIF  [2024.3.8]
  • コラム

コラム|舞呉コボ郎のマイグレーション放浪記
第1回 マイグレ創成期 編  / COBOL 一番重要なのはMOVEとIF  [2024.3.8]

舞呉コボ郎のマイグレーション放浪記

舞呉コボ郎のマイグレーション放浪記

はじめまして。舞呉コボ郎と申します。「まいご」じゃありません。「まいぐれ」です。 私は当社で30年以上、マイグレーションとCOBOLに取り組んできました。 2024年を迎え、コボ郎のカラータイマーも点滅し始めたので、何か記録に残すことで微力ながらCOBOLに関わる方、これからCOBOLに携わる予定のある方のお役に立てるようなことがないかと思いを巡らせ、コラムを始めることにしました。 当社が約30年取り組んできたマイグレーションの軌跡と最近肩身が狭くなってきたCOBOLのお勉強に役立つ情報をお届けしていこうと思います。 COBOLに取り組まなくてはならなくなった初心者の方や、何となくCOBOLを使ってきた方に、COBOLを深く理解して活用するための虎の巻になるといいなぁ…と思っています。

初回はCOBOLとマイグレーションについて、コボ郎の所感を述べさせていただきます。

COBOLの言語特性として良いところは

  • 可読性が優れている
    …設計書がなくてもソースコードを読むと何をやっているかをほぼ理解できます。
  • 習熟するための難易度が低い
    …COBOLを知らない人でも、何かの言語でプログラミングスキルを習得していれば、早期にCOBOLを使いこなすことが できます。

悪いところは、

  • 生産性が低い
    …他言語なら数行でコーディングできるような内容でも、10倍以上のコーディング量が必要となることがあります。
    (COBOLで正規表現が使えるようになると、かなり改善できると思う……)

COBOLは1959年に生まれ、現在まで使われ続けています。衰退期にはありますが、まだまだ大量のCOBOLが本番運用されています。
まだCOBOLが残っている企業のシステムは、超ミッションクリティカルだったり、移行が難しいアセンブラなどの資産が大量に稼働していたり、その両方だったりします。
現在の技術ではCOBOLをすべて無くすためには莫大なマンパワーが必要で、この先しばらくは、うまくCOBOLと付き合っていくことが必要だと思います。自然なJavaに変換するAIが出始めているようですが、広く使えるようになるにはまだまだ時間がかかりそうです。

もし、COBOL技術者の確保が困難で、かつ高齢化しているのであれば、若い技術者を教育して増やすのも一つの手だと思います。COBOLの習得はコツをつかんでしまえば簡単です。
若いエンジニアにとっても、JavaやC#だけでなく、COBOLを習得してハイブリッドになっておけば、ニッチなCOBOL市場で高条件の仕事に巡り合うチャンスも大いにあるでしょう。

COBOLを別言語に書き換えても、ジョブやプログラムの構成を変更しない場合は、保守のやり方は基本的に変わりません。本質的な問題は、業務ノウハウの習得や継承が難しいことなのです。例えば、あるジョブが異常終了した際に、調べなければならない対象ソースや復旧対象のデータ、再実行方法などは変わりません。移行対象システムの重要性や保守頻度と、言語を書き換えることによるメリット(COBOL撤廃によるランニングコスト低減など)とデメリット(移行時コストの増大と移行後保守性の低下など)を多面的に評価して、移行先の言語を決めるべきだと思います。

重要度の高いシステムのうち「業務ノウハウが肝だが継承がうまくいってない」システムは、再構築して自社のエンジニアに業務ノウハウを植え付けることが望ましいです。生産性を上げるために、当社製「WebPerformer」のようなローコード開発ツールを用いることもお勧めです。

■マイグレ編 ~創成期~

1990年代。バブルが崩壊し、企業は設備投資が控えられるような節約生活に突入。マイグレーションという言葉がまだマイナーだった頃のお話です。
某社が主力として使っていたメインフレームの一つが製造停止になってしまうことを契機に、別機種のメインフレームへのマイグレーションをシャカリキになって約5年やりました。大規模でミッションクリティカルなシステムが多く、アセンブラも大量にある難易度の高いマイグレーションでした。

アセンブラの再構築は、コボ郎が中心で行い、苦労と達成感が大きかったので、少しご紹介したいと思います。
移行元では、オンラインの業務プログラムの画面送受信や罫線や色の変更を簡易化して開発生産性を上げるために、アセンブラ共通プログラムを用いていました。アセンブラ共通プログラムを廃止し、移行先の標準的な画面インターフェースを用いるようにオンライン業務プログラムを手修正する方法もありますが、その場合は手修正による品質低下は免れません。オンライン業務プログラムのインターフェースを変えずに、移行先OS配下で同じ機能が実行できるように代替の共通プログラムを再構築することで、オンライン業務プログラムのツール変換を可能としました。

オンライン業務プログラムのツール変換

アセンブラはツール変換できなかったので、人手でアセンブラを解析して、フローチャートを作成し、現状機能を把握した上で、代替共通プログラムを開発しました。アセンブラの解析は、レジスタとメモリー間の転記やビット操作の内容はコーディングから直接的に把握できるので、フローチャートに落とすまでは機械的な作業で、比較的容易でした。
しかし、出来上がったフローチャートを眺めて何をしているのかを把握することは難しく、何をしているかの謎が解けた時は、パズルが解けたような感覚で喜びもひとしおでした。

約30年前のマイグレーションへの対応方法は、次のとおりでした。

  • 徹底的に非互換(*1)を洗い出す
  • 精度の高い変換ツールを開発して、手修正を極力なくす
    (この頃は変換ツール自体もCOBOLで作っていたので大変でした)
  • 現新照合テスト(*2)の生産性を上げるため、テスト実行やテスト結果の比較を行うテスト支援ツールに工夫を凝らす

(*1) 非互換:移行時にCOBOL変換やJCL変換、データ変換などのなんらかの対応が必要となる事項
(*2) 現新照合テスト:移行元と移行先で同じテストを行い、それぞれのテスト結果を比較して一致することを確認するテスト

この時の「メインフレーム to メインフレーム」マイグレーション技術が当社のマイグレーションの礎になっています。
なお、当社のマイグレーションで扱ってきたメインフレームのOSは、IBM OS390/z/OS 、NEC ACOS-6/ACOS-4/ACOS-2、三菱電機 GOS、富士通 MSP、日立 VOS3です。今となっては、無くなってしまった懐かしいOSもありますね。

 ⇒詳細は次回へ続く

■COBOL編 ~一番重要なのはMOVEとIF~

コボ郎が社会人になって教わった初めての言語はPL/Ⅰでした。当時、講師の先生が、PL/Ⅰで「一番大切なのは移送と条件判定だ」と言われていたことがコボ郎のCOBOL技術の根底にあります。COBOLのMOVE命令とIF命令をしっかりマスターすることが、COBOL技術上達の早道です。本当にそうです。

今回は、MOVE元と先の項目属性によって転記の種類が英数字転記か数値転記に決まること、英数字転記とは何か、数値転記とは何か、IFの左辺と右辺の項目属性によって比較の種類が英数字比較か数値比較に決まること、英数字比較とは何か、数値比較とは何かについて説明します。 次の問題を解いたあと、解答と解説をご覧ください。

■問題

01  W-9-03X.
   02  W-9-03     PIC 9(03).
 01  W-9-04X.
   02  W-9-04     PIC 9(04).

問題1 下記のMOVEを実施した後、IF条件は真となりますか?偽となりますか?

MOVE  10  TO  W-9-03.
MOVE  W-9-03  TO  W-9-04X.

IF  W-9-03  =  W-9-04
   DISPLAY "W-9-03 = W-9-04" UPON SYSOUT
ELSE
   DISPLAY "W-9-03 NOT = W-9-04" UPON SYSOUT
END-IF.

問題1 答えと解説開く

問題1
答え:偽

DISPLAY "W-9-03 NOT = W-9-04" UPON SYSOUT が実行されます。
PICTURE句(PIC)やUSAGE句で属性が定義されている項目を「基本項目」、そうでない項目を「集団項目」と呼びます。
「MOVE  10  TO  W-9-03」は、数字定数から数字項目(基本項目)への転記となるため、数値転記のルールが適用されます。
数値転記は転記元と転記先の小数点位置を合わせて値が転記され、不足する桁には0が補われます。

問題1解説画像

W-9-03は、USAGE句が省略されているため既定値であるUSAGE DISPLAY(ゾーン10進数)となるため、MOVE後のW-9-03のメモリー内容(16進数表記)は下記となります。

問題1解説画像

「MOVE  W-9-03  TO  W-9-04X」は、数字項目(基本項目)から集団項目への転記となります。転記元または転記先のどちらかが集団項目の場合は、英数字転記となります。
英数字転記は転記元から転記先へ左詰めで値が転記され、不足する桁は空白が補われます。

問題1解説画像

MOVE後のW-9-04Xのメモリー内容(16進数表記)は下記となります。

問題1解説画像

「IF  W-9-03  =  W-9-04」は、数字項目(基本項目)と数字項目(基本項目)の比較なので、数値比較となります。
数値比較は比較元と比較先の小数点位置を合わせ、右から左へ1桁ずつ値が比較されます。一方が不足する桁は0と比較されます。

問題1解説画像

問題2 下記のMOVEを実施した後、IF条件は真となりますか?偽となりますか?

MOVE  10  TO  W-9-03.
MOVE  W-9-03  TO  W-9-04X.

IF  W-9-03X  =  W-9-04X
   DISPLAY "W-9-03X = W-9-04X" UPON SYSOUT
ELSE
   DISPLAY "W-9-03X NOT = W-9-04X" UPON SYSOUT
END-IF.

問題2 答えと解説開く

問題2
答え:真

DISPLAY "W-9-03X = W-9-04X" UPON SYSOUT が実行されます。
「IF  W-9-03X  =  W-9-04X」は、集団項目と集団項目の比較なので、英数字比較となります。
       比較元と比較先の片方または両方が集団項目の場合は英数字比較となります。
       英数字比較は比較元と比較先を左から右へ1桁ずつ値が比較されます。一方が不足する桁は空白と比較されます。

問題2解説画像

問題3 下記のMOVEを実施した後、IF条件は真となりますか?偽となりますか?

MOVE  10  TO  W-9-03.
MOVE  W-9-03  TO  W-9-04.

IF  W-9-03  =  W-9-04
   DISPLAY "W-9-03 = W-9-04" UPON SYSOUT
ELSE
   DISPLAY "W-9-03 NOT = W-9-04" UPON SYSOUT
END-IF.

問題3 答えと解説開く

問題3
答え:真

DISPLAY "W-9-03 = W-9-04" UPON SYSOUT が実行されます。
「MOVE 10 TO W-9-03」後のW-9-03は、下記の通り。(詳細は問題1を参照)

問題3解説画像

「MOVE W-9-03 TO W-9-04」は、数字項目から数字項目への転記となるので、数値転記となります。

問題3解説画像

MOVE後のW-9-04のメモリー内容(16進数表記)は下記となります。

問題3解説画像

「IF W-9-03 = W-9-04」は、数字項目(基本項目)と数字項目(基本項目)の比較なので、数値比較となります。
数値比較は比較元と比較先の小数点位置を合わせ、整数部は右から左へ1桁ずつ値が比較されます。一方が不足する桁は0と比較されます。

問題3解説画像

問題4 下記のMOVEを実施した後、IF条件は真となりますか?偽となりますか?

MOVE  10  TO  W-9-03.
MOVE  W-9-03  TO  W-9-04.

IF  W-9-03X  =  W-9-04X
   DISPLAY "W-9-03X = W-9-04X" UPON SYSOUT
ELSE
   DISPLAY "W-9-03X NOT = W-9-04X" UPON SYSOUT
END-IF.

問題4 答えと解説開く

問題4
答え:偽

DISPLAY "W-9-03X NOT = W-9-04X" UPON SYSOUT が実行されます。

「IF W-9-03X = W-9-04X」は、集団項目と集団項目の比較なので、英数字比較となります。
比較元と比較先の片方または両方が集団項目の場合は英数字比較となります。
英数字比較は比較元と比較先を左から右へ1桁ずつ値が比較されます。一方が不足する桁は空白と比較されます。

問題4解説画像

MOVEとIFの動作の概略は理解いただけたでしょうか?
次回は属性のバリエーションをパック10進数や2進数などに拡げ、MOVEとIFについて深堀りします。


※記載の会社名、製品名などは、それぞれの会社の商標もしくは登録商標です。
※免責事項
・当コラムに記載した内容に関して、いかなる保証もするものではありません。
・記載内容は予告なく変更する可能性があり、記載内容に誤りがあった場合でも一切責任を負いかねます。

関連するソリューション・製品

ホーム > コラム・レポート > コラム > コラム|舞呉コボ郎のマイグレーション放浪記
第1回 マイグレ創成期 編  / COBOL 一番重要なのはMOVEとIF  [2024.3.8]