はじめに
仕事で手が空いた時間を使用して、今後のことを踏まえ、汎用機のレガシーコードを解析するためのアプリケーション開発を行っていました。少しそれっぽくなってきたので一度ここでまとめようと思います。
背景
携帯、テレビ及びゲーム機開発のようなアーキテクチャが数年に1回必ず変わるような現場では考えにくいかもしれませんが、汎用機を用いて数十年掛けて保守・開発を行う職場という場所が存在します。その際、長年作られてきたプログラムを解析する場合、汎用機が独自に持つGrep等の機能を使用し、各担当が個別に調査を行います。一方、汎用機でGrepを動作させる必要があるため、汎用機の稼働時間中に実行すると負荷を掛ける可能性がある等のリスクが生じます。今回、そのようなリスクを回避するため、汎用機のソースコードを外に吐き出しデータベース化することで、特定断面のソースコードを解析するアプリを開発します。
環境
- Windows2012 R2
- MySQL8.0
- Django
- wsgi
- IIS
- Python
- C#
方法
実際に行っている内容は非常に単純で以下のとおりです。
- 汎用機から独自のソースコードを抽出する(言語:COBOL)
汎用機からソースコードを抽出する方法は処理系に依存すると思いますので割愛しますが、私達のシステムではFTPでの抽出が可能です。その際、FTPのASCIIモードで取得することでEBCDICという形式のソースコードをJIS形式で取得することが可能です(この抽出を毎朝特定のファイルサーバで行うようにスケジュール設定します。)。 - 各ソースコードを解析する(言語:C#)
若干説明が雑ですが、各ファイルを以下の通り定義します。
2-1. 汎用機のソースコードは大きく2種類に分かれます。
・ 汎用機専用バッチファイル(以下「HBF」という。)
Windowsの世界でいう「bat」「powershell」に相当する。バッチのコントロールを行う。
・ COBOLプログラム
汎用機で動作するオンラインシステム及びバッチシステムの実行プログラムを指す。
2-2. 更に、ファイルとして、以下のファイルが存在する
・ レコード定義ファイル(以下「RDF」という。)
私達の汎用機は、固定長ファイル処理系であるため、固定長のレコード定義を行うファイルを指す。
・ シーケンシャルファイル(以下「SAM」という。)
Windowsの世界でいう「テキストファイル」に相当する
・ 汎用機特殊ファイル(以下「VSAM」という。)
Windowsの世界でいうデータベース上のテーブルに相当する
(かなり雑な説明ですが、細かい点は参考等に委ねます。) - 解析結果をDBにインポートする(使用するDB:MySQL)
ソースコード解析をいくつかの観点で行います。以下に示すような何種類かのパターンで正規表現等を駆使し、解析及び抽出を行うことでソースコード及びファイルの依存関係の調査に役立つデータベースを構築します。 - Webアプリとして業務担当に公開する(言語:BootStrap, Django, wsgi, IIS)
DjangoとBootStrapを用いて、社内のプライベートクラウド環境で公開する。仕様については、業務担当が使いやすいようにできる限りオーダーメイドすることとし、公開と開発を繰り返して完成させる。
妥協点
本来、このようなソースコード解析ではlexやyaccを用いて構文解析を行い、その構文解析結果を用いて独自の解析系を作り出すのが一般的のようです。ですが、「私1人で行っている(保守できる範囲に限界がある)」及び「要件としてそこまでの解析を必要としていない(実現したいことは、コンパイラに比べ非常に単純)」という理由で正規表現によるソースコード解析を行っています。更に1ランク上の解析を想定している方は、参考に記載した資料を御確認ください。
参考
○コンパイラ: 作りながら学ぶ
コンパイラ作成の方法がコードとともに説明されており、体系的なコード解析を行うことが可能です。更に一歩進んだ解析を目指す方にはお勧めです。
○スモールコンパイラ の制作で学ぶ プログラムのしくみ
中古本であれば、数百円で購入できます。個人的には構文解析であれば十分この本で役に立つと考えています。難しい内容が非常に直感的で安直に記載されています。
○VSAM ファイルの処理
IBMのページです。VSAMの定義及び処理について記載されています。IBM以外にも各社でほぼ同じような順次、索引付き等のファイルを定義できます。