ゼロから始めるCOBOL・メインフレーム入門

# はじめに

![cobol.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184221/af3fde5b-9278-7236-0a61-c28f364a1b50.png)

COBOL と メインフレーム （IBM Z 中心）の特徴を整理しました。モダナイゼーション等の理解促進になればと思います。間違い等あれば、ご指摘お願いします。

# COBOL 概要

## 概要

COBOL（Common Business Oriented Language）は、ビジネスアプリケーション向けに開発された高級プログラミング言語です。1959 年に誕生し、現在も多くのメインフレームで動作しています。

## 特徴

- ビジネス向けのデータ処理、事務処理システムに最適
- 自然言語に近い文法
- 高い可読性とメンテナビリティ

## 基本的なプログラム

```cobol
IDENTIFICATION DIVISION.
PROGRAM-ID. HelloWorld.
PROCEDURE DIVISION.
DISPLAY 'Hello, World!'.
STOP RUN.
```

# メインフレーム（ホスト）

## 概要

メインフレームは、大規模なデータ処理能力と高い信頼性を持つコンピュータシステムの一種です。主に大企業や政府機関で使用され、トランザクション処理やバッチ処理に優れています。

## 特徴

- 高い信頼性と可用性
- 大規模なデータ処理能力
- 高いセキュリティ
- 多数のユーザーを同時にサポート可能

## 基本的な操作

- コンソールを使用してインタラクティブな作業を行います。
- JCL（Job Control Language）を使ってバッチジョブを実行します。

# IBM Z

## 概要

IBM Z は、IBM が製造するメインフレームのシリーズです。高いパフォーマンスと信頼性を備えており、大規模なトランザクション処理やデータベース管理に適しています。

## 特徴

- 高い処理能力とスケーラビリティ
- 高度なセキュリティ機能
- 最新の技術と互換性

## COBOL と IBM Z の関係

COBOL は、IBM Z 上で動作する主要なプログラミング言語の一つであり、多くのビジネスクリティカルなアプリケーションが COBOL で書かれています。

# JCL (Job Control Language)

## 概要

JCL は、メインフレーム上でバッチジョブを実行するためのスクリプト言語です。JCL は、ジョブの実行方法を指定し、システムリソースの割り当てを管理するために使用されます。メインフレームの環境でプログラムのコンパイル、リンク、実行などを自動化するために広く利用されています。

## 特徴

- シンプルな構造
- 強力なリソース管理
- 条件付き実行
- 高い信頼性と安定性

## JCL の具体例

以下は、JCL の基本的な例です。このスクリプトは、JOB ステートメントでジョブを定義し、EXEC ステートメントでプログラムを実行し、DD ステートメントで必要なデータセットを定義しています。

```jcl
//MYJOB   JOB (ACCOUNT),'MY FIRST JOB',CLASS=A,MSGCLASS=A
//STEP1   EXEC PGM=MYPROGRAM
//INPUT   DD  DSN=MY.INPUT.DATA,DISP=SHR
//OUTPUT  DD  DSN=MY.OUTPUT.DATA,DISP=(NEW,CATLG,DELETE),
//            UNIT=SYSDA,SPACE=(CYL,(10,5)),DCB=(RECFM=FB,LRECL=80)
```

# IMS (Information Management System)

## 概要

IMS は、IBM が提供するハイパフォーマンスなトランザクション処理およびデータベース管理システムです。特に、リアルタイムトランザクション処理に優れています。

## 特徴

- 階層型データベースを使用
- 高速なトランザクション処理
- 高い信頼性と可用性

## 基本的なアーキテクチャ

IMS は、トランザクション管理とデータベース管理の二つのコンポーネントから構成されます。

# CICS (Customer Information Control System)

## 概要

CICS は、オンライントランザクション処理用のシステムです。主にリアルタイムなビジネストランザクションの管理に使用されます。

## 特徴

- 高速なトランザクション処理
- 多くの同時ユーザーをサポート
- 高い可用性と信頼性

## 基本的なアーキテクチャ

CICS は、トランザクション管理、セッション管理、およびリソース管理の機能を提供し、効率的なトランザクション処理を実現します。

# Db2

## 概要

Db2 は、IBM が提供するリレーショナルデータベース管理システム（RDBMS）です。大規模なデータベースを効率的に管理するための機能を備えています。

