【第3回】Python使いのためのCOBOL活用法

SCROLL DOWN

リストへ戻る

本コラムでは、Python使いであるあなたのために、そのスキルをさらに拡大する方法について述べたいと思います。

今や Pythonは、統計によっては Javaを凌駕するプログラマ人口を誇るようになり、各種転職サイトによる調査でも求人条件として上位に位置付けられているプログラミング言語です。Pythonは汎用のプログラミング言語であり、Javaと同様に Webアプリ、サービス開発をはじめ、様々なシステム開発で利用されていますが、昨今ではAI開発の分野での利用が拡大しています。

 

さて、ここで既出のコラム「プログラミング言語の特性を活かした DX」を未読の方はぜひご一読いただければと思いますが、ここでその要点を述べさせていただきます。

企業の基幹業務を長年支えてきた COBOLには、多くのノウハウと実績が蓄積されています。DXの推進にあたり、この価値ある既存資産を捨ててしまうのは非常にもったいないことです。例えば、DXに伴いインフラを、あなたが開発しているPythonを基盤としたクラウド環境に移行したとしても、COBOL の既存資産を活用することができるのです。

ここでご注意いただきたいのは、あなたは Pythonに加えて COBOLを追加で習得しなければならないわけではないということです。再利用したい COBOLロジックの入出力仕様さえわかっていればその中身はブラックボックスで構いません。何しろそのロジックは長年にわたって実業務をこなし続けてきた実績のあるものです。ロジック自体は改めてテストを行う必要すらないとも言えます。

 

 

Python/COBOL連携のユースケース

では、具体的にどのようなユースケースが考えられるでしょうか。おそらくは、筆者も想像できないようなものがたくさんあるはずですが、思いつく限り挙げてみましょう。

 

Pythonで開発した Webアプリからの有効活用

メインフレームから、クラウド上に配備された JBossのような Javaアプリケーションサーバーにリプラットフォームする際に、既存COBOL資産を有効活用する手法は、過去20年以上に渡って多数の実績があります。現在では Pythonも Webアプリケーション開発の主流言語ですから、それと同じことができれば重要な選択肢となります。

 

自動車保険の料率計算はその典型例です。契約成立した保険証書の発行・登録は多くの場合メインフレーム上のバッチ処理で行われます。一方、価格比較サイトに試算結果を提出する処理は Webサービスとして提供されます。この両者に含まれる料率計算処理は本来同じことをやっていますから、後者の中でも前者の中で使用されている COBOLロジックをそのまま使うべきです。COBOLで書かれて実績のあるロジックを Pythonで書いた Webアプリケーション・Webサービスから利用しない手はありません。

 

なお、Pythonの Webアプリケーション開発ライブラリには Javaで提供されている分散トランザクション (XA/JTA) のようなものは標準では存在しません。自前でプログラミングすればできないことは無いようですが現実的ではありません。このため、オンライン勘定系のような業務では Javaの方に優位性があります。情報系、参照系での利用が主となると考えられます。

 

Pythonを使った AI/データサイエンス処理での活用

Pythonでは、機械学習、画像処理、自然言語処理などの AI、データサイエンス分野で利用できるライブラリが豊富に用意されており、この分野での開発者にとっての代表的なプログラミング言語となっています。

 

AIは、これまで人間の知恵・経験に頼る必要があった作業を自動化しますが、このほかに従来型のコンピュータプログラミングで処理されていた業務を代替する利用形態もあります。その一つが年金数理、生保数理、損保数理などのアクチュアリー技術です。

アクチュアリーの伝統的な数理技術が、AIやビッグデータのデータサイエンスに置き換えられるのかという論点は、近年とても議論が盛り上がっているテーマですが、現在のところ、「置き換わることは無く、補完するもの」との共通認識があるようです。このため、長年 COBOLで記述された金融数理技術は今でも利用され続けており、中にはブラックボックス化していても問題なく業務を遂行し続けているものもあるそうです。一方、経験値分析を伴う業務では従来型の数理技術が AIのモデルに置き換わり、低コスト・高精度な結果を出すように変わってきています。

ここから先は門外漢である筆者にはわかりませんが、今なお利用されている COBOLの数理ロジックは、関連業務の AI処理の中で有効活用できないでしょうか。もしあなたが金融数理の Python使いでしたら、ぜひご検討ください。

 

Pythonを使った業務自動化 (RPA代替) での活用

