サイト内検索
サイト内検索を閉じる

なぜ、レガシー言語(COBOL)から、Javaへの移行が難しいのか?

なぜ、レガシー言語(COBOL)から、Javaへの移行が難しいのか?

皆様、こんにちは。
TIS株式会社で、モダナイゼーションサービスの技術責任者を担当しています熊谷と申します。

世間では、「2025年の崖」や「脱ホスト」と言ったワードが取り上げられることが多くなり、モダナイゼーション(マイグレーション)を検討される企業様も増えてきています。このような状況下において、我々は、お客様に数あるモダナイゼーション手法および技術について理解していただき、適切な選択をしていただけるようにと、本連載を始めることにいたしました。
できるだけわかりやすく、現存する課題や問題点を整理すると共に、我々のソリューションがそれらに対しどのような解決策を持っているかについて明らかにさせていただきたいと考えています。

我々のソリューションでは現行システムのモダナイゼーションにあたり、レガシーなプログラミング言語で書かれたソースコードをモダンなプログラミング言語の実装に自動で変換します。
ただ自動変換するだけではなく、その際に我々は「正確性」「保守性(開発生産性)」「性能」をお約束すると共に、システムの継続的な利用とエンハンスメントをサポートします。

私が担当する初回のコラムでは変換元(レガシー)言語と変換先言語の違い、およびそれによって発生する課題について解説し、次回以降は、具体的な対応策やプロジェクト遂行時のノウハウ等について連載を進めていきます。

レガシーな言語からの脱却

ホストコンピュータからの脱却を実際に検討されている方の中には、これがなかなか一筋縄ではいかないという風に感じられている方も多いと思います。  モダナイゼーションの実現方法についてはいくつか代表的なものがありますが、本コラムではその中でもリホストとリライトについて特筆していきます。

大抵の場合、ホストコンピュータで稼働しているアプリケーションの多くはCOBOL等のレガシーな言語で構築されています。オープンなインフラ環境で稼働することができるCOBOLの処理系も確かに存在していますが、ホストのそれとは微妙に仕様が異なっていたりすることにより、処理結果(計算結果)が微妙にずれてしまうこともあります。また、リホストを採用してプログラムはそのまま移行できたとしても、ホスト上で稼働(利用)していたミドルウェアやデータベースは、オープン環境下では提供されないことも多いです。一つの例として挙げることができるのが、IMS DB(*1)のような階層型のデータベースや、AIM/DB(*2)のようなネットワーク型のデータベースです。

つまり、オープン環境への移行にあたり、これらのデータベースに蓄積されているデータは、現在主流となっているリレーショナルデータベースに移行する必要があります。データベース製品が変更されることによって、データベースを利用しているプログラムも影響を受け、改修が必要になります。よって、言語を変えない移行方式(リホスト)が容易でコストが抑えられるとは、簡単に言えないのです。
 
一方で  リライトは、リホストに比べるとプログラム言語も変えてしまうので、更に難易度が上がるのではないか?と思われるかも知れませんが、レガシーなプログラミング言語で書かれたソフトウェアを自動で移行(機械的に変換)できれば、オープンアーキテクチャへの移行によるレガシー課題の解消と、モダンなプログラミング言語に移行することによって、人材および生産性の課題を一気に解決することが可能となります。

ただし、「自動で移行(機械的に変換)」にも課題はあり、それはプログラミング言語間の仕様の差異が、原因となっているのです。
 
*1:IMS DBは、IBM Corporationの商標または登録商標です。
*2:AIM/DBは、富士通株式会社の商標または登録商標です。

COBOLの特徴

COBOL(コボル)は、1959年に事務処理用に開発されたプログラミング言語です。名称は「Common Business Oriented Language」(共通事務処理用言語)の頭文字をとっています。当時は、アセンブラ(機械語)以外の方法でコンピュータを動かすという意味で高級言語と呼ばれていたこともありましたが、現在のように多種多様なプログラミング言語が存在している状況下では、それらモダンなプログラミング言語と比較すると、高級とは言い難くなってきています。そして、COBOLで提供されている機能(ステートメント)は、機械語に変換しやすい(コンパイラが作り易い)ものであると言うことができます。
 
機械語に変換しやすいということは、別の見方をすると、プログラミングする際に、コンピュータの低レベルの機能や仕組みを意識する場面が多くなることを意味しています。
 