## 特徴

- 高いスケーラビリティとパフォーマンス
- SQL 標準をサポート
- トランザクションの一貫性と信頼性

## 基本的な操作

- SQL クエリを使用してデータの検索や操作を行います。
- データベース管理ツールを使ってデータベースの設定や監視を行います。

# COBOL 詳細

## プログラムの構成

COBOL プログラムは、大きく 4 つのディビジョンに分かれています。

- IDENTIFICATION DIVISION - プログラムの識別情報を定義します。
- ENVIRONMENT DIVISION - プログラムが動作する環境を定義します。
- DATA DIVISION - プログラムで使用するデータを定義します。
- PROCEDURE DIVISION - 実際の処理手順を記述します。

## 基本的な文法要素

### 1. 変数の定義

#### 基本
COBOL では、変数は DATA DIVISION で定義されます。

```cobol
DATA DIVISION.
WORKING-STORAGE SECTION.
01  WS-NUMBER  PIC 9(5).
01  WS-NAME    PIC A(10).
```

ここで、`PIC`はピクチャ（PICTURE）句で、変数のデータ形式を指定します。9 は数字、A はアルファベットを表します。

#### ピクチャ（PICTURE）句

ピクチャ句はデータ項目の形式を指定します。主に使用される記号は以下の通りです。

X - 任意の文字（アルファベット、数字、記号）
9 - 数字（0-9）
A - アルファベット（A-Z）
V - 小数点の位置（実際には表示されない）
S - 符号（正または負）

```cobol
01  CUSTOMER-NAME      PIC X(30).      * 30文字の文字列
01  CUSTOMER-ID        PIC 9(5).       * 5桁の数字
01  CUSTOMER-BALANCE   PIC S9(6)V99.   * 符号付きの整数部6桁、小数部2桁の数値
```

#### VALUE 句

VALUE 句を使用して、変数の初期値を指定することができます。

```cobol
01  INITIAL-VALUE      PIC 9(4) VALUE 1000.
```

#### 配列（テーブル）項目

COBOL では、配列（テーブル）項目を定義することも可能です。配列項目は「OCCURS」句を使用して定義されます。

```cobol
01  EMPLOYEE-NAMES.
    05  EMP-NAME       PIC X(30) OCCURS 100 TIMES.
```

#### 集団項目

集団項目（構造体のようなもの）は、レベル番号を用いてデータ項目の階層構造を定義します。最上位の項目は通常「01」レベルで始まり、細かいサブ項目は「02」から「49」までのレベル番号を使用して階層を作成します。

```cobol
01  EMPLOYEE-RECORD.
    05  EMPLOYEE-ID      PIC 9(5).
    05  EMPLOYEE-NAME    PIC X(30).
    05  EMPLOYEE-SALARY  PIC 9(7)V99.
```

### 2. 基本的な命令

DISPLAY: 画面に出力する命令です。
ACCEPT: 入力を受け取る命令です。
MOVE: 変数に値を代入する命令です。

```cobol
PROCEDURE DIVISION.
    DISPLAY 'Enter a number: '.
    ACCEPT WS-NUMBER.
    DISPLAY 'You entered: ' WS-NUMBER.
```

### 3. 条件分岐

IF 文を使って条件分岐を行います。

```cobol
PROCEDURE DIVISION.
    IF WS-NUMBER > 100 THEN
        DISPLAY 'Number is greater than 100'
    ELSE
        DISPLAY 'Number is 100 or less'.
```

### 4. ループ

PERFORM 命令を使ってループを行います。

```cobol
PROCEDURE DIVISION.
    PERFORM VARYING WS-COUNT FROM 1 BY 1 UNTIL WS-COUNT > 10
        DISPLAY 'Count: ' WS-COUNT
    END-PERFORM.
```

### 5. COPY

以下に、COPY 句を使った COBOL プログラムの例を示します。

共通データ定義ファイル (COMMONDATA.cpy)

```cobol
01  EMPLOYEE-RECORD.
    05  EMPLOYEE-ID          PIC 9(5).
    05  EMPLOYEE-NAME        PIC A(30).
    05  EMPLOYEE-DEPARTMENT  PIC A(20).
```

メインプログラム (MAINPROG.cbl)