Pythonは「業務自動化」と呼ばれる分野で利用できるライブラリが多数提供されています。これは Excelのようなデスクトップアプリケーションの手操作を自動化するもので、人手で行われている定型業務を自動化することによる人件費抑制、ヒューマンエラーの回避を狙うものです。

企業内には、歴史的な理由から、部分的に古いデスクトップ・Webアプリケーションが統合されずに個別に残ってしまっていることがあります。これらを自動連携させて統合するという目的で Pythonが使われています。

 

一例を挙げてみます。夜間バッチ処理の入力ファイルには業務時間内に様々な経路でデータが集積されます。そんな中に上記のような古いデスクトップアプリケーションが含まれていることがあります。これを使用したデータ投入を自動化する際に、夜間バッチで行われるデータクレンジング処理の COBOLロジックを再利用して、不正データを即時検出することが可能となります。

 

 

Python/COBOL連携の要素技術

それでは、Pythonから COBOLロジックを呼び出すには、具体的にどう言った方法があるのでしょうか。以下にそれを実現する要素技術を解説します。

 

Python/COBOL連携には以下の4つの選択肢があります。

  • Jpype を使った JVM COBOLプログラムの呼び出し
  • Requestsライブラリを使った COBOL RESTfulサービス呼び出し
  • Subprocess.run() を使った COBOLプロセス起動
  • Pythonと COBOLとのデータ共有

 

以下、この四つについて実際の Pythonプログラミングを見てみましょう。

 

Jpype を使った JVM COBOLプログラムの呼び出し

Visual COBOLは COBOLソースコードを JVM上で稼働する Javaバイトコードにコンパイルする機能があります。一方 Pythonには Javaクラスを利用するためのライブラリが複数存在しますので、これを利用して Pythonから COBOLロジックを呼び出すことができます。

以下に例題を示します。

 

以下の COBOLロジックを考えてみます。

 IDENTIFICATION DIVISION.
 PROGRAM-ID.  SayHello.
 DATA DIVISION.
 LINKAGE SECTION.
 01  YOURNAME  PIC X(10).
 01  HELLO  PIC X(30).
 PROCEDURE DIVISION USING BY VALUE YOURNAME RETURNING HELLO.
   STRING ‘こんにちは ‘   DELIMITED BY SIZE
      YOURNAME   DELIMITED BY SPACE
      ‘ さん!’   DELIMITED BY SIZE
      INTO HELLO.
   GOBACK.

 

これは、名前を入力して「こんにちは … さん!」というあいさつを返却する COBOLロジックです。要素技術の実現方法を示すことが目的ですからこのような簡単なものを題材としますが、これが可能であれば原理的にはどのように複雑なものでも可能となります。

これを Javaバイトコードにコンパイルして JARを生成します。

C:\work>cobol SayHello.cbl jvmgen ilnamespace(com.AMCSamcsoftware);
Rocket (R) COBOL
Version 11.0 (C) 1984-2025 Rocket Software, Inc. or its affiliates.
* チェック終了:エラーはありません

C:\work>jar cvf sayhello.jar -C . com
マニフェストが追加されました
com/を追加中です(入=0)(出=0)(0%格納されました)
com/AMCSamcsoftware/を追加中です(入=0)(出=0)(0%格納されました)
com/AMCSamcsoftware/SayHello$_MF_LCTYPE_1.classを追加中です(入=345)(出=253)(26%収縮されました)
com/AMCSamcsoftware/SayHello.classを追加中です(入=2862)(出=1341)(53%収縮されました)

 

C:\work>

 

この結果、COBOLロジックは sayhello.jarにパッケージ化された com. AMCSamcsoftware.SayHelloというクラスの SayHelloというメソッドとしてコンパイルされました。

これを呼び出す Pythonコードは以下のようになります。

import jpype
jpype.startJVM()
from jpype import JClass
SayHello = JClass(“com. AMCSamcsoftware.SayHello”)

name = input(“名前を入力してください : “)
print(SayHello().SayHello(name))

 

jpype.shutdownJVM()

 

ここでは Jpypeというライブラリを使用し、Pythonランタイム中に JVMをロードし、そこで COBOLプログラムを実行させています。

実行時には CLASSPATH環境変数に先ほどの JARと Visual COBOLのランタイムパッケージである mfcobolrts.jarを追加する必要があります。