Java等の言語では、「型安全」な機能が提供されています。しかしCOBOLでは、その概念からは、ほど遠いことがコーディング上は行えてしまいます。(コンパイル時にエラーにならない)。以下に例を示します。やや特殊な例を含んでいますが、COBOLではこういうことも可能である、ということをご理解いただければと思います。

MOVE文による転記

COBOLではいくつかの変数を1つのグループにまとめて扱うことができます。このグループはC言語の構造体に近く、COBOLでは集団項目と呼びます。以下のコードでは2つの集団項目を定義しています。

01 GROUP01.
03 STR1 PIC X(5).
03 STR2 PIC X(5).
01 GROUP02.
03 NUM1 PIC S9(5).
03 NUM2 PIC S9(5).

GROUP01は2つの文字列型変数(STR1,STR2)を内包し、GROUP02は2つの数値型変数(NUM1,NUM2)を内包しています。
2つの集団項目間でデータの転記(転写)を行うこともでき、以下がそのコード例です。

MOVE GROUP01 TO GROUP02.

上記ステートメントが実行された場合、NUM1, NUM2 に数値として認識可能な値(バイト列)が設定される保証はありません。つまり、集団項目間でのデータの転記は、単なるバイト列の転記命令であり、集団項目配下にどのような型の項目が定義されているかについては考慮していないからです(それは、ある意味実行速度とのトレードオフとなっています)。よって、この種の危険性を回避するための責任は、プログラマーが負う必要があります。
次は、COPY文を例にとって、話をしましょう。

COPY文

最近のモダンな言語は、プリプロセッサによる機能拡張は行いません。過去のプログラミング言語においては、コンパイル前のソースコードに対してテキスト処理(置換または追加)を行うことで、生産性の向上を目指しました。しかし、このような試みは、ソースコードデバッグが主流となっているIDE上での開発環境では、適さなくなってきています。
COPY文の利用について例を挙げてみましょう。

COPY ファイル名称.

これは、指定されたファイルをこの行に展開することを表しています。
COPY文の主な利用方法は、共通的に使用するデータ項目を定義した外部ファイルの展開・再利用です。これによりプログラムの保守性を向上させることができます。
では次に、例えば同様のデータブロックの定義が2つ必要になったとしましょう。
その際に、割とよく利用されるのがREPLACINGオプションです。

COPY ファイル名称 REPLACING ==変換元文字列== BY ==変換先文字列==.

これは、コンパイル前の事前処理において、引用するファイルに対してテキスト加工を施すことになります。よって、コンパイル時には、データ定義が共通化されていることにはなりません。加えて、コードの処理部(PROCEDURE DIVISION以降)においては、変換先文字列を含んだ変数名でアクセスする必要があります。しかし、プリプロセッサ機能の無い言語への移行を考えた場合、できる限り、このようなプリプロセッサによる加工処理を使わないアプローチを採る必要があります。それを実現する方法としては、共通のCOPY文が定義しているグループの上にデータの意味合いを示すグループを設けることで解消されます。

01 移行元.
COPY XXX.
01 移行先.
COPY XXX.

また、アクセスするときには、上記のグループをOF句付きで参照すれば良いだけです。

変数名 OF 移行元.
変数名 OF 移行先.

このようなコーディングが行われていれば、他言語への移行も比較的容易に行うことが可能です。つまり、プリプロセッサ機能が備わっている言語から、Javaのように備わっていない言語への移行においては、上記のような課題を解消する必要があるのです。

CALL文による受け渡し (アドレス vs 型)

COBOL言語において、他のプログラムを呼び出す際には、CALL文を使用します。呼び出し側と、呼び出される側の間でデータの受け渡し行う場合、それらの構造は同じでなければなりません。COBOLでデータ受け渡し用の集団項目を定義する場合、以下のようになります。

呼び出し側

WORKING-STORAGE SECTION.
01 DATE1.
03 YYYY PIC 9(4).
03 MM PIC 9(2).
03 DD PIC 9(2).

少し説明を加えますと、この場合DATE1は、型を宣言していると同時に、変数も宣言していることになります。
(この辺りは、型宣言と変数宣言を明確に分けているモダン言語と大きく異なる点になります)

呼び出される側

LINKAGE SECTION.
01 DATE2.
03 YYYY PIC 9(4).
03 MM PIC 9(2).
03 DD PIC 9(2).

