はじめに
基本情報技術者試験の午後問題で、かつてCOBOLが選択できたことをご存知でしょうか?
私は高校1年生の頃、学校の方針でCOBOLを選択して基本情報技術者試験を受験しました。
他の言語よりも受かりやすいからだったか、今後COBOLの技術者が少なくなっていくのでCOBOLを習得しておけば生き残りやすいという戦略だったか忘れたのですが学校の方針でした。
当時はよくわからずCOBOLを勉強していましたが、今振り返ると貴重な経験だったと感じています。
結局高校2年生のときに、C言語で合格した気がします。
C言語を覚えたほうが汎用性があると思ったのか、方針がすぐに変更になりました。
2020年の試験制度改正により、COBOLは選択肢から外れましたが、今回は当時どんな問題が出ていたのか、実際に解きながら振り返ってみたいと思います。
基本情報のCOBOL問題とは
出題形式
午後問題の選択問題として、以下のような言語から1つを選択する形式でした:
- C
- Java
- Python
- アセンブラ言語(CASL II)
- 表計算
- COBOL ← 2020年に廃止
典型的な出題パターン
- 給与計算、売上集計などの業務処理
- ファイルの読み込み・書き込み
- データの集計・並び替え
- PICTURE句の理解
- 制御構造(PERFORM、IF)の理解
問題例:社員給与計算プログラム
基本情報試験風の問題を再現してみました。
問題文
次のCOBOLプログラムは、社員ファイルから基本給を読み込み、残業時間に応じた残業手当を計算して、総支給額を求めるプログラムである。
仕様:
- 基本給に残業手当を加算して総支給額を計算する
- 残業手当 = 残業時間 × 時給(基本給を160時間で割った値)× 1.25
- 総支給額が30万円以上の社員は高給者フラグを立てる
COBOLコード
IDENTIFICATION DIVISION.
PROGRAM-ID. KYUYO-CALC.
DATA DIVISION.
WORKING-STORAGE SECTION.
*> 社員データ
01 SHAIN-REC.
05 SHAIN-ID PIC 9(5).
05 SHAIN-NAME PIC X(20).
05 KIHON-KYU PIC 9(6).
05 ZANGY0-JIKAN PIC 9(3).
*> 計算用ワーク
01 WORK-AREA.
05 JIKYU PIC 9(4).
05 ZANGYO-TEATE PIC 9(6).
05 SO-SHIKYU PIC 9(7).
05 KOKYU-FLG PIC X VALUE SPACE.
88 IS-KOKYU VALUE 'Y'.
PROCEDURE DIVISION.
MAIN-PROC.
*> サンプルデータ設定
MOVE 12345 TO SHAIN-ID.
MOVE "山田太郎" TO SHAIN-NAME.
MOVE 250000 TO KIHON-KYU.
MOVE 20 TO ZANGYO-JIKAN.
*> 時給計算(基本給 ÷ 160)
DIVIDE KIHON-KYU BY 160 GIVING JIKYU.
*> 残業手当計算(残業時間 × 時給 × 1.25)
COMPUTE ZANGYO-TEATE =
ZANGYO-JIKAN * JIKYU * 1.25.
*> 総支給額計算
COMPUTE SO-SHIKYU =
KIHON-KYU + ZANGYO-TEATE.
*> 高給者判定(30万円以上)
IF SO-SHIKYU >= 300000
MOVE 'Y' TO KOKYU-FLG
END-IF.
*> 結果表示
DISPLAY "社員ID: " SHAIN-ID.
DISPLAY "氏名: " SHAIN-NAME.
DISPLAY "基本給: " KIHON-KYU "円".
DISPLAY "時給: " JIKYU "円".
DISPLAY "残業時間: " ZANGYO-JIKAN "時間".
DISPLAY "残業手当: " ZANGYO-TEATE "円".
DISPLAY "総支給額: " SO-SHIKYU "円".
IF IS-KOKYU
DISPLAY "高給者フラグ: ON"
ELSE
DISPLAY "高給者フラグ: OFF"
END-IF.
STOP RUN.
実行結果
社員ID: 12345
氏名: 山田太郎
基本給: 250000円
時給: 1562円
残業時間: 20時間
残業手当: 039050円
総支給額: 0289050円
高給者フラグ: OFF
COBOL特有の構文解説
1. PICTURE句(データ型定義)
05 SHAIN-ID PIC 9(5). *> 5桁の数字
05 SHAIN-NAME PIC X(20). *> 20文字の文字列
05 KIHON-KYU PIC 9(6). *> 6桁の数字
-
9: 数字1桁 -
X: 任意の文字1桁 -
(n): n回繰り返し -
V: 小数点の位置(記憶領域を取らない)
2. レベル番号
01 SHAIN-REC.
05 SHAIN-ID PIC 9(5).
05 SHAIN-NAME PIC X(20).
-
01: 最上位のグループ -
05,10,15...: 下位の項目(数字は階層を表す)
3. 条件名(88レベル)
05 KOKYU-FLG PIC X VALUE SPACE.
88 IS-KOKYU VALUE 'Y'.
これにより IF IS-KOKYU のように自然言語的な記述ができます。
4. COMPUTE文
COMPUTE SO-SHIKYU = KIHON-KYU + ZANGYO-TEATE.
普通の言語の計算式と同じように書けます。
COBOLには他にも ADD, SUBTRACT, MULTIPLY, DIVIDE などの専用文がありますが、COMPUTEの方がシンプルです。
現代の言語で書くとどうなる?
同じ処理をJavaScriptとPythonで書いてみます。
JavaScript版
// 社員データ
const shain = {
id: 12345,
name: "山田太郎",
kihonKyu: 250000,
zangyoJikan: 20
};
// 時給計算
const jikyu = Math.floor(shain.kihonKyu / 160);
// 残業手当計算
const zangyoTeate = Math.floor(shain.zangyoJikan * jikyu * 1.25);
// 総支給額
const soShikyu = shain.kihonKyu + zangyoTeate;
// 高給者判定
const isKokyu = soShikyu >= 300000;
// 結果表示
console.log(`社員ID: ${shain.id}`);
console.log(`氏名: ${shain.name}`);
console.log(`基本給: ${shain.kihonKyu}円`);
console.log(`時給: ${jikyu}円`);
console.log(`残業時間: ${shain.zangyoJikan}時間`);
console.log(`残業手当: ${zangyoTeate}円`);
console.log(`総支給額: ${soShikyu}円`);
console.log(`高給者フラグ: ${isKokyu ? 'ON' : 'OFF'}`);
Python版
# 社員データ
shain = {
'id': 12345,
'name': '山田太郎',
'kihon_kyu': 250000,
'zangyo_jikan': 20
}
# 時給計算
jikyu = shain['kihon_kyu'] // 160
# 残業手当計算
zangyo_teate = int(shain['zangyo_jikan'] * jikyu * 1.25)
# 総支給額
so_shikyu = shain['kihon_kyu'] + zangyo_teate
# 高給者判定
is_kokyu = so_shikyu >= 300000
# 結果表示
print(f"社員ID: {shain['id']}")
print(f"氏名: {shain['name']}")
print(f"基本給: {shain['kihon_kyu']}円")
print(f"時給: {jikyu}円")
print(f"残業時間: {shain['zangyo_jikan']}時間")
print(f"残業手当: {zangyo_teate}円")
print(f"総支給額: {so_shikyu}円")
print(f"高給者フラグ: {'ON' if is_kokyu else 'OFF'}")
比較してわかること
| 項目 | COBOL | JavaScript/Python |
|---|---|---|
| コード量 | 多い(約60行) | 少ない(約20行) |
| 可読性 | 英語っぽい | 簡潔 |
| データ定義 | 明示的(PICTURE句) | 動的型付け |
| 計算処理 | COMPUTE文 | そのまま式 |
| 条件分岐 | IF~END-IF | if~else |
COBOLの特徴
良い点:
- データ型が明示的で分かりやすい
- 英語っぽい構文で「何をしているか」が読み取りやすい
- 業務ロジックに特化した設計
大変な点:
- とにかく冗長(書く量が多い)
- DIVISIONの構造を理解する必要がある
- 現代的な制御構造が使いにくい
現代の言語の特徴
良い点:
- 簡潔に書ける
- モダンな制御構造
- 開発速度が速い
課題:
- データ型が暗黙的(JavaScriptの場合)
- 金融計算では浮動小数点の精度に注意が必要
- ビジネスロジックの表現が直感的でない場合も
基本情報でCOBOLを学ぶ意義
当時の意義
- 業務システムの理解: 金融・流通などの基幹システムで広く使われていた
- 構造化プログラミングの習得: DIVISIONやSECTIONによる構造化
- データ型の理解: PICTURE句による明示的な型定義
今振り返って思うこと
- レガシーシステムへの理解: 今も多くの企業で稼働しているCOBOLシステムの保守には人材が必要
- 言語の歴史: プログラミング言語がどう進化してきたかを知る良い機会
- ビジネスロジックの考え方: 業務処理の基本的な考え方は今も変わらない
最近ではSCSKがCOBOL支援の新会社を設立というニュースもあり、COBOLの知識は思ったより現役かもしれません。
まとめ
COBOLから学べること:
- 明示的なデータ型定義の重要性
- 業務ロジックの構造化
- 可読性とメンテナンス性の考え方
今の視点で見ると:
- 冗長だけど、それが分かりやすさにつながっている面もある
- データ型に厳格なのは、金融システムでは必須
- 「古い = 悪い」ではなく、用途に応じた選択が大切
高校生の頃は「なんで今更COBOL?」と思っていましたが、今となっては貴重な経験でした。レガシーシステムと向き合う機会があれば、この知識が役立つかもしれません。
皆さんも、機会があれば「古い言語」に触れてみてください。意外な発見があるかもしれませんよ。
参考
- IPA 基本情報技術者試験 過去問題
- COBOL支援の新会社設立 - 日本経済新聞
- GnuCOBOL(オープンソースのCOBOLコンパイラ)