OpenCOBOLとPerlを使った汎用機ダウンサイジング
有限会社ランカードコム
峰松 浩樹

概略
自己紹介
ß OpenCOBOLについてß 今までの経緯と現在の状況
ß OpenCOBOLの実際
ß 長崎県版OpenCOBOLß JCLの移植例
ß 長崎県での状況
ß 移植作業例
ß 将来ß

11/04/15

2

自己紹介
ß

所属
Þ

ß

有限会社ランカードコム

所在地
長崎県長崎市扇町３３−４０Þ 東京都新宿区四ッ谷１−１０−２−４０８
Þß

業務内容
Þ

ß

主要顧客
Þ

11/04/15

長崎県にてOSSを活用した業務提案

長崎県庁、他自治体他
3

私
峰松 浩樹
ß Twitter: @minemazß Mail: mine@lancard.com
ß

11/04/15

4

OpenCOBOL
ß

COBOLからC言語への変換とコンパイルß

元開発者は日本人（西田ß

現開発者はRoger While氏ß

現バージョンは OpenCOBOL 1.0

ß

OpenCOBOL 1.1ではncursesを使用した画面制
御機能の拡充とデバッグ機能の強化等

11/04/15

5圭介 氏）

長崎県：今までの経緯
ßß

ß

11/04/15

2008年：長崎県様よりOpenCOBOLを使った移植可能性について調査依頼
2009年：Webアプリとして既存のCOBOLソースを流用できないか調査依頼
2010年：JCL等バッチ処理について本格的な移植ツールの実装
6

実装環境
ß

既存環境：
国産メーカ汎用機
Þ 専用ページプリンタÞ 専用端末エミュレータ
Þ

ß

移行先：
Linuxサーバ数台（業務種類毎に1台ずつ）
Þ 印刷出力はPDFファイルにて生成Þ Webブラウザで（JCL、COBOLプログラムの編集など）端末操作
Þ

11/04/15

7

作業対象
職員総合、財務会計、予算編成の3システム
ß COBOLプログラム
ß

Þ

ß

JCL（ジョブコントロール言語）Þß

合計で約500万行、約1万5千本合計で約100万行、約6500本

帳票レイアウト
職員総合システムで約400本
Þ 他システムは未知数（同数程度、計1200本？）
Þ

11/04/15

8

作業方針
ß

既存のCOBOLソースはなるべく手修正しないÞß

帳票レイアウトは流用するÞß

COBOLはプログラム中にデータレイアウトがハードコードされている（COPYBOOK)

JCLもなるべく変えないÞ

11/04/15

帳票デザインツールの開発や再デザインが大変

データレイアウトはそのまま使用するÞß

COBOLプログラマの工数が不足している

システム運用はお客様が行うため。
9

対応
ß

ß

COBOLプログラムを大規模に書き換える必要があるなら、コンパイラ側を変更するかツールで自動書換する
既存プリンタのエミュレーションを行いPDFファイルに印刷出力する

ß

MySQL,可変長データなどの操作用にCOBOL側を拡張しライブラリにて機能吸収するß

JCLは習得と導入が簡単な他言語へ変換する

11/04/15

10

現在の状況(2011/4/14)
ß

COBOLプログラムÞß

汎用機の特殊な言語方言をOpenCOBOLへ導入

JCL
ソート、マージ、集計、フィルタ処理用ツールはほぼ実装完了。
Þ 並列動作、負荷モニタなど調整中
Þß

帳票レイアウトほぼ完全に再現
Þ PDF生成速度が課題Þ

11/04/15

11

OpenCOBOLの実際
ß

現在のOpenCOBOLの機能はかなり不足している
PIC N項目(NATIONAL項目)が PIC X項目の2倍のbyte数確保してくれる程度のL10N
Þ 半角カナ変数名、漢字変数名には未対応
Þ 印刷出力も単純なラインプリンタのみ対応
Þ 通貨記号に「¥」が使えませんでしたÞ 海外では業務利用例を見かけるが、国内ではORCAでの利用を除けば学習用の位置づけ
Þ

これでは業務に使うのは無理
・・・
11/04/15

12ということで魔改造長崎県版OpenCOBOLßßßßßßßßßßßßßßßßßß

CHARACTER TYPE、COLUMNでの印刷文字種、位置指定機能
DATE IS NATIVE指定時に日付を和暦にて返す機能
COB_DATE環境変数設定時にACCEPT〜FROM DATE等で設定値を返す機能
SPECIAL-NAMESで定義した外部値の取り込みと吐き出し
RETURN-CODEとは独立したSYSTEM-STATUS値
DUMMYファイル機能(/dev/nullのような機能、ISAMでも利用可)
SEQ形式（固定長）ファイルのレコード長、キー長チェック機能
PIC XからPIC NへのMOVE時に半角→全角の自動変換
PIC NへのMOVE時に全角空白での補完
固定長ではなく改行コードをレコード区切りとする可変長入力データ形式対応
SETでのファイル状態のコピー
PIC NにてALL SPACEを指定した場合に全角空白でのフィル
COPY〜REPLACINGでの部分一致置換
半角カナ変数名の使用
データハンドラの外部化によるmysql他データベースとの連携
印刷出力時の行について絶対位置指定 ・印刷出力時に行復帰コードの自動挿入
ファイル名の代わりに URI渡しが可能
etc,
OSSなので改造もやりやすい