C:\work>python CallCOBOL.py
名前を入力してください : 山田太郎
こんにちは 山田太郎 さん!

C:\work>

 

Requestsライブラリを使った COBOL RESTfulサービス呼び出し

Visual COBOLは、COBOLロジックを RESTful Webサービスとして公開し、Web、モバイル端末、IoTなど様々なクライアントから利用可能とする機能を提供しています。これについては、RESTful WebサービスやJCA連携を用いたCOBOL資産の活用で詳しく解説していますのでご一読ください。

Pythonにも Webサービスクライアント機能を提供するライブラリが複数提供されていますので、これを使用して COBOLロジックを呼び出すことができます。以下はRequestライブラリを使用して GETリクエストを送信して JSONレスポンスを受信する例題です。

import requests
url = ‘https://localhost:9003/temppath/BOOKREST/1.0/SEARCHBOOK’
stock = {“LNK_B_STOCKNO”: “5555”}
response = requests.get(url, params=stock)
if response.status_code == 200:
   data = response.json()
   print(data)
else:
   print(f”Error: {response.status_code}”)

 

実に明快で、Pythonの良さが現れていますね。

この方法は、呼び出しにネットワーク通信が生じますので、前述の Jpype利用のようなインプロセスの直接呼出しと比べてコストは高くなります。しかし、Python側は純粋に Pythonの世界で完結しており、JVMや COBOLランタイムなどを必要としません。COBOLロジックはロケットソフトウェア製品が提供するアプリケーションサーバー上で Webサービス展開されており、そのサーバーの担当者が責任もって運用・保守してゆくことができます。

 

Subprocess.run() を使った COBOLプロセス起動

Visual COBOLでは C言語などと同様に COBOLソースプログラムをネイティブの実行形式にコンパイルすることができます。Windowsでは EXE、Linuxでは拡張子なしの実行形式モジュールになります。これを Pythonの subprocess.run() を使用して子プロセス起動することができます。パラメータはコマンド行引数として渡すことができます。この方法は、厳密には言語間連携ではありませんが、Pythonから外側にある IT資産を活用するための一般的な方法です。

 

Pythonと COBOLとのデータ共有

ここまでは Pythonと COBOLとのプログラムロジックの連携について述べてきましたが、最後にデータの共有についても触れておきます。

 

COBOLには埋め込みSQLと言って、COBOL言語中に EXEC SQLと END-EXECとに挟まれた形で SQL文を埋め込む機能があります。これを用いて、流通しているほとんどすべてのリレーショナルデータベース製品にアクセスすることができます。Pythonも様々なライブラリによってこれらのデータベースにアクセスできますので、二つの言語は同じデータベースを共有することができます。

また、COBOLには、索引編成ファイルのような COBOL言語独自のファイル形式があります。Visual COBOLはこれを IBM Informix C-ISAM形式で入出力することができます。Pythonにも pyisamライブラリがあり、この形式のファイルに直接アクセスすることができ、これを共有することができます。

 

また、両言語が共有できるデータとして、テキストファイルもあります。

 

 

まとめ

Pythonを使いこなすあなたは、COBOLを新たに学習しなくても、既存の COBOL資産を活用できます。これは、COBOLの既存資産を捨てて新たに作り直すより、低コスト・低リスクで実現できる DX手法です。

既存資産の価値を最大限に引き出しつつ、新しい技術スタックと共存させるという観点からも、ぜひ一度検討してみてください。

関連情報

【製品紹介】COBOL製品

ロケットソフトウェアのCOBOL製品は、エンタープライズ・アプリケーションの開発、保守、拡張、統合を強力に支援しています。貴重な既存資産を、Java、.NET、Webサービスなどの最新テクノロジーと連携させ、低コスト低リスクで、ビジネスの変化に迅速に対応するシステム構築を支援します。

セミナー:COBOL言語超入門セミナー

これからCOBOL言語を知ろうとするエンジニア向けの入門セミナーです。プロジェクト管理者、システム管理者、マイグレーションエンジニア等の方々を対象に、COBOL言語を使用するシステム開発のための基礎知識を提供します。

【オンライントレーニング】Learn COBOL in 1 Day

COBOLの基礎を短時間で習得できるオンライントレーニングプログラムです。
シミュレーションやクイズを通じて、COBOLに関する強固な基礎知識を身につけることができます。

SNSでシェアする

  • URLをコピーしました