COBOLのサブルーチン活用!初心者でもわかる再利用できる部品の作り方と使い方
生徒
「COBOLって、同じ処理を何度も書かないといけないんですか?」
先生
「いいえ。COBOLではサブルーチンという仕組みを使えば、同じ処理を何度も使い回すことができますよ。」
生徒
「それって便利そうですね。どんなふうに使うんですか?」
先生
「それでは、実際にサブルーチンを使ったCOBOLプログラムの例を見ながら学んでいきましょう。」
1. サブルーチンとは?再利用できる「部品」のこと
サブルーチンとは、COBOL(コボル)でよく使う処理をひとまとまりにして、あとから何度でも呼び出せるようにした再利用可能な部品のことです。
たとえば、「2つの数字を足し算する処理」があるとします。この処理をサブルーチンとして書いておけば、何度でも呼び出して使うことができます。
COBOLではCALLという命令を使って、この部品(サブルーチン)を呼び出します。
パソコンを使ったことがない方でも大丈夫です。たとえるなら、料理で「ごはんを炊く手順」を何度も使うようなもので、レシピをまとめておいて必要なときに使うイメージです。
2. なぜサブルーチンを使うの?
サブルーチンを使うと、COBOLプログラムの次のような良いことがあります。
- 同じ処理を何回も書かなくていい(コピー&ペーストしなくてすむ)
- 修正が1か所だけで済む(エラーの修正が簡単)
- プログラムが見やすくなる(整理されて読みやすい)
例えば、誕生日から年齢を計算する処理を部品として作っておけば、他のプログラムでも何度でも使えるようになります。
3. COBOLでサブルーチンを使う方法
COBOLでサブルーチンを使うには、次のような手順でプログラムを分けます。
- 呼び出す側(メインプログラム)
- 呼び出される側(サブルーチンプログラム)
この2つのプログラムをそれぞれ別ファイルにしておきます。そして、CALL命令を使って呼び出します。
GIVINGとは:結果(戻り値)を受け取るときに使う命令です。
USINGとは:引数(入力する値)を渡すときに使う命令です。
4. サブルーチンを使ったCOBOLサンプルプログラム
ここでは、2つの数字を足し算する部品(サブルーチン)を作って、それをメインプログラムから使う例を紹介します。
① メインプログラム(呼び出す側)
IDENTIFICATION DIVISION.
PROGRAM-ID. MAIN-PROGRAM.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-NUM1 PIC 9(4) VALUE 15.
01 WS-NUM2 PIC 9(4) VALUE 25.
01 WS-RESULT PIC 9(5).
PROCEDURE DIVISION.
CALL 'ADD-SUBROUTINE' USING WS-NUM1, WS-NUM2 GIVING WS-RESULT
DISPLAY "足し算の結果は:" WS-RESULT
STOP RUN.
② サブルーチンプログラム(呼び出される側)
IDENTIFICATION DIVISION.
PROGRAM-ID. ADD-SUBROUTINE.
DATA DIVISION.
LINKAGE SECTION.
01 LK-NUM1 PIC 9(4).
01 LK-NUM2 PIC 9(4).
01 LK-RESULT PIC 9(5).
PROCEDURE DIVISION USING LK-NUM1 LK-NUM2 GIVING LK-RESULT.
COMPUTE LK-RESULT = LK-NUM1 + LK-NUM2
GOBACK.
5. 実行結果
足し算の結果は:40
6. サブルーチンをもっと身近な例で説明
パソコンに詳しくなくても、「サブルーチンって何?」という疑問があると思います。
これは、「ボタンを押したら、毎回同じ動きをする」ようなものです。
たとえば、「自動販売機」で「100円入れてコーヒーのボタンを押す」と、同じコーヒーが出てきますよね。この「コーヒーを出す処理」がサブルーチンです。
何回押しても同じ処理がされる。つまり、決まった処理を何度でも使える便利な仕組みというわけです。
7. サブルーチンを使うときのポイント
- 部品ごとにファイルを分けること(整理しやすい)
- 変数の名前を分かりやすく(WS-やLK-などの接頭語を使う)
- GOBACKを使って終了すること(STOP RUNではなくGOBACK)
- 必ずUSING/GIVINGをセットで使うこと
これらのポイントを守ることで、COBOLのサブルーチンが上手に使えるようになります。
8. サブルーチンはどんな場面で使えるの?
COBOLのサブルーチンは、次のようなよく使う処理を部品化しておくと便利です。
- 数字の合計を出す処理
- 日付のフォーマットを変える処理
- 金額の税込価格を計算する処理
- ファイルの中身を1行ずつ読み取る処理
どのプログラムでも共通して必要になるような処理は、サブルーチンにしておくと作業がとてもラクになります。
まとめ
COBOLのサブルーチンは、業務システムの開発においてとても重要な役割を果たす仕組みであり、ひとつひとつの処理を部品として整理し、再利用できる形に整えることで、長い期間運用されるシステムでも安定した保守性と拡張性を保つための中心的な考え方になります。今回の記事全体を振り返ると、同じ処理を繰り返し書かずに済むという単純な便利さだけでなく、修正が必要になった際にも部品化された箇所を直すだけで済み、他のプログラムにまで反映されるという利点が非常に大きく、COBOLのプログラム設計においては欠かすことのできない概念であることがよくわかります。サブルーチンを部品として切り分けていくことで、プログラムは自然と整理され、読みやすさや理解のしやすさも大きく向上し、開発者全体の作業効率にもつながります。 サブルーチンは主にCALL命令で呼び出され、USINGで値を渡し、GIVINGで戻り値を受け取るという明確な仕組みがあるため、どのようなプログラムでも同じ形式で活用することができ、習熟するほど使い方が自然に身につくものです。特にCOBOLでは業務データの計算処理やデータフォーマット変換など、何度も繰り返し利用される処理が多いため、サブルーチン化しておくことで大幅な作業効率の改善が期待できます。 また、日付計算や金額計算のような業務共通部分を部品化して別プログラムとしてまとめておくと、他の開発者でも迷わず利用できるようになり、チーム全体での開発効率が整い、トラブル発生時にも原因が特定しやすくなる特徴があります。サブルーチンという考え方そのものが、プログラムの品質を高める基本的な技術であり、長年使われ続けるCOBOLシステムにおいて特に重要視されてきました。 以下には、今回学んだ内容を簡潔に振り返るためのサンプルコードをまとめておきます。記事中で紹介した構成と同じ形式で記述しているため、復習として読み返したり、自分のアレンジを加えたりしながら練習する材料として活用してください。
サンプルプログラム(まとめ)
IDENTIFICATION DIVISION.
PROGRAM-ID. MAIN-PROGRAM.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-NUM1 PIC 9(4) VALUE 10.
01 WS-NUM2 PIC 9(4) VALUE 20.
01 WS-RESULT PIC 9(5).
PROCEDURE DIVISION.
CALL 'ADD-SUBROUTINE' USING WS-NUM1 WS-NUM2 GIVING WS-RESULT
DISPLAY "合計結果:" WS-RESULT
STOP RUN.
IDENTIFICATION DIVISION.
PROGRAM-ID. ADD-SUBROUTINE.
DATA DIVISION.
LINKAGE SECTION.
01 LK-NUM1 PIC 9(4).
01 LK-NUM2 PIC 9(4).
01 LK-RES PIC 9(5).
PROCEDURE DIVISION USING LK-NUM1 LK-NUM2 GIVING LK-RES.
COMPUTE LK-RES = LK-NUM1 + LK-NUM2
GOBACK.
このサンプルからもわかるように、COBOLのサブルーチンは「呼び出す側」「呼び出される側」を明確に分け、それぞれの役割を意識しながら設計することで、無駄のない整ったプログラムになります。業務の種類が増えるほど共通処理も多くなり、その効果はますます大きく感じられるはずです。サブルーチンを正しく活用することで、長期的に利用されるシステムでも保守性が高まり、変更にも柔軟に対応できる堅牢な構造を保つことができるため、COBOLを扱う上では早いうちから理解を深めておくことがとても大切です。 今後は、足し算以外の計算処理や、フォーマット変換、データのチェック処理なども自分でサブルーチンとして作成し、実際のプログラム内で活用していくことで、より高度なCOBOLスキルへと繋がっていくでしょう。繰り返し練習しながら構造に慣れることで、自然と効率的なプログラム設計ができるようになります。
生徒「サブルーチンって思ったより便利ですね。別のプログラムでも使い回せるのがとても助かります。」
先生「そうでしょう。COBOLでは特に、共通処理を部品化しておくと保守が楽になるから、覚えておくと大きな力になるよ。」
生徒「CALLで呼び出して、USINGとGIVINGで値をやり取りする流れも分かりやすかったです。自分でも作れそうです!」
先生「実際に何度か書いてみると自然と身につくよ。次は日付処理やフォーマット変換もサブルーチン化してみよう。」
生徒「はい!もっと練習して、どんどん作れるようになりたいです。」