2023.04.13
デジタル・トランスフォーメーション(DX)にあたり、COBOL、PL/I を代表とする手続き型言語のアプリケーションを Java などのオブジェクト指向言語へツールを使用して自動変換した場合、パフォーマンスの劣化やソースのメンテナンスが困難になる可能性があることをご存じでしょうか。本記事では、手続き型言語とオブジェクト指向言語の違いを再認識しながら、その理由を解説します。
その名の通り、実行する命令や手続きを順番にプログラムに記述していく言語を指し、COBOL、PL/I、Fortran、C言語 などが該当します。
例えば、次の処理を行うプログラムは、そのまま上から順番に記述します。
構造化プログラミングが適用されていれば No.1~ No.3は別々のプログラムで処理され、データを引数として No.1から No.2を呼び出し、同じように No.2から No.3を呼び出します。各プログラムの中では、変数を定義して対象ファイルをオープンするなど、複数の手続きが処理順に記述されています。
COBOL の例)
このような処理順に記述されているプログラムを組み立て、システム全体を構築していきます。
手続き型言語を使用したプログラムには、以下のようなメリットがあります。
シンプルがゆえに誰にとっても理解や習得が容易で、システム設計時も複雑さは高くありません。
オブジェクトとはモノや事柄を指し、このオブジェクトを単位としてプロパティやメソッドをクラス定義するもので、Java、PHP、C++ などが該当します。特徴的なのは、継承やポリモーフィズムなどの概念があることで、基底クラスを継承した派生クラスから、基底クラスのプロパティやメソッドを使用することができ、同じ名前のメソッドであっても引数や戻り値、データ型などの違いにより複数の実装ができます。手続き型言語と同じ例では、まず No.3の結果を得るためには何が必要かを考えます。
No.1を基底クラスとして、インスタンス生成時に共通データを取得し、派生クラスが参照できる変数に格納します。共通データは No.2のみが参照できるように No.1の派生クラスとして定義し、編集後の業務データを引き渡すメソッドを用意しておきます。No.3では No.2のインスタンスを生成し、そのメソッドを呼ぶなど、目的に合わせたプログラミングが可能です。
既にお気づきかもしれませんが、オブジェクト指向言語は結果となるオブジェクトを考慮しながら、関連するオブジェクトを効率よく生成するクラス設計が非常に重要になります。
オブジェクト指向言語を使用したプログラムには、以下のようなメリットがあります。
クラスの関連をすべて把握することは複雑で困難ですが、必要なときに必要なインスタンスを生成して処理できるなど、柔軟性に長けています。
手続き型言語とオブジェクト指向言語の概念は相反するものではなく、手続き型言語でもポインタや構造体を駆使し、処理単位を最小化すればオブジェクト指向言語の概念に近づけることはできます。また、オブジェクト指向言語でも1つのクラスメソッドにすべての処理を記述すれば、手続き型言語に近いコードを作成することはできます。
しかし、これでは各概念のメリットを享受することはできません。手続き型言語では処理が分散し、内容が理解しづらくなる程度ですが、オブジェクト指向言語では前述のすべてのメリットを得ることができなくなります。
手続き型言語は細部を組み立てて結果につなげる概念、オブジェクト指向言語は結果を求めるためにシステム全体を大きな括りで考える概念です。そのため、各概念の特長を活かしたシステム設計がメリットを最大限に活かせるのです。
手続き型言語からオブジェクト指向言語へ変換する際、一般的な自動変換ツールはマッピングテーブルを駆使してもプログラム単位にソースコードが変換されるため、システム全体を考慮した変換は行われないと考えて良いでしょう。それゆえ、処理内容が推測しにくい同じ名称のメソッドが複数のクラスに出現してしまう、本来分割するべき処理が手続き型言語と同じように1つのメソッドに順番に記述されてしまうことになります。
正当なクラス設計が行われた結果、インスタンスの生成タイミングや変数のスコープなど、オブジェクト指向言語のメリットがあるわけで、自動変換したプログラムは言語が変わっただけで概念は変わらぬままです。
また、プログラミング言語を変更することでデータ型や内部の演算方法が変わり、実行時非互換が発生する可能性や、メモリ領域管理の違いによりパフォーマンスが低下する恐れがあります。一部の機能ではなく、システム全体を変換する場合には、これが大きな差となって表面化する可能性があります。
手続き型言語の COBOL と オブジェクト指向言語の Java を例に採って代表的な例を挙げてみます。
これを Java で表現するには複数の命令が必要になり、1回の命令では同じように転記はできません。
このような変換前の言語特有の仕様を、変換ツールではどのように扱うのか注意が必要になります。
ソースコードのメンテナンスについても、Java 技術者には馴染みのないコードが出力され、保守性も劣化する恐れがあります。たとえ変換後のクラス図があったとしても、そこから正しいクラス設計を行うには長い時間を要することになります。
ただし、手続き型言語のプログラムでもオブジェクト指向言語を意識した作りになっていれば、それほど困難さはないかもしれません。このためには手続き型言語の全プログラムを精査し、オブジェクト指向言語の変換に適しているか判断する、または事前にオブジェクト指向言語の概念に則した記述に変更するなどの対応が必要になります。
ご参考までに、プログラミング言語別のメリットについては連載コラムの「プログラミング言語の特性を活かした DX」で説明していますので、ぜひご一読ください。
手続き型言語をオブジェクト指向言語へ安価で自動変換してくれる便利なツールが世の中にはたくさんありますが、変換後に「こんなはずではなかった」「ソースのメンテナンスが困難で頓挫した」という声もお聞きします。移行コストを無駄にしないためにも、それぞれの概念を理解し、どのようなリスクが発生するのかを事前に調査して計画することが大切です。
また、連載コラムの「プログラミング言語の特性を活かした DX」に記載していますが、各プログラミング言語には特長があり、オブジェクト指向言語へ変換したからといってすべてが良くなるとは限りません。
プレゼンテーション層では正当に設計されたオブジェクト指向言語を使用してユーザーの満足度を高めるが、計算精度を保持したいビジネスロジックは現状の手続き型言語を使用するなど、プログラミング言語を適材適所で利用することが、結果として低リスクで DX を成功に導くことになります。
マイクロフォーカスでは、COBOL、PL/I 言語、IBM メインフレームの JCL、CICS、IMS をオープン環境でも使用できる製品や、COBOL のビジネスロジックをそのまま使用した Web サービス、EJB 連携、マイクロサービスにも利用できるコンテナ型仮想化が実現できる製品をご提供しています。
新しいテクノロジとも連携が可能なマイクロフォーカスのモダナイゼーション支援製品が、DXの一助になれば幸いです。
COBOL, PL/I のモダナイゼーションに関するご相談は下記 URL からお気軽にお問合せください。
【 ご相談受付 】
https://www.amc.rocketsoftware.co.jp/mfproducts/amc_inquiry/
【 営業部へのお問い合わせ 】
https://www.amc.rocketsoftware.co.jp/about/contact/
マイクロフォーカスのCOBOL 製品とは、COBOL 資産のモダナイゼーションを支援する製品群です。主要プラットフォームと最新テクノロジーをサポートしており、既存資産を世界的にデファクトスタンダードと認識されているMF-COBOLベースのCOBOL資産に移行できるというだけでなく、Java、.NET、Webサービスなどの最新テクノロジーと連携させ、低コスト低リスクで、ビジネスの変化に迅速に対応するシステム構築が可能です。
マイクロフォーカスのエンタープライズ製品群は、IBMメインフレーム・アプリケーション向けの開発・管理機能を提供します。
メインフレームクロス開発やリホストを可能にし、IBMメインフレーム・アプリケーションのモダナイゼーションを支援します。