```cobol
IDENTIFICATION DIVISION.
PROGRAM-ID. MAINPROG.

DATA DIVISION.
WORKING-STORAGE SECTION.
COPY COMMONDATA.

PROCEDURE DIVISION.
    DISPLAY 'Employee ID: ' EMPLOYEE-ID.
    DISPLAY 'Employee Name: ' EMPLOYEE-NAME.
    DISPLAY 'Employee Department: ' EMPLOYEE-DEPARTMENT.
    STOP RUN.
```

### 6. CALL

CALL 文を使うことで、外部プログラム（サブプログラム）を呼び出し、必要な処理を行うことができます。

```cobol
CALL 'プログラム名' USING 引数リスト.
```

プログラム名 は呼び出すサブプログラムの名前です。これは通常、コンパイル済みのプログラム名と一致します。
引数リスト は、メインプログラムからサブプログラムに渡す変数のリストです。複数の引数を渡す場合は、スペースで区切ります。
以下に例を示します。

サブプログラム (SUBPROG.cbl)

```cobol
IDENTIFICATION DIVISION.
PROGRAM-ID. SUBPROG.

DATA DIVISION.
LINKAGE SECTION.
01  INPUT-NUMBER     PIC 9(5).
01  OUTPUT-NUMBER    PIC 9(5).

PROCEDURE DIVISION USING INPUT-NUMBER OUTPUT-NUMBER.
    ADD 1 TO INPUT-NUMBER GIVING OUTPUT-NUMBER.
    EXIT PROGRAM.
```

メインプログラム (MAINPROG.cbl)

```cobol
IDENTIFICATION DIVISION.
PROGRAM-ID. MAINPROG.

DATA DIVISION.
WORKING-STORAGE SECTION.
01  WS-INPUT-NUMBER  PIC 9(5) VALUE 10.
01  WS-OUTPUT-NUMBER PIC 9(5).

PROCEDURE DIVISION.
    DISPLAY 'Before CALL: ' WS-INPUT-NUMBER.
    CALL 'SUBPROG' USING WS-INPUT-NUMBER WS-OUTPUT-NUMBER.
    DISPLAY 'After CALL: ' WS-OUTPUT-NUMBER.
    STOP RUN.
```

### 7. その他

#### FILLER

FILLERは、データ項目の間にスペースや未使用の領域を挿入するために使用される特別な予約語です。FILLER項目は名前がなく、参照されることはありません。これは、特定のデータフォーマットやレイアウトを保持するために使われます。

#### BCD（Binary-Coded Decimal 2進化10進数）

BCD（Binary-Coded Decimal）は、各桁を4ビットで表現する10進数形式で、誤差の少ない計算が可能です。COBOL は BCDをネイティブにサポートします。メインフレームの CPU は、BCD 計算専用の命令セットを備え、ハードウェアレベルで BCD 演算を効率的に処理します。これにより、金融等の分野で高速かつ正確な計算を実現します。

#### EBCDIC

EBCDIC（Extended Binary Coded Decimal Interchange Code）は、IBMが開発した文字エンコーディングシステムです。COBOLプログラムは、特にIBMメインフレームで実行される場合、EBCDICエンコーディングを使用することが多いです。EBCDICは、ASCIIとは異なる文字セットを持ち、メインフレーム環境で広く使用されています。

#### 固定長レコード

固定長レコードは、各レコードが同じ長さを持つデータ形式です。これにより、レコードの読み書きが効率化され、特にファイルのランダムアクセスが容易になります。COBOLでは、ファイルセクションでレコードの長さを指定し、固定長レコードとして扱うことができます。

#### INPUT-OUTPUT SECTION

INPUT-OUTPUT SECTIONは、COBOLのファイル操作に関連する設定を行うためのセクションです。このセクションでは、ファイルの割り当てやアクセスモードなどを定義します。通常、環境部（ENVIRONMENT DIVISION）の一部として使用されます。

# まとめ

COBOL と IBM Z は、ビジネスクリティカルなアプリケーションの基盤を支える重要な技術です。Db2、IMS、CICS などの関連システムと組み合わせることで、大規模で信頼性の高いデータ処理環境を構築しています。これらの技術を理解し、活用することで、現代のビジネスニーズに対応する強力なシステムを保守・改善できます。