これらの定義をCOPY句を用いて共通化するアプローチは存在するものの、定義自体は、コンパイル単位で、確立されるので、実質的には別ものとなっています。
COPY句を使用した場合の例を以下に示します。

01 DATE1.
COPY DATE-DEF.

DATE-DEFの中身は、以下の通りです。

03 YYYY PIC 9(4).
03 MM PIC 9(2).
03 DD PIC 9(2).

つまり、COBOLのプログラム呼び出しは、型安全な機構によりサポートされている訳ではなく、あくまでも、アドレス渡しで呼び出しが行われていることがわかります。これは、引数の整合性を、プログラマーが定義を同じにすることによって、成立させているからです。
最後に変数宣言について見ていくことにしましょう。

変数と演算

01 ICOUNT PIC 9(6).

これは、6バイトを使用して6桁の正の整数を定義したことになります。
このように定義された変数に対して四則演算などの計算処理を行った場合、COBOLでは、10進数での演算が行われます。これに対し、Javaの基本型のint, long では、2進数での演算が行われます。
ただし、これについては、小数点以下の値が存在しない数値同士での +, -, × においては、結果が異なることはありませんが、割り算については、注意が必要になります。

以上、どちらかと言うと言語間移行におけるネガティブな話をしてきました。これまで説明してきたもの以外にも、REDEFINEやINITIALIZEといった機能についても課題が存在しています。
しかし、これらの課題を克服する手段がない訳ではありません。様々な技術の発展のおかげも手伝って、このような言語間での移行を自動で行うことが可能です。次回は、我々が展開しているマイグレーションサービスにおいて、どのようにして、このような課題に対処しているかについて解説いたします。

TISのCOBOL to Java移行事例

約10メガステップのCOBOLプログラムと、約20,000本のジョブ制御言語、約500テーブルのデータベース(DB)などで構成、運用されていましたシステムのオープン環境への移行プロジェクトを完遂。
本プロジェクトでは、メインフレーム機器のサポート終了期限への対応とシステムの柔軟性向上を目的に、COBOLからJavaへの移行をリライト手法で実施しました。
オープン環境へ移行した本システムはリリース後、問題なく安定稼働し、日々の業務を支えています。

導入事例資料ダウンロード

「Xenlon~神龍 モダナイゼーションサービス」製品ラインナップ

Xenlon~神龍 モダナイゼーションサービス」シリーズはTIS独自のリライト手法によるマイグレーションを中心としたモダナイゼーションサービスで企業のDX推進をご支援します。

アセスメントサービス リライトによるモダナイゼーションを検討中の企業様に対して「Xenlon~神龍 モダナイゼーションサービス」を活用したプロジェクト推進の『実現性』と『実効性』を検討します。
さらに、ご希望のお客様に対しては情報システム化戦略やエンハンス革新戦略・DX戦略の評価・診断をご支援します。
マイグレーションサービス TIS独自のリライト技術「Xenlon~神龍 Migrator」を活用して、レガシーな言語(COBOL、PL/Ⅰなど)からJavaへのリライトを実現し、オープン環境へ移行します。業務ロジックの100%を自動変換するとともに、メインフレームと同等以上の処理性能を実現します。
エンハンス革新・DX推進サービス マイグレーション後の早期エンハンス革新やDXの実現に向け、各種戦略やマイグレーションプロジェクトからの情報をインプットにしてエンハンス革新計画・DX計画を立案。
PoCを実現しながら実現性を検証するとともに、必要に応じて、マイグレーションプロジェクトにフィードバックすることで早期にエンハンス革新・DX実現に向け推進します。
エンハンス革新・DX実践サービス システムの正常稼働を保つためのメンテナンスをはじめ、オープンシステムの手法を有効活用した安全なリファクタリングやエンハンスメント革新の実践によるシステム効率を支援します。またマイグレーション後のシステムをベースとして、データ利活用や先端技術活用などDX実践を支援します。

PAGE TOP

サービスに関する資料をご希望の方は、フォームに必要事項を入力いただき、ご送信ください。

資料を請求する

お問い合わせ
各種お問い合わせページ
お問い合わせフォーム
サービスに関するお問い合わせ
お電話
0800-600-9810
携帯電話
050-5816-9805
受付時間 9:00~12:00 13:00~17:00(土・日・祝日を除く)

更新日時:2023年1月6日 13時43分