11/04/15

13

JCLの移植ßß

特定汎用機メーカーのJCLのOSS実装は無い→動作環境を新規開発するしかないでも新たに処理系作りたくない
お客様の要望により大幅な改造は無理
文がセミコロンで終端していて、
Þ LABEL：で定義されたラベルにGOTOで飛べてÞ 強力な文字列置換機能をもちÞ マルチスレッドで動作してÞ 大文字のキーワードが使えてÞ ヒアドキュメント機能があってÞ プログラマが割と多くてÞ 動作が安定しており実績があって仕様も枯れた言語ÞということでPerlを使うことに勝手に決定
11/04/15

14

JCLの移植例（JCL）	 

JCLでのバッチ処理の記述例	

}\JOR	 	 OUTID=SPR	 OUTDEV=PR/M050/JSTD	 CLASS=A	 	 	 	 	 	 ;	 }

\COMM	 	 月次パラメタＳＴＯＲＥ;	 
\INPUT	 	 	 ACCEPT1,TYPE=DATA,LIST=YES;	 
AIDF0270	 1	 4210918	 	 	 	 	 	 	 	 	 	 	 例月（１）＋△＋支給日	 
AIDF0271	 4210822	 4210918	 	 	 	 	 償還完了者リスト抽出期間（自〜至）	 
********	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ＊前回支給日の翌日〜今回支給日	 
\ENDINPUT;	 }
}
}
}
}
}
}
}
}
}
}

11/04/15\CREATESEQ	 	 	 	 	 	 	 INFILE=(ACCEPT1	 FILESTAT=SYSIN	 )	 	 	 	 OUTFILE=(AID.F089K	 RECSIZE=80	 BLOCKSZ=11440	 RECFORM=FB	 BPB=4);	 
\COMM	 	 引去金ファイル作成;	 
AIDM2510:\STEP	 	 	 AIDM2510	 FILE=AIA.IL1	 DUMP=DATA;	 	 	 	 	 	 	 	 	 	 \ASSIGN	 AIDF0010	 AID.F101	 	 	 	 SHARE=ALL	 HOLDMODE=NO;	 

15JCLの移植例（perl）}#!/usr/bin/perl	 
use	 strict;	 
use	 warnings;	 
use	 JCL;	 }

JOR	 	 "OUTID=SPR	 OUTDEV=PR/M050/JSTD	 CLASS=A	 	 	 	 	 	 ";	 }
}}

perlでのバッチ処理の記述例		 }
}
}
}
}
}
}
}
}
}
}
}
}

11/04/15

COMM	 	 "月次パラメタＳＴＯＲＥ";	 
INPUT	 	 	 "ACCEPT1,TYPE=DATA,LIST=YES",<<̲EOT;	 
AIDF0270	 1	 4210918	 	 	 	 	 	 	 	 	 	 	 例月（１）＋△＋支給日	 
AIDF0271	 4210822	 4210918	 	 	 	 	 償還完了者リスト抽出期間（自〜至）	 
********	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ＊前回支給日の翌日〜今回支給日	 
̲EOT	 
ENDINPUT;	 
CREATESEQ	 	 	 	 	 	 	 "INFILE=(ACCEPT1	 FILESTAT=SYSIN	 )",	 	 	 	 "OUTFILE=(AID.F089K	 RECSIZE=80	 BLOCKSZ=11440	 RECFORM=FB	 BPB=4)";	 
COMM	 	 "引去金ファイル作成";	 
AIDM2510:	 STEP	 	 	 "AIDM2510	 FILE=AIA.IL1	 DUMP=DATA";	 	 	 	 	 	 	 	 	 	 CASSIGN	 "AIDF0010	 AID.F101	 	 	 	 SHARE=ALL	 HOLDMODE=NO";	 

16長崎県での状況
ß

プロジェクトはredmineで管理ß

プロジェクトのソース、バイナリはsvnで配布

ß

長崎県職員と複数の業者メンバーが参加ßß

11/04/15

CentOS5+perl+OpenCOBOL+mysqlなので各社内でコンパイル、実行、帳票デザインが可能になった
OSSで全体的な開発コストが低下
17

移植作業
ß

COBOLソースの変換とコンパイル$	 acos2oc.pl	 COBFILE.txt	 ß

JCLの変換$	 JCL2perl.pl	 JCLFILE.txt	 >	 JCLFILE.jcl	 

ß

帳票レイアウトファイルの変換$	 cp	 FORMFILE.txt	 form/FORMFILE.form	 

11/04/15

18

実演
ß

11/04/15

19

将来
ß

ファイル名をURI渡し出来るように改造
mysql://servername/db?table= (実装済）Þ memcached://resource (実装中)Þ hdfs://resource (実装中)Þ 等 各種データ形式を直接操作Þ

11/04/15

Þ

C言語以外のソースへの変換（Perl, Scala 等）Þ等々20