シリーズの振り返り

全8回で実装したステップを改めて整理する。

PARTタイトル実装内容
01はじめに正規化の背景・目的・before/after の全体像
02固定形式レイアウト列1〜6 / 7 / 8〜72 / 73〜80 の役割と罠
03行ラベル・コメント削除remove_sequence_numbers / remove_comments / remove_identification_area
04継続行の結合join_continuation_lines — 文字列リテラル継続の引用符処理
05スペース正規化normalize_spaces — 文字列リテラル保護付き間詰め
061行1命令への分割split_to_one_statement — ステートマシン + END-xxx 区切り
07完成コードCobolNormalizer クラス統合・ファイル入出力
08まとめ(本章)活用例・限界・次のステップ

正規化後の活用例

差分比較(git diff)
行ラベルの変化や空白の揺れがなくなり、本当の変更箇所だけが diff に現れる。コードレビューの負担が大幅に減る。
grep による検索
継続行が結合済みなので grep 'MOVE.*TO WS-MSG' が複数行にまたがったコードでも正しくヒットする。
簡易パーサーへの接続
1行1命令形式なら「先頭トークンで命令を分類する」だけのシンプルなパーサーが書ける。PERFORM・CALL・EXEC SQL などを抽出しやすい。
CRUD図・呼び出しグラフの前処理
本シリーズの姉妹シリーズである「COBOL CRUD図生成」「COBOL可視化」の入力として使える。正規化済みソースはパターンマッチの精度を上げる。
Python — 正規化後の簡易命令分類例
from collections import Counter

def classify_statements(normalized_lines: list[str]) -> Counter:
    """正規化済み行から命令の先頭トークンを集計する。"""
    counts = Counter()
    for line in normalized_lines:
        tokens = line.split()
        if tokens:
            counts[tokens[0].upper()] += 1
    return counts

# 使用例
normalizer = CobolNormalizer()
lines = normalizer.normalize(open('SAMPLE.CBL').read())
stats = classify_statements(lines)
for verb, count in stats.most_common(10):
    print(f"{verb:20s} {count}")

本実装の限界

⚠️ 自由形式(Free Format)には対応しない

本実装は固定形式(Fixed Format)専用だ。>>SOURCE FORMAT FREE ディレクティブや コンパイラオプションで自由形式が指定されているソースには適用しないこと。

⚠️ REPLACE 文・COPY 文は展開しない

本実装はテキスト変換のみで COPY ライブラリの展開や REPLACE による置換は行わない。 コピーブックを展開した後のソースに適用するか、別途前処理が必要だ。

⚠️ 特殊方言(IBM COBOL の拡張等)は部分対応

IBM Enterprise COBOL の EXEC SQL ... END-EXEC などの拡張構文は、 ピリオドがない区切りとして一部対応しているが、すべての方言をカバーするわけではない。 対象プロジェクトの方言に応じて _END_SCOPE_PATTERN のキーワードを追加することで対応できる。

次のステップ

正規化は「レガシーCOBOL解析の入口」に過ぎない。正規化済みソースをもとに発展させられる方向をいくつか示す。

  • CRUD図生成 — 正規化済みソースから EXEC SQL ブロックを抽出してテーブルアクセスを可視化する(→ COBOL CRUD図生成シリーズ
  • 呼び出しグラフ(Call Graph)PERFORM 命令を抽出して段落間の呼び出し関係を可視化する(→ Paragraph Call Graph 解説
  • 移行支援スクリプト — 1行1命令形式を入力として Java や Python への変換ルールを適用するトランスパイラの足がかりとして使う
  • 静的解析との連携 — 正規化済みソースを SonarQube などの静的解析ツールに渡す前処理として使う

シリーズ完了

全8回「PythonでCOBOLソースを正規化する — 1行1命令化の実践」シリーズはこれで完結だ。 本実装が読者のレガシー移行・解析プロジェクトの一助になれば幸いだ。 ← シリーズ目次に戻る