シリーズの振り返り
全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 — 文字列リテラル保護付き間詰め |
| 06 | 1行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可視化」の入力として使える。正規化済みソースはパターンマッチの精度を上げる。
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命令化の実践」シリーズはこれで完結だ。 本実装が読者のレガシー移行・解析プロジェクトの一助になれば幸いだ。 ← シリーズ目次に